diff --git a/.gitattributes b/.gitattributes index ff24d55a19a3689314d89004434e8f15ce1ed7f8..628840d6b8c1beac7e85dff91de4e2baf4a57264 100644 --- a/.gitattributes +++ b/.gitattributes @@ -36,16 +36,3 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text products-index.json filter=lfs diff=lfs merge=lfs -text dist/products-gallery.json filter=lfs diff=lfs merge=lfs -text products-gallery.json filter=lfs diff=lfs merge=lfs -text -# The V.AI STUDIO backdrop, copied from vai-avatar's public/avatars/ folder. -# Named explicitly rather than with a *.png pattern: a wildcard would also -# catch the BlurHash and thumbnail PNGs under dist/prodimgs, which are small, -# numerous and regenerated by the catalogue scripts -- routing ~6,400 of them -# through LFS would make every catalogue refresh slow and would balloon the -# repo. Two files, one rule, and the reason is recorded here. -public/brand/vaistudio_center.png filter=lfs diff=lfs merge=lfs -text -dist/brand/vaistudio_center.png filter=lfs diff=lfs merge=lfs -text - -# Social-share thumbnail (generated by scripts/gen-thumbnail.py). Both copies in -# LFS: the hub og:image resolves via resolve/main/dist/share/og-image.png. -public/share/og-image.png filter=lfs diff=lfs merge=lfs -text -dist/share/og-image.png filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 33e06d7ed6098d982e7b6914263dd643d8c9766a..0000000000000000000000000000000000000000 --- a/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -# Dependencies. Only `npm install` output — dist/ and public/catalogue/ are -# deliberately NOT ignored: this is a static Space, so the built bundle and the -# vai-avatar mirror must be committed to be served at all. -node_modules/ -.npm/ - -# Local logs and caches -*.log -.vite/ -.cache/ - -# Python tooling -__pycache__/ -*.py[cod] -.venv/ -venv/ - -# OS noise -.DS_Store -Thumbs.db \ No newline at end of file diff --git a/PLACEHOLDER b/PLACEHOLDER deleted file mode 100644 index ec747fa47ddb81e9bf2d282011ed32aa4c59f932..0000000000000000000000000000000000000000 --- a/PLACEHOLDER +++ /dev/null @@ -1 +0,0 @@ -null \ No newline at end of file diff --git a/README.md b/README.md index 641b1b9ac8466baae131f7da7af923c19d3b7129..1eb00dc29de977db6c02da1b386fd3cab5dcbb65 100644 --- a/README.md +++ b/README.md @@ -1,346 +1,74 @@ --- -title: Thư viện tìm kiếm ảnh theo ngữ nghĩa ngôn ngữ tự nhiên +title: Semantic Image Field — Nội thất emoji: 🛋️ colorFrom: yellow colorTo: red sdk: static pinned: false -short_description: Web App AI thuộc hệ sinh thái VIBE CODE AI của V.AI STUDIO -thumbnail: dist/share/og-image.png +short_description: Tìm ảnh nội thất bằng tiếng Việt, chạy trong máy header: mini tags: - ml-intern --- -# Thư viện tìm kiếm ảnh theo ngữ nghĩa ngôn ngữ tự nhiên +# Semantic Image Field — Nội thất -Web App AI thuộc hệ sinh thái **VIBE CODE AI** của **V.AI STUDIO**. - -Phái sinh từ [`webml-community/semantic-image-field`](https://huggingface.co/spaces/webml-community/semantic-image-field): -thay 24.989 ảnh Unsplash bằng **1.222 ảnh nội thất Việt Nam**, cho phép tìm bằng tiếng Việt. -Danh mục sản phẩm của **vai-avatar** mở trong cùng trình xem ảnh toàn màn hình với ảnh nội thất. - -> **ĐÃ XONG** — danh mục sản phẩm của vai-avatar đã nằm trong photo-viewer và tự đồng bộ. -> Xem [Vì sao trước đây không hoạt động](#vì-sao-trước-đây-không-hoạt-động). - -## Vì sao trước đây không hoạt động - -Ba lỗi chồng nhau, mỗi lỗi một mình đủ để danh mục không bao giờ hiện: - -1. **Space phục vụ một bundle không có code sản phẩm.** `index.html` trỏ tới - `index-CigEzVrZ.js` — build từ cây source chưa hề có module catalogue - (`grep Malloca` trong bundle đó = 0 hit). Dù mirror có dữ liệu thì cũng vô ích. -2. **`candidateURLs()` bị Vite phá hủy âm thầm.** `new URL(`../../${path}`, - import.meta.url)` bị Vite hiểu thành glob asset và thay bằng map index theo - chuỗi literal `../../${path}` (còn nguyên `${}`) → không khớp key nào → - `undefined` → mọi candidate đều 404 **dù file mirror có thật**. Cùng lúc đó - build kéo README.md, package-lock.json và `products-gallery.json` (11 MB) vào - `dist/assets`. Đã sửa: base truyền vào `new URL` dạng biến, nên không còn bị đụng. -3. **Mirror rỗng và không có gì viết nó.** `public/catalogue/` và `dist/catalogue/` - chưa từng được commit. Người duy nhất viết là reconciler trong Space - vai-avatar, mà Space đó không có secret nào nên tự tắt (`no HF_TOKEN -> mirror OFF`). - -## Đồng bộ bây giờ không cần token - -`fetchJSON()` đọc **thẳng dataset** mà vai-avatar ghi và mirror chỉ còn là fallback -same-origin. Lý do: huggingface.co giờ phản chiếu `Origin` của caller trong -`Access-Control-Allow-Origin`, trên **cả** hop `/resolve` lẫn hop `/api/resolve-cache` -mà nó redirect tới — nên Space đọc được cross-origin mà không cần token. - -Nhờ vậy thêm / sửa / xóa trên vai-avatar hiện lên đây trong **30 giây** (`POLL_MS`), -không cần ai commit, không rebuild Space, không cần secret. Mirror vẫn được thử và -vẫn là nguồn dự phòng: Hub lỗi thì vẫn có catalogue, chứ không trắng shop. - -## Trạng thái - -| Việc | Trạng thái | -| --- | --- | -| Danh mục hiện trong photo-viewer | ✅ 75 sản phẩm, mở ảnh + phân trang + giá + specs | -| Bundle đúng source hiện tại | ✅ `dist/assets/index.js` + `worker-CYIRI7QN.js` | -| `candidateURLs()` sau build | ✅ còn nguyên, không bị Vite glob | -| Bundle không kéo file rác | ✅ `grep 'Object.assign({"'` = 0 | -| `public/catalogue/` + `dist/catalogue/` | ✅ 69 products + 58 productEdits | -| Đọc dataset trực tiếp (không cần token) | ✅ đã build + kiểm chứng bằng browser thật | -| Thêm / Sửa / Xóa đồng bộ | ✅ trong 30s, không cần commit | -| Mirror tự cập nhật trong repo | ⚪ tuỳ chọn — cần secret `HF_TOKEN` ở vai-avatar | -| Token `HF_TOKEN` trong vai-avatar | ❌ chưa có — Space hiện đang chạy không cần nó | -| Token `HF_TOKEN` trong vai-avatar | ❓ **chưa kiểm — cần đọc log container** | - -**Còn hai việc, đúng thứ tự. Không mục nào cần credits:** - -1. **Kiểm tra `HF_TOKEN`** trong vai-avatar (10 giây) -2. **Chạy `npm run refresh:catalogue`** (~3 phút) - -PR #1 đã đóng do merge conflict; [PR #2](https://huggingface.co/spaces/bep40/vai-avatar/discussions/2) -là bản thay thế, đã merge. - -## Ghi chú vận hành - -### 1. Kiểm tra token - -```sh -curl -s -H "Authorization: Bearer $HF_TOKEN" \ - https://huggingface.co/api/spaces/bep40/vai-avatar/secrets | jq keys -``` - -Chỉ trả **tên** secret. Không thấy `HF_TOKEN` thì thêm vào -[settings](https://huggingface.co/spaces/bep40/vai-avatar/settings), **không cần sửa mã**. - -**Vì sao đây là nghi phạm số một:** cả hai dataset đều **public**, nên `readDataset()` chạy -được không cần token. Nhưng `commitMirror()` **bắt buộc** có token. Thiếu token thì cả vòng -reconcile `return` sớm ở dòng đầu, **không in gì**. Đúng triệu chứng "im lặng" đang thấy. - -Nếu token đã có mà vẫn im lặng, xem tab **Logs** trên trang Space của vai-avatar: - -| Log | Nghĩa là | Hành động | -| --- | --- | --- | -| **Không có** dòng `[catalogue-mirror-boot]` | Wrapper chưa chạy | Báo lại, đây là lỗi thật | -| `could not load catalogue-mirror.ts` | Lỗi cú pháp | Báo lại kèm log | -| `reconciler RUNNING … token=NO` | Thiếu token | Thêm `HF_TOKEN` rồi restart | -| `SYNCED …` | Mirror đã ghi | Chờ ~2 phút rồi làm bước 2 | -| Vòng 2+ im lặng | Đúng, không có gì đổi | Không làm gì | -| `SYNCED` **lặp mỗi vòng** | Rebuild loop | **Dừng ngay** | -| `commit rejected HTTP 403` | Token thiếu quyền sang repo khác | Thêm quyền, không phải lỗi mã | - -### 2. Build lại bundle - -```sh -git clone https://huggingface.co/spaces/bep40/semantic-image-field -cd semantic-image-field -npm install -npm run refresh:catalogue -``` - -~3 phút, miễn phí. `refresh:catalogue` = sync → guard → build → verify `dist/catalogue` → -repoint `index.html` → commit → push. - -**Đừng dùng `npm run seed:catalogue`** — nó chỉ tải JSON, **không build**. Chạy nó sẽ cho -sản phẩm hiện lên mà vẫn lỗi đồng bộ, tức kết quả tệ hơn hiện tại vì trông như đã xong. - -**Vì sao bước này là quyết định:** `dist/assets/` hiện chỉ có bundle **có hash** -(`index-CigEzVrZ.js`). `vite.config.js` đặt `entryFileNames: 'assets/index.js'` — tên không -hash — nên `vite build` **chưa từng chạy** kể từ khi cấu hình đó được đặt. Sáu bản vá trong -`src/` **đã** trên `main` nhưng **chưa** nằm trong bundle đang chạy. - -## Một cảnh báo về cách kiểm - -`list` với **đường dẫn tới một file** trả `File not found` dù file đó có thật. Phải `list` -**thư mục cha** rồi đọc danh sách. - -Cụ thể: `dist/assets/index-CigEzVrZ.js` trả `File not found`, nhưng `list dist/assets` -liệt kê đúng file đó (263.4 KB). Tin `File not found` thì kết luận sai là bundle đã mất -và Space trắng trang — trong khi nó vẫn chạy. - -Với **thư mục** thì `list` đáng tin: `dist/catalogue` báo not-found và `list` xác nhận nó -thật sự không tồn tại. - -## Token: đọc ở đâu cho đúng - -`startCatalogueMirrorReconciler()` in sẵn trạng thái token lúc khởi động: - -``` -[catalogue-mirror] reconciler RUNNING | target=bep40/semantic-image-field@main - | every 120s | token=yes -``` - -**Không cần** gọi `/api/share-persist`. Route đó được `applyPatches()` tiêm *có điều kiện* -vào `index.ts` lúc chạy, chỉ khi thấy anchor `'"/*": { GET: serveStatic },'` và -`tryWriteIndex()` qua kiểm tra cú pháp. Thiếu anchor là 404 — **tương thích với việc token -có tồn tại**, nên 404 không nói được gì về token. - -Dòng "Space này hiện CHƯA có `HF_TOKEN`" trong `boot.ts` là lời tuyên bố trong source, có -thể đã cũ. Nguồn đúng là log container. - -## Vì sao hai nguồn vẫn ra một sản phẩm - -Một máy giặt Hitachi nằm ở **cả hai** nguồn, hai nguồn gọi nó bằng hai tên khác nhau — -đọc trực tiếp từ Hub, không phỏng đoán: - -| | `products_url_added.json` | `promos.json` | -| --- | --- | --- | -| key / `sku` / `model` | `BD-1054HVOW` | `357869` | -| `slug` | `bd-1054hvow-may-giat-…` | `357869-may-giat-…` | -| **`name` / `n`** | **`Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW`** | **giống hệt** | -| giá | `pn` = 5.990.000 | `priceNum` = 6.490.000 | - -`sku` và `slug` **không** khớp, nhưng `name` giống nhau và `identityAliases()` đã lấy -`name` làm bí danh — nên hai bản ghi là **một** sản phẩm, và giá 6.490.000 nhập đè lên bản -ghi gốc. - -**Đã cân nhắc và loại bỏ một cách khắc phục khác.** Con số `357869` chỉ nằm trong URL ảnh, -không field nào chứa nó, nên đào URL để ghép cứng là cách sửa hiện trường. Không dùng: ghép -cứng theo id trong URL có thể hợp nhất nhầm hai sản phẩm, mà lỗi đó cho ra một bản ghi -*trông vẫn đầy đủ* — khó phát hiện hơn nhiều so với một thẻ bị lặp. - -Bí danh theo `name` vẫn an toàn: bí danh mà hai sản phẩm cùng nhận bị loại như mơ hồ. - -## Nguồn dữ liệu sản phẩm - -| Thao tác trên vai-avatar | Nguồn | Nội dung | -| --- | --- | --- | -| Thêm SP | `bep40/grob-products-updated/products_url_added.json` | `n`, `imgs`, `p`, `pn`, `specs`, `feats` | -| Thêm / Sửa / Xóa SP | `bep40/vaistudio-data/promos.json` → `productEdits[sku]` | `{ name, priceNum, images }` hoặc `{ deleted: true }` | - -**Xóa là bia mộ**, không phải xoá bản ghi. `buildCatalogue` bỏ qua bản ghi có `deleted`, đúng -như `getAddedProducts()` / `isDeleted()` của vai-avatar. Nếu không, sản phẩm đã xoá hiện -vĩnh viễn. - -**Phạm vi hẹp:** hai file này là bản *thêm / sửa / xoá*, không phải catalogue đầy đủ. -Catalogue gốc Malloca ~6.000 sản phẩm nằm trong Parquet và không được nhân bản. Sửa một SKU -thuộc catalogue gốc sẽ không có bản ghi để áp overlay. - -Xếp hạng dùng từ khoá, không dùng ma trận CLIP đã nướng: sản phẩm vừa thêm là tìm được -ngay ở truy vấn kế tiếp, không phải chờ mã hoá lại toàn bộ ảnh. - -## Sáu lỗi đồng bộ đã sửa - -Cả sáu đều **fail im lặng**, và cả sáu triệu chứng đều đọc ra giống nhau là "sửa sp không -đồng bộ". - -**Trong `src/catalogue.js`:** - -1. **Hai nguồn không thống nhất danh tính.** Ghép mỗi file theo field riêng sẽ liệt kê máy - giặt hai lần và mọi "Sửa SP" sẽ vô hình. Nay mỗi bản ghi nhận diện qua tập bí danh. -2. **"Xóa SP" im lặng không làm gì.** vai-avatar ghi bản sửa ở - `productEdits[p.sku || p.model]` — key của object là định danh chính, không phải dự - phòng. Trước đây chỉ field *bên trong* bản sửa được dùng để tra; một bia mộ không mang - field nào nên danh sách rỗng, key trần biến thành mục mới, bản ghi thật không bao giờ bị - đánh dấu, và sản phẩm cứ ở lại mãi. Nay key cũng được tra qua bảng bí danh. -3. **Bản sửa có nhưng không thấy.** Bộ đọc ưu tiên field ngắn của scraper, nên `priceNum` mới - bị `p` cũ che mất. `EDIT_SUPERSEDES` xoá bản ghi cũ trước khi bản sửa nhập. -4. **Overlay rỗng hồi sinh sản phẩm đã xoá.** `promos.json` mang mọi Sửa và mọi Xóa. Trả - `{}` khi đọc lỗi không chỉ mất sửa đổi mà còn hồi sinh sản phẩm đã xoá và hoàn nguyên mọi - giá — **không báo lỗi**, vì kết quả vẫn hợp lệ nên `tryLoadCatalogue()` báo thành công - và vòng poll 90 giây thay dữ liệu bị hoàn nguyên vào như một bản cập nhật thật. Nay dùng - overlay hợp lệ gần nhất. -5. **`sync-catalogue.mjs` báo thành công khi mirror đang lẫn.** Một nguồn fetch lỗi thì file - đó giữ bản commit trước, `refresh-catalogue.mjs` vẫn pass các guard, build, commit, in - `REFRESH_OK` — và `products.json` mới nằm cạnh `promos.json` cũ, nên mọi Sửa và Xóa ngừng - áp dụng mà không báo lỗi. Nay bất kỳ nguồn nào lỗi thì cả lần chạy fail, caller dừng - trước build. -6. **Reconciler có thể rơi vào vòng rebuild vô tận.** `readTarget()` đọc qua `/resolve/`, có - cache CDN: ngay sau khi commit thành công, endpoint vẫn trả nội dung cũ. Check "diff - trước khi commit" thấy lệch nên commit lại **byte giống hệt**, mỗi commit lại rebuild - Space target. Chính cái check sinh ra để chặn rebuild loop là đường đi vào nó. Nay commit - do chính process đó nhận 200 được lưu lại và thắng đọc cache (C7). Đánh đổi có chủ đích: - sửa tay mirror dưới lúc container chạy sẽ không được tự vá tới khi restart. - -## Một sửa chữa đã âm thầm - -Wrapper ban đầu viết static import ở dòng 1. ESM **hoist** static import: nó nạp và đánh giá -*trước* mọi câu lệnh trong file. Nên nếu `catalogue-mirror.ts` lỗi cú pháp, cả wrapper chết -trước khi reconciler kịp chạy → CMD rơi về `bun boot.ts` → **site lên, share-link chạy, -chỉ catalogue-mirror tắt, không một dòng log nào**. Người đọc log tưởng PR chưa merge. - -Đã đổi sang dynamic `import()` bọc `try/catch`, thêm hai dòng log tường minh: `reconciler -STARTED` khi bật được, `could not load …` khi lỗi. **Mirror lỗi còn hơn mirror vô hình.** - -## Vì sao vẫn giữ mirror, dù giờ đã đọc dataset được - -**Cách đọc đã đổi, và đo lại thay vì tin tài liệu cũ.** Trước đây Hub gửi -`Access-Control-Allow-Origin: https://huggingface.co` cho file dataset và `/resolve` -redirect sang host CDN với chính sách riêng — origin của Space không thuộc về cả hai -nên fetch chết. **Điều đó không còn đúng:** Hub nay phản chiếu `Origin` của caller -trong ACAO, trên *cả* hop `/resolve` lẫn hop `/api/resolve-cache`, và kể cả -`Origin: null`. Nên `fetchJSON()` đọc thẳng dataset trước, không cần token. - -Mirror **không bị bỏ**: nó là đường dự phòng same-origin, nên khi Hub/CDN giật -(`5xx`, mạng chết, offline) catalogue vẫn còn thay vì trắng shop. Thứ tự thử là -dataset → mirror, và mọi candidate đều phải **parse được + đúng shape** mới được -nhận, nên một body HTML lỗi hay bị cắt cụt không bao giờ bị coi là catalogue. - -## Đồng bộ tự động — không cần writer - -Space này là `sdk: static`: không có server, không thể tự đẩy dữ liệu, cũng không thể ghi bất -cứ thứ gì. `bep40/vai-avatar` thì có server, có sẵn reconciler 20 giây cho link chia sẻ -(nguồn: `boot.ts`) và self-test tự chứng minh đường ghi Hub dùng được. Mở rộng cơ chế có -sẵn rẻ hơn nhiều so với tạo cron mới — cron tốn credits ngay cả lúc tạo, đã kiểm chứng: -`POST /api/scheduled-jobs/…` trả `402`. - -[PR #2](https://huggingface.co/spaces/bep40/vai-avatar/discussions/2) đã merge vào `main` của -vai-avatar. Nó thêm `catalogue-mirror.ts` + `catalogue-mirror-boot.ts` + sửa `Dockerfile`. -Wrapper chỉ start reconciler rồi `import("./boot.ts")` nên **`boot.ts` không bị sửa**. Chuỗi -CMD 3 tầng: - -``` -bun catalogue-mirror-boot.ts || bun boot.ts || bun entry_ai_image.ts -``` - -Reconciler đọc hai nguồn mỗi 120 giây và commit `public/catalogue/` + `dist/catalogue/` -**chỉ khi byte thật sự khác**. Không job định kỳ, không credit. - -**Nhưng reconciler đang TẮT và điều đó không còn là vấn đề.** Space vai-avatar không -có secret nào (`GET /api/spaces/bep40/vai-avatar/secrets` → `[]`), nên -`catalogue-mirror.ts` tự báo `"no HF_TOKEN/VAISTUDIO -> mirror OFF"` và không ghi gì. -Trước đây điều đó chết dây chuyền đồng bộ; giờ thì không: Space này đọc thẳng dataset -nên **không cần writer nào cả**. Muốn bật reconciler thì chỉ để cho mirror trong repo -tự mới theo (tiện khi rollback, có bản dữ liệu nằm trong lịch sử git) — không bắt -buộc, và là thay đổi hạ tầng trên Space đang chạy production nên cần bạn quyết. - -⚠️ Mỗi commit lên `main` của vai-avatar đều rebuild Docker của Space đang phục vụ khách. +Bản phái sinh của [`webml-community/semantic-image-field`](https://huggingface.co/spaces/webml-community/semantic-image-field), +thay bộ ảnh Unsplash 24.989 ảnh bằng **1.222 ảnh thiết kế nội thất Việt Nam** và cho phép +**tìm kiếm bằng tiếng Việt**. ## Thay đổi so với bản gốc | | Bản gốc | Bản này | | --- | --- | --- | | Bộ ảnh | Unsplash, 24.989 ảnh | Nội thất VN, **1.222 ảnh** | -| Model text | `Xenova/clip-vit-base-patch16` | `bep40/clip-vit-b32-multilingual-vi-text` (**50+ ngôn ngữ**) | +| Model text | `Xenova/clip-vit-base-patch16` (tiếng Anh) | `bep40/clip-vit-b32-multilingual-vi-text` (**50+ ngôn ngữ**) | | Nguồn ảnh | `images.unsplash.com` | `bep40/interior-image-field-assets` | | Giao diện | Tiếng Anh | Tiếng Việt | Model text là bản đóng gói của -[`sentence-transformers/clip-ViT-B-32-multilingual-v1`](https://huggingface.co/sentence-transformers/clip-ViT-B-32-multilingual-v1). -Bản gốc trên Hub chỉ export tới `last_hidden_state` 768 chiều, nên bản fork này nối thêm -mean-pooling, phép chiếu 768→512 và chuẩn hoá L2, rồi đặt tên `text_model.onnx` theo đúng quy -ước CLIP để Transformers.js nạp được mà không cần sửa mã nguồn. +[`sentence-transformers/clip-ViT-B-32-multilingual-v1`](https://huggingface.co/sentence-transformers/clip-ViT-B-32-multilingual-v1) +(text tower DistilBERT được huấn luyện để khớp không gian 512-d của CLIP-ViT-B-32). +Bản gốc trên Hub chỉ export tới `last_hidden_state` 768-chiều, nên bản fork này nối thêm +mean-pooling, phép chiếu 768→512 và chuẩn hoá L2, đặt tên `text_model.onnx` theo đúng +quy ước CLIP để Transformers.js nạp được không cần sửa mã nguồn. + +Ảnh được mã hoá **ngoại tuyến** bằng CLIP-ViT-B-32 (`Xenova/clip-vit-base-patch32`), +lưu thành float32 thô 512 chiều mỗi ảnh. Mỗi bản ghi kèm `ar` và BlurHash `blur` để +`layout.js` và `image-loader.js` hoạt động như thiết kế gốc. + +## Vẫn giữ nguyên -Ảnh được mã hoá **ngoại tuyến** bằng CLIP-ViT-B-32, lưu thành float32 thô 512 chiều mỗi ảnh. -Mỗi bản ghi kèm `ar` và BlurHash `blur`. Chuyển động, bố cục Fibonacci, xem toàn màn hình, bàn -phím và `prefers-reduced-motion` giữ nguyên theo bản gốc. Số ảnh hiển thị đồng thời vẫn là 96 +Toàn bộ chuyển động, bố cục Fibonacci, hiệu ứng liên quan, xem toàn màn hình, hỗ trợ +bàn phím và `prefers-reduced-motion` của bản gốc. Số ảnh hiển thị đồng thời vẫn là 96 (56 trên màn hình hẹp). -## Triển khai +## Chạy + +Không có server, API key hay cơ sở dữ liệu. Suy luận và xếp hạng diễn ra trên máy người +dùng; truy vấn không được gửi đi. Lần dùng đầu cần tải model (~130 MB) và ảnh từ +Hugging Face. ```sh npm install -npm run sync:catalogue # ghi public/catalogue/{products,promos}.json -npm run refresh:catalogue # sync + build + kiểm + trỏ index.html + commit + push +npm run dev ``` -Space phục vụ `index.html` ở gốc. File này **không** phải input của Vite (input là -`app.html`), nên `vite build` không bao giờ sửa nó — hai dòng trong đó là thứ duy nhất nối Space -với bundle. - -**Đừng sửa tay `index.html` sang tên cố định trước khi `dist/assets/index.js` tồn tại.** -Trỏ tới file không có thì Space trắng trang. `repointIndexHtml()` kiểm tra tồn tại trước khi -ghi nên chạy qua script là an toàn. - -`vite.config.js` đặt `emptyOutDir: false` vì `dist/` còn chứa khoảng 6.400 file dữ liệu đã -commit mà không bước build nào sinh lại được. Nếu bật `emptyOutDir`, chúng biến mất mà ứng -dụng vẫn chạy bình thường, không báo lỗi. - -`refresh-catalogue.mjs` chỉ commit path tường minh: `index.html`, `public/catalogue`, -`dist/catalogue`, `dist/assets`. Không path nào trùng pattern LFS trong `.gitattributes` -(pattern là `products-index.json` / `products-gallery.json` — tên cụ thể, không phải -`products.json`), nên con trỏ LFS không bao giờ được commit nhầm. - -## Kiểm tra nghiệm thu +## URL truy cập -Sau khi `npm run refresh:catalogue` chạy xong, mở Space và tìm `BD-1054HVOW`: +Space này dùng **static SDK**, nên không có `https://.hf.space` (trả 404 — +đúng cả với bản gốc `webml-community/semantic-image-field`). Host đúng là: -- xuất hiện **đúng một lần** -- giá hiện **6.490.000₫**, không phải `5.990.000₫` cũ -- bấm vào mở được trong cùng trình xem toàn màn hình với ảnh nội thất +**https://bep40-semantic-image-field.static.hf.space** -**Chưa kiểm được:** Space chưa từng build lại từ cây nguồn này. Toàn bộ mã `src/` và `scripts/` -là mã đã đọc và kiểm từng dòng; các kết luận trên dựa trên **dữ liệu thật đã đọc từ Hub**, -không phải suy đoán. +> `README.md` không được khai báo `app_file`: static Space phục vụ thư mục gốc repo, +> không phải đường dẫn trong `app_file`. -## URL +`products-index.json` được nhân bản vào chính Space này và app fetch cùng-origin. +Hub chỉ gửi `Access-Control-Allow-Origin: https://huggingface.co` cho file dataset, +nên fetch từ domain `*.static.hf.space` sẽ bị CORS chặn. -Space dùng **static SDK**, nên `https://.hf.space` trả 404 (đúng cả với bản gốc). Host đúng -là **https://bep40-semantic-image-field.static.hf.space** Công nhận: ảnh thuộc về các tác giả trên -[noithatphuphat.com](https://noithatphuphat.com). Pipeline suy luận theo ví dụ -[`semantic-image-search-web`](https://github.com/huggingface/transformers.js-examples/tree/main/semantic-image-search-web). \ No newline at end of file +[noithatphuphat.com](https://noithatphuphat.com). Pipeline suy luận dựa trên ví dụ +[`semantic-image-search-web`](https://github.com/huggingface/transformers.js-examples/tree/main/semantic-image-search-web). diff --git a/app.html b/app.html deleted file mode 100644 index b74d3dfba8abfdb68624404efd2fca4ab9f2a828..0000000000000000000000000000000000000000 --- a/app.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - Thư viện tìm kiếm ảnh theo ngữ nghĩa ngôn ngữ tự nhiên - - - -
- - - \ No newline at end of file diff --git a/dist/app.html b/dist/app.html deleted file mode 100644 index c1c956ebd33b387cc18117c9e39974f573b2732b..0000000000000000000000000000000000000000 --- a/dist/app.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - Thư viện tìm kiếm ảnh theo ngữ nghĩa ngôn ngữ tự nhiên - - - - - -
- - \ No newline at end of file diff --git a/dist/assets/app.css b/dist/assets/app.css deleted file mode 100644 index f08bdbfc03af11e2ef5677f8cad44538cb3c01b1..0000000000000000000000000000000000000000 --- a/dist/assets/app.css +++ /dev/null @@ -1,2 +0,0 @@ -/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial;--neon-angle:0deg}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--ease-out:cubic-bezier(0, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-x-0{inset-inline:0}.top-60{top:calc(var(--spacing) * 60)}.bottom-0{bottom:0}.isolate{isolation:isolate}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-dvh{height:100dvh}.w-full{width:100%}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.items-center{align-items:center}.justify-between{justify-content:space-between}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.border{border-style:var(--tw-border-style);border-width:1px}.capitalize{text-transform:capitalize}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter\!{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}}@property --neon-angle{syntax:"";inherits:false;initial-value:0deg}.image-tile{--neon:#22f5d0;--neon-soft:#7ef9ff;--neon-run:2.6s}.image-tile.exact,.image-tile.featured{--relevance-opacity:1!important;--relevance-blur:0px!important}.image-tile.exact:before,.image-tile.featured:before{content:"";z-index:2;background:conic-gradient(from var(--neon-angle,0deg), var(--neon) 0deg, var(--neon-soft) 38deg, #fff 70deg, var(--neon-soft) 102deg, var(--neon) 148deg, #22f5d05c 250deg, #22f5d000 344deg, var(--neon) 360deg);-webkit-mask-composite:xor;pointer-events:none;-webkit-mask-composite:xor;-webkit-mask-source-type:auto,auto;-webkit-mask-composite:xor;-webkit-mask-source-type:auto,auto;border-radius:2px;padding:1px;position:absolute;inset:0;transform:none;-webkit-mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-size:auto,auto;mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.image-tile.exact:after,.image-tile.featured:after{content:"";z-index:1;background:conic-gradient(from var(--neon-angle,0deg), #22f5d000 0deg, #22f5d085 62deg, #b6fdffc4 92deg, #22f5d05e 138deg, #22f5d01f 250deg, #22f5d000 348deg, #22f5d000 360deg);-webkit-mask-composite:xor;filter:blur(4px);opacity:.82;box-shadow:none;pointer-events:none;-webkit-mask-composite:xor;-webkit-mask-source-type:auto,auto;-webkit-mask-composite:xor;-webkit-mask-source-type:auto,auto;border-radius:2px;padding:2.5px;position:absolute;inset:0;-webkit-mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);mask-image:linear-gradient(#000 0 0),linear-gradient(#000 0 0);-webkit-mask-position:0 0,0 0;mask-position:0 0,0 0;-webkit-mask-size:auto,auto;mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}@keyframes neon-run{0%{--neon-angle:0deg}to{--neon-angle:360deg}}@supports at-rule(@property){.image-tile.exact:before,.image-tile.featured:before,.image-tile.exact:after,.image-tile.featured:after{animation:neon-run var(--neon-run) linear infinite}}.image-tile.featured{--neon-run:2s}.image-tile.featured:before{padding:1.5px}@media (prefers-reduced-motion:reduce){.image-tile.exact:before,.image-tile.exact:after,.image-tile.featured:before,.image-tile.featured:after{animation:none}}:root{color:#deded7;font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;background:#10110f;font-family:Arial,Helvetica,sans-serif}*{box-sizing:border-box}body{margin:0}button,input,a{-webkit-tap-highlight-color:transparent}button,input{font:inherit}button{cursor:pointer}button:focus-visible,a:focus-visible{outline-offset:5px;outline:2px solid #d7e1d1}.brand-backdrop{z-index:0;pointer-events:none;opacity:.3;background-color:#10110f;background-image:url(../brand/vaistudio_center.png);background-position:50%;background-repeat:no-repeat;background-size:cover;background-attachment:fixed;position:fixed;inset:0}@media (width<=768px){.brand-backdrop{background-position:top;background-repeat:repeat;background-size:100%;background-attachment:scroll}}.app{background:0 0;min-height:320px;overflow:clip}.image-field{contain:strict;position:absolute;inset:0;overflow:clip}.image-tile{will-change:transform;transform-origin:50%;background-color:#252823;background-size:cover;border:0;border-radius:2px;padding:0;display:block;position:absolute;top:0;left:0;overflow:hidden;box-shadow:0 1px 5px #0002}.image-tile img{object-fit:cover;opacity:0;filter:brightness(.92);width:100%;height:100%;transition:opacity .12s,filter .12s;position:absolute;inset:0}.image-tile img.loaded{opacity:1}.image-tile:hover{box-shadow:0 10px 35px #0005}.image-tile:hover img{filter:brightness()}.image-share{z-index:1;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:#e6ebe0;opacity:0;background:#0d0f0bb8;border-radius:6px;place-items:center;width:22px;height:22px;transition:opacity .16s,transform .16s,background .16s,color .16s;display:grid;position:absolute;top:5px;right:5px;transform:scale(.82)}.image-share svg{width:13px;height:13px}.image-share:hover{color:#fff;background:#0d0f0be6}.image-share[hidden]{display:none}.image-tile:hover .image-share,.image-tile:focus-within .image-share,.image-tile[data-rank="1"] .image-share,.image-tile[data-rank="2"] .image-share,.image-tile[data-rank="3"] .image-share{opacity:1;transform:scale(1)}@media (prefers-reduced-motion:reduce){.image-share{transition:opacity .12s linear}}.image-tile{opacity:var(--relevance-opacity,1);filter:blur(var(--relevance-blur,0px));transition:opacity .65s,filter .65s}.image-tile:hover,.image-tile:focus-visible{opacity:1;filter:blur()}.image-tile:hover,.image-tile:focus-within{z-index:2147483647}.vignette{pointer-events:none;z-index:300;background:radial-gradient(#0000 42%,#0c0d0b30 100%),linear-gradient(0deg,#10110f99,#0000 70px);position:absolute;inset:0}.grain{z-index:301;pointer-events:none;opacity:.045;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.92' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Cpath fill='%23fff' filter='url(%23n)' opacity='.7' d='M0 0h180v180H0z'/%3E%3C/svg%3E");position:absolute;inset:0}.search-center{z-index:400;width:clamp(350px,36vw,640px);max-width:calc(100% - 44px);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.search-pill{-webkit-backdrop-filter:blur(26px)saturate(.7);backdrop-filter:blur(26px)saturate(.7);background:#e4e8ddbb;border-radius:999px;height:clamp(62px,4.8vw,84px);transition:background .25s,box-shadow .25s;position:relative;overflow:hidden;box-shadow:inset 0 1px #ffffff3d,0 6px 36px #00000018}.search-pill:focus-within{background:#e6eaddd4;box-shadow:inset 0 1px #ffffff52,0 5px 40px #0002}.search-pill input{color:#20251f;letter-spacing:-.035em;caret-color:#323b2d;background:0 0;border:0;outline:none;width:100%;height:100%;padding:0 58px 0 27px;font-size:clamp(22px,1.8vw,30px)}.search-pill input::placeholder{color:#565d54;opacity:1}.search-pill input::selection{background:#80957070}.clear-button{color:#4c5449;background:0 0;border:0;border-radius:50%;place-items:center;width:34px;height:34px;padding:7px;transition:background .15s;display:grid;position:absolute;top:50%;right:13px;transform:translateY(-50%)}.clear-button:hover{background:#0000000d}.clear-button svg{width:18px;height:18px}.search-progress{opacity:0;height:1px;transition:opacity .3s;position:absolute;bottom:0;left:24px;right:24px;overflow:hidden}.search-progress.visible{opacity:.5}.search-progress span{background:#47513f;height:100%;transition:width .3s;animation:1.6s ease-in-out infinite progress-glow;display:block}.search-status{letter-spacing:.01em;color:#d2d6ccc9;text-shadow:0 1px 5px #000,0 1px 12px #000;pointer-events:none;justify-content:center;align-items:center;gap:7px;min-height:20px;font-size:12px;display:flex;position:absolute;top:calc(100% + 13px);left:-28px;right:-28px}.status-dot{background:#d2d8c9;border-radius:50%;width:4px;height:4px;animation:1.6s ease-in-out infinite progress-glow}.has-error-inline{color:#e8b4a9;text-align:center}.has-error{pointer-events:auto;text-shadow:none;background:#171b16ee;border-radius:10px;flex-wrap:wrap;padding:12px;font-size:14px}.has-error button{color:#eee;background:0 0;border:0;border-bottom:1px solid #ccc;padding:0}.error-detail{text-align:center;opacity:.7;overflow-wrap:anywhere;width:100%;font-size:12px}.footer{z-index:401;color:#bac0b395;letter-spacing:.015em;padding:20px 24px;font-size:12px}.footer a{color:inherit;text-decoration:none;transition:color .2s}.footer a:hover{color:#f5f6ef}.version{opacity:.55;margin-left:5px}.footer-divider{opacity:.5;padding:0 8px}@keyframes progress-glow{0%,to{opacity:.4}50%{opacity:1}}@media (width<=650px){.search-center{width:min(82vw,400px)}.search-pill{height:60px}.search-pill input{padding-left:23px;font-size:22px}.footer{padding:16px;font-size:12px}.footer .version,.footer-divider{display:none}.footer>span{font-size:0}.footer>span:after{content:"On-device search";font-size:12px}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}.photo-viewer{color:#e8eae3;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);background:#0c0e0bdc;border:0;width:100vw;max-width:none;height:100dvh;max-height:none;margin:0;padding:0;position:fixed;inset:0;overflow:hidden}.photo-viewer[open]{animation:.42s both viewer-reveal;display:block}.photo-viewer::backdrop{background:#0005}.photo-viewer.is-closing{opacity:0;transition:opacity .32s;animation:none}.photo-toolbar{z-index:2;pointer-events:none;justify-content:space-between;align-items:center;display:flex;position:absolute;inset:18px 24px auto}.photo-toolbar a,.photo-toolbar button{pointer-events:auto;color:#e0e5d9;background:#12160fe6;border:1px solid #ffffff18;border-radius:999px}.photo-toolbar a{padding:12px 17px;font-size:14px;text-decoration:none}.photo-toolbar button{place-items:center;width:44px;height:44px;display:grid}.photo-share{white-space:nowrap;align-items:center;gap:9px;display:inline-flex}.photo-share svg{flex:none;width:17px;height:17px}.photo-share:hover{color:#fff;background:#1b2115f2;border-color:#ffffff2e}@media (width<=560px){.photo-share span{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.photo-share{padding:12px}}.photo-toolbar svg{width:22px;height:22px}.photo-origin{pointer-events:none;color:#e0e5d9;text-overflow:ellipsis;white-space:nowrap;background:#12160fe6;border:1px solid #ffffff18;border-radius:999px;max-width:60vw;padding:12px 17px;font-size:14px;overflow:hidden}.photo-viewport{place-items:center;padding:72px 24px 40px;display:grid;position:absolute;inset:0;overflow:auto}.photo-frame{width:min(1800px, calc(100vw - 48px), calc((100dvh - 128px) * var(--photo-ar)));aspect-ratio:var(--photo-ar);cursor:zoom-in;transform-origin:50%;background-color:#161912;background-size:100% 100%;border:0;border-radius:3px;flex:none;padding:0;display:block;box-shadow:0 12px 70px #0005}.photo-frame img{object-fit:contain;opacity:0;width:100%;height:100%;transition:opacity .3s;display:block}.photo-frame img.loaded{opacity:1}.photo-viewport.is-zoomed{display:block}.photo-viewport.is-zoomed .photo-frame{width:max(calc(100vw - 48px), calc((100dvh - 128px) * var(--photo-ar)));cursor:zoom-out;margin:0 auto}@keyframes viewer-reveal{0%{opacity:0}to{opacity:1}}.photo-step{color:#e0e5d9;background:#12160fd9;border:1px solid #ffffff18;border-radius:50%;place-items:center;width:46px;height:46px;padding:0;transition:background .18s,border-color .18s;display:grid;position:absolute;top:50%;transform:translateY(-50%)}.photo-step:hover{background:#1b2118e6;border-color:#ffffff2e}.photo-step svg{width:22px;height:22px}.photo-step.is-prev{left:18px}.photo-step.is-next{right:18px}@media (width<=650px){.photo-step{width:38px;height:38px}.photo-step.is-prev{left:8px}.photo-step.is-next{right:8px}}.photo-caption{z-index:2;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);background:#0f130ccc;border:1px solid #ffffff17;border-radius:10px;max-width:min(560px,100vw - 48px);padding:12px 16px;position:absolute;bottom:18px;left:24px;right:24px}.photo-caption-price{color:#dfe6d2;margin:0 0 6px;font-size:15px;font-weight:600}.photo-caption-specs{gap:3px;margin:0;font-size:12px;display:grid}.photo-caption-specs>div{grid-template-columns:minmax(0,40%) minmax(0,60%);gap:10px;display:grid}.photo-caption-specs dt{color:#98a08f;overflow-wrap:anywhere}.photo-caption-specs dd{color:#d2d7cb;overflow-wrap:anywhere;margin:0}.photo-counter{z-index:2;font-variant-numeric:tabular-nums;color:#d2d7cb;background:#0f130ccc;border:1px solid #ffffff17;border-radius:999px;margin:0;padding:6px 12px;font-size:12px;position:absolute;bottom:22px;right:24px}@media (width<=650px){.photo-caption{padding:10px 12px;bottom:12px;left:12px;right:12px}.photo-counter{display:none}}.photo-detail{z-index:2;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#0f130ce8;border:1px solid #ffffff1f;border-radius:12px;width:min(460px,100vw - 48px);position:absolute;bottom:18px;left:24px;overflow:hidden}.photo-detail-summary{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:10px;padding:11px 14px;list-style:none;display:flex}.photo-detail-summary::-webkit-details-marker{display:none}.photo-detail-summary:hover{background:#ffffff0a}.photo-detail-title{color:#e4e9dc;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:14px;line-height:1.35;overflow:hidden}.photo-detail-price{color:#9fd6a4;font-variant-numeric:tabular-nums;flex:none;font-size:13px;font-weight:600}.photo-detail-toggle{color:#99a291;text-transform:uppercase;letter-spacing:.05em;border:1px solid #ffffff1f;border-radius:999px;flex:none;padding:3px 9px;font-size:11px;transition:color .18s}.photo-detail[open] .photo-detail-toggle{color:#cdd6c4;border-color:#fff3}.photo-detail-body{border-top:1px solid #ffffff12;padding:0 14px 13px}.photo-detail-desc{color:#c3cabb;margin:11px 0 0;font-size:13px;line-height:1.6}.photo-detail-tags{flex-wrap:wrap;gap:6px;margin:11px 0 0;padding:0;list-style:none;display:flex}.photo-detail-tags li{color:#b6c2ab;background:#ffffff0a;border:1px solid #ffffff17;border-radius:999px;padding:3px 9px;font-size:11px}.photo-detail-facts{gap:4px;margin:11px 0 0;font-size:12px;display:grid}.photo-detail-facts>div{grid-template-columns:minmax(0,38%) minmax(0,62%);gap:10px;display:grid}.photo-detail-facts dt{color:#939d8a;overflow-wrap:anywhere}.photo-detail-facts dd{color:#d5dbcd;overflow-wrap:anywhere;margin:0}.photo-viewer:has(.photo-caption) .photo-detail{top:76px;bottom:auto}@media (width<=650px){.photo-detail{width:auto;bottom:12px;left:12px;right:12px}.photo-viewer:has(.photo-caption) .photo-detail{top:70px}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false} diff --git a/dist/assets/index-CX-0QtoD.js b/dist/assets/index-CX-0QtoD.js new file mode 100644 index 0000000000000000000000000000000000000000..9246943e3c5a030b2386ebdf929629340b7b4d97 --- /dev/null +++ b/dist/assets/index-CX-0QtoD.js @@ -0,0 +1,9 @@ +var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.for(`react.view_transition`),m=Symbol.iterator;function h(e){return typeof e!=`object`||!e?null:(e=m&&e[m]||e[`@@iterator`],typeof e==`function`?e:null)}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function y(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function b(){}b.prototype=y.prototype;function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}var S=x.prototype=new b;S.constructor=x,_(S,y.prototype),S.isPureReactComponent=!0;var ee=Array.isArray;function te(){}var C={H:null,A:null,T:null,S:null},ne=Object.prototype.hasOwnProperty;function w(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return w(e.type,t,e.props)}function ie(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ae(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var oe=/\/+/g;function se(e,t){return typeof e==`object`&&e&&e.key!=null?ae(``+e.key):t.toString(36)}function ce(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(te,te):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function le(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,le(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+se(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(oe,`$&/`)+`/`),le(o,r,i,``,function(e){return e})):o!=null&&(ie(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(oe,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,S||(S=!0,re());else{var t=n(l);t!==null&&oe(x,t.startTime-e)}}}var S=!1,ee=-1,te=5,C=-1;function ne(){return g?!0:!(e.unstable_now()-Ct&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&oe(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?re():S=!1}}}var re;if(typeof y==`function`)re=function(){y(w)};else if(typeof MessageChannel<`u`){var ie=new MessageChannel,ae=ie.port2;ie.port1.onmessage=w,re=function(){ae.postMessage(null)}}else re=function(){_(w,0)};function oe(t,n){ee=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(ee),ee=-1):h=!0,oe(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,re()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1De||(e.current=Ee[De],Ee[De]=null,De--)}function k(e,t){De++,Ee[De]=e.current,e.current=t}var ke=Oe(null),Ae=Oe(null),je=Oe(null),Me=Oe(null);function Ne(e,t){switch(k(je,t),k(Ae,e),k(ke,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?up(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=up(t),e=dp(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}O(ke),k(ke,e)}function Pe(){O(ke),O(Ae),O(je)}function Fe(e){var t=e.memoizedState;t!==null&&(sh._currentValue=t.memoizedState,k(Me,e)),t=ke.current;var n=dp(t,e.type);t!==n&&(k(Ae,e),k(ke,n))}function Ie(e){Ae.current===e&&(O(ke),O(Ae)),Me.current===e&&(O(Me),sh._currentValue=Te)}var Le,Re;function ze(e){if(Le===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Le=t&&t[1]||``,Re=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Be=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?ze(n):``}function He(e,t){switch(e.tag){case 26:case 27:case 5:return ze(e.type);case 16:return ze(`Lazy`);case 13:return e.child!==t&&t!==null?ze(`Suspense Fallback`):ze(`Suspense`);case 19:return ze(`SuspenseList`);case 0:case 15:return Ve(e.type,!1);case 11:return Ve(e.type.render,!1);case 1:return Ve(e.type,!0);case 31:return ze(`Activity`);case 30:return ze(`ViewTransition`);default:return``}}function Ue(e){try{var t=``,n=null;do t+=He(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var We=Object.prototype.hasOwnProperty,Ge=t.unstable_scheduleCallback,Ke=t.unstable_cancelCallback,qe=t.unstable_shouldYield,Je=t.unstable_requestPaint,Ye=t.unstable_now,Xe=t.unstable_getCurrentPriorityLevel,Ze=t.unstable_ImmediatePriority,Qe=t.unstable_UserBlockingPriority,$e=t.unstable_NormalPriority,et=t.unstable_LowPriority,tt=t.unstable_IdlePriority,nt=t.log,rt=t.unstable_setDisableYieldValue,it=null,at=null;function ot(e){if(typeof nt==`function`&&rt(e),at&&typeof at.setStrictMode==`function`)try{at.setStrictMode(it,e)}catch{}}var st=Math.clz32?Math.clz32:ut,ct=Math.log,lt=Math.LN2;function ut(e){return e>>>=0,e===0?32:31-(ct(e)/lt|0)|0}var dt=256,ft=262144,pt=4194304;function mt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ht(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=mt(n))):i=mt(o):i=mt(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=mt(n))):i=mt(o)):i=mt(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function gt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function _t(e,t){t&8&&(t|=t&32);var n=e.entangledLanes;if(n!==0)for(e=e.entanglements,n&=t;0n;n++)t.push(e);return t}function xt(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function St(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0=xr),wr=` `,Tr=!1;function Er(e,t){switch(e){case`keyup`:return yr.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function Dr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var Or=!1;function kr(e,t){switch(e){case`compositionend`:return Dr(t);case`keypress`:return t.which===32?(Tr=!0,wr):null;case`textInput`:return e=t.data,e===wr&&Tr?null:e;default:return null}}function Ar(e,t){if(Or)return e===`compositionend`||!br&&Er(e,t)?(e=Hn(),Vn=Bn=zn=null,Or=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=$r(n)}}function ti(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ti(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ni(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Qr(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Qr(e.document)}return t}function ri(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var ii=In&&`documentMode`in document&&11>=document.documentMode,ai=null,oi=null,si=null,ci=!1;function li(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ci||ai==null||ai!==Qr(r)||(r=ai,`selectionStart`in r&&ri(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),si&&Zr(si,r)||(si=r,r=Jf(oi,`onSelect`),0>=o,i-=o,aa=1<<32-st(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),M&&sa(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),M&&sa(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return M&&sa(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&(_=v.alternate,_!==null&&h.delete(_.key===null?g:_.key)),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),M&&sa(a,g),u}function _(e,r,o,c){if(typeof o==`object`&&o&&o.type===oe&&o.key===null&&o.props.ref===void 0&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case ie:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===oe){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),go(c,o),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===he&&co(l)===r.type){n(e,r.sibling),c=a(r,o.props),go(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===oe?(c=Ki(o.props.children,e.mode,c,o.key),go(c,o),c.return=e,e=c):(c=Gi(o.type,o.key,o.props,null,e.mode,c),go(c,o),c.return=e,e=c)}return s(e);case ae:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=Yi(o,e.mode,c),c.return=e,e=c}return s(e);case he:return o=co(o),_(e,r,o,c)}if(we(o))return h(e,r,o,c);if(xe(o)){if(l=xe(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return _(e,r,ho(o),c);if(o.$$typeof===ue)return _(e,r,Pa(e,o),c);_o(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=qi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{mo=0;var i=_(e,t,n,r);return po=null,i}catch(t){if(t===no||t===io)throw t;var a=Vi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var yo=vo(!0),bo=vo(!1),xo=!1;function So(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Co(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function wo(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function To(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,W&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=Ri(e),Li(e,null,n),t}return Pi(e,r,t,n),Ri(e)}function Eo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,wt(e,n)}}function Do(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Oo=!1;function ko(){if(Oo){var e=qa;if(e!==null)throw e}}function Ao(e,t,n,r){Oo=!1;var i=e.updateQueue;xo=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(q&f)===f:(r&f)===f){f!==0&&f===Ka&&(Oo=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,h=s;f=t;var g=n;switch(h.tag){case 1:if(m=h.payload,typeof m==`function`){d=m.call(g,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=h.payload,f=typeof m==`function`?m.call(g,d,f):m,f==null)break a;d=w({},d,f);break a;case 2:xo=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),sd|=o,e.lanes=o,e.memoizedState=d}}function jo(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Mo(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=E.T,s={};s.types=o===null?null:o.types,E.T=s,hc(e,!1,t,n);try{var c=i(),l=E.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?mc(e,t,Xa(c,r),jd(e)):mc(e,t,r,jd(e))}catch(n){mc(e,t,{then:function(){},status:`rejected`,reason:n},jd())}finally{D.p=a,o!==null&&s.types!==null&&(o.types=s.types),E.T=o}}function ic(){}function ac(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=oc(e).queue;rc(e,a,t,Te,n===null?ic:function(){return sc(e),n(r)})}function oc(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:Te,baseState:Te,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:gs,lastRenderedState:Te},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:gs,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function sc(e){var t=oc(e);t.next===null&&(t=e.alternate.memoizedState),mc(e,t.next.queue,{},jd())}function cc(){return Na(sh)}function lc(){return R().memoizedState}function uc(){return R().memoizedState}function dc(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=jd();e=wo(n);var r=To(t,e,n);r!==null&&(Pd(r,t,n),Eo(r,t,n)),t={cache:za()},e.payload=t;return}t=t.return}}function fc(e,t,n){var r=jd();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},gc(e)?_c(t,n):(n=Fi(e,t,n,r),n!==null&&(Pd(n,e,r),vc(n,t,r)))}function pc(e,t,n){mc(e,t,n,jd())}function mc(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(gc(e))_c(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Xr(s,o))return Pi(e,t,i,0),G===null&&Ni(),!1}catch{}if(n=Fi(e,t,i,r),n!==null)return Pd(n,e,r),vc(n,t,r),!0}return!1}function hc(e,t,n,r){if(r={lane:2,revertLane:Pf(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},gc(e)){if(t)throw Error(i(479))}else t=Fi(e,n,r,2),t!==null&&Pd(t,e,2)}function gc(e){var t=e.alternate;return e===P||t!==null&&t===P}function _c(e,t){Zo=Xo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function vc(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,wt(e,n)}}var yc={readContext:Na,use:ms,useCallback:L,useContext:L,useEffect:L,useImperativeHandle:L,useLayoutEffect:L,useInsertionEffect:L,useMemo:L,useReducer:L,useRef:L,useState:L,useDebugValue:L,useDeferredValue:L,useTransition:L,useSyncExternalStore:L,useId:L,useHostTransitionStatus:L,useFormState:L,useActionState:L,useOptimistic:L,useMemoCache:L,useCacheRefresh:L,useEffectEvent:L},bc={readContext:Na,use:ms,useCallback:function(e,t){return ds().memoizedState=[e,t===void 0?null:t],e},useContext:Na,useEffect:Ws,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),Hs(4194308,4,Xs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Hs(4194308,4,e,t)},useInsertionEffect:function(e,t){Hs(4,2,e,t)},useMemo:function(e,t){var n=ds();t=t===void 0?null:t;var r=e();if(Qo){ot(!0);try{e()}finally{ot(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=ds();if(n!==void 0){var i=n(t);if(Qo){ot(!0);try{n(t)}finally{ot(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=fc.bind(null,P,e),[r.memoizedState,e]},useRef:function(e){var t=ds();return e={current:e},t.memoizedState=e},useState:function(e){e=Es(e);var t=e.queue,n=pc.bind(null,P,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Qs,useDeferredValue:function(e,t){return tc(ds(),e,t)},useTransition:function(){var e=Es(!1);return e=rc.bind(null,P,e.queue,!0,!1),ds().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=P,a=ds();if(M){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),G===null)throw Error(i(349));q&127||xs(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,Ws(Cs.bind(null,r,o,e),[e]),r.flags|=2048,Bs(9,{destroy:void 0},Ss.bind(null,r,o,n,t),null),n},useId:function(){var e=ds(),t=G.identifierPrefix;if(M){var n=oa,r=aa;n=(r&~(1<<32-st(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=$o++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[jt]=t,o[Mt]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(np(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&gl(t)}}return V(t),t.subtreeFlags&=-33554433,_l(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&gl(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=je.current,ya(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=fa,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[jt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||ep(e.nodeValue,n)),e||ga(t,!0)}else e=lp(e).createTextNode(r),e[jt]=t,t.stateNode=e}return V(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=ya(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[jt]=t}else ba(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),e=!1}else n=xa(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(Wo(t),t):(Wo(t),null);if(t.flags&128)throw Error(i(558))}return V(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=ya(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[jt]=t}else ba(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),a=!1}else a=xa(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(Wo(t),t):(Wo(t),null)}return Wo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),yl(t,t.updateQueue),V(t),null);case 4:return Pe(),e===null&&Wf(t.stateNode.containerInfo),t.flags|=67108864,V(t),null;case 10:return Da(t.type),V(t),null;case 19:if(qo(t),r=t.memoizedState,r===null)return V(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)bl(r,!1);else{if(Y!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=Jo(e),o!==null){for(t.flags|=128,bl(r,!1),e=o.updateQueue,t.updateQueue=e,yl(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)Wi(n,e),n=n.sibling;return Ko(t,Go.current&1|2),M&&sa(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ye()>_d&&(t.flags|=128,a=!0,bl(r,!1),t.lanes=4194304)}}else{if(!a){if(e=Jo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,yl(t,e),bl(r,!0),r.tail===null&&r.tailMode!==`collapsed`&&r.tailMode!==`visible`&&!o.alternate&&!M)return V(t),null}else 2*Ye()-r.renderingStartTime>_d&&n!==536870912&&(t.flags|=128,a=!0,bl(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}if(r.tail!==null){e=r.tail;a:{for(n=e;n!==null;){if(n.alternate!==null){n=!1;break a}n=n.sibling}n=!0}return r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ye(),e.sibling=null,o=Go.current,o=a?o&1|2:o&1,r.tailMode===`visible`||r.tailMode===`collapsed`||!n||M?Ko(t,o):(n=o,k(Ro,t),k(Go,n),zo===null&&(zo=t)),M&&sa(t,r.treeForkCount),e}return V(t),null;case 22:case 23:return Wo(t),Lo(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(V(t),t.subtreeFlags&6&&(t.flags|=8192)):V(t),n=t.updateQueue,n!==null&&yl(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&O(Qa),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Da(N),V(t),null;case 25:return null;case 30:return t.flags|=33554432,V(t),null}throw Error(i(156,t.tag))}function Sl(e,t){switch(ua(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Da(N),Pe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ie(t),null;case 31:if(t.memoizedState!==null){if(Wo(t),t.alternate===null)throw Error(i(340));ba()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Wo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));ba()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return qo(t),e=t.flags,e&65536?(t.flags=e&-65537|128,e=t.memoizedState,e!==null&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return Pe(),null;case 10:return Da(t.type),null;case 22:case 23:return Wo(t),Lo(),e!==null&&O(Qa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Da(N),null;case 25:return null;default:return null}}function Cl(e,t){switch(ua(t),t.tag){case 3:Da(N),Pe();break;case 26:case 27:case 5:Ie(t);break;case 4:Pe();break;case 31:t.memoizedState!==null&&Wo(t);break;case 13:Wo(t);break;case 19:qo(t);break;case 10:Da(t.type);break;case 22:case 23:Wo(t),Lo(),e!==null&&O(Qa);break;case 24:Da(N)}}function wl(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Tl(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function El(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Mo(t,n)}catch(t){Z(e,e.return,t)}}}function Dl(e,t,n){n.props=Dc(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Ol(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:var i=e.stateNode,a=Ei(e.memoizedProps,i);(i.ref===null||i.ref.name!==a)&&(i.ref=Pp(a)),r=i.ref;break;case 7:if(e.stateNode===null){var o=new Fp(e);h(e.child,!1,Qp,o,void 0,void 0),e.stateNode=o}r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function kl(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Al(e,t){if((e.tag===5||e.tag===27||e.tag===6)&&e.alternate===null&&t!==null)for(var n=0;n title`))),np(r,t,n),r[jt]=e,Gt(r),t=r;break a;case`link`:if(o=Gm(`link`,`href`,a).get(t+(n.href||``))){for(s=0;sg&&(o=g,g=h,h=o);var _=ei(s,h),v=ei(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,E.T=null,n=wd,wd=null;var o=bd,s=Sd;if(X=0,xd=bd=null,Sd=0,W&6)throw Error(i(331));var c=W;if(W|=4,Zu(o.current),Uu(o,o.current,s,n),W=c,Df(0,!1),at&&typeof at.onPostCommitFiberRoot==`function`)try{at.onPostCommitFiberRoot(it,o)}catch{}return!0}finally{D.p=a,E.T=r,uf(e,t)}}function pf(e,t,n){t=Zi(n,t),t=Nc(e.stateNode,t,2),e=To(e,t,2),e!==null&&(xt(e,2),Ef(e))}function Z(e,t,n){if(e.tag===3)pf(e,e,n);else for(;t!==null;){if(t.tag===3){pf(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(yd===null||!yd.has(r))){e=Zi(n,e),n=Pc(2),r=To(t,n,2),r!==null&&(Fc(n,r,t,e),xt(r,2),Ef(r));break}}t=t.return}}function mf(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new td;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(ad=!0,i.add(n),e=hf.bind(null,e,t,n),t.then(e,e))}function hf(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Y===4||Y===3&&(q&62914560)===q&&300>Ye()-hd?W&2?ld|=n:Vd(e,0):ld|=n,dd===q&&(dd=0)),Ef(e)}function gf(e,t){t===0&&(t=yt()),e=Ii(e,t),e!==null&&(xt(e,t),Ef(e))}function _f(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),gf(e,n)}function vf(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),gf(e,n)}function yf(e,t){return Ge(e,t)}var bf=null,xf=null,Sf=!1,Cf=!1,wf=!1,Tf=0;function Ef(e){e!==xf&&e.next===null&&(xf===null?bf=xf=e:xf=xf.next=e),Cf=!0,Sf||(Sf=!0,Nf())}function Df(e,t){if(!wf&&Cf){wf=!0;do for(var n=!1,r=bf;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-st(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,Mf(r,a))}else a=q,a=ht(r,r===G?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||gt(r,a)||(n=!0,Mf(r,a))}r=r.next}while(n);wf=!1}}function Of(){kf()}function kf(){Cf=Sf=!1;var e=0;Tf!==0&&hp()&&(e=Tf);for(var t=Ye(),n=null,r=bf;r!==null;){var i=r.next,a=Af(r,t);a===0?(r.next=null,n===null?bf=i:n.next=i,i===null&&(xf=n)):(n=r,(e!==0||a&3)&&(Cf=!0)),r=i}X!==0&&X!==5||Df(e,!1),Tf!==0&&(Tf=0)}function Af(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&ap(d)&&(c=c.responseEnd,o+=u*(c$m){s.length=o;break}f=new Promise(jp.bind(f)),s.push(f)}}}if(0`u`?null:document;function Tm(e,t,n){var r=wm;if(r&&typeof t==`string`&&t){var i=fn(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),ym.has(i)||(ym.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),np(t,`link`,e),Gt(t),r.head.appendChild(t)))}}function Em(e){xm.D(e),Tm(`dns-prefetch`,e,null)}function Dm(e,t){xm.C(e,t),Tm(`preconnect`,e,t)}function Om(e,t,n){xm.L(e,t,n);var r=wm;if(r&&e&&t){var i=`link[rel="preload"][as="`+fn(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+fn(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+fn(n.imageSizes)+`"]`)):i+=`[href="`+fn(e)+`"]`;var a=i;switch(t){case`style`:a=Pm(e);break;case`script`:a=Rm(e)}if(!(vm.has(a)||(e=w({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),vm.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Fm(a))||t===`script`&&r.querySelector(zm(a))))){var o=r.createElement(`link`);np(o,`link`,e),t===`style`&&(o[zt]=!0,o.onload=o.onerror=function(){Kt(o)}),Gt(o),r.head.appendChild(o)}}}function km(e,t){xm.m(e,t);var n=wm;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+fn(r)+`"][href="`+fn(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Rm(e)}if(!vm.has(a)&&(e=w({rel:`modulepreload`,href:e},t),vm.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(zm(a)))return}r=n.createElement(`link`),np(r,`link`,e),Gt(r),n.head.appendChild(r)}}}function Am(e,t,n){xm.S(e,t,n);var r=wm;if(r&&e){var i=Wt(r).hoistableStyles,a=Pm(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Fm(a)))s.loading=5;else{e=w({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=vm.get(a))&&Hm(e,n);var c=o=r.createElement(`link`);Gt(c),np(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Vm(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function jm(e,t){xm.X(e,t);var n=wm;if(n&&e){var r=Wt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=w({src:e,async:!0},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),Gt(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mm(e,t){xm.M(e,t);var n=wm;if(n&&e){var r=Wt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=w({src:e,async:!0,type:`module`},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),Gt(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Nm(e,t,n,r){var a=(a=je.current)?bm(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(n=Pm(n.href),t=Wt(a).hoistableStyles,r=t.get(n),r||(r={type:`style`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Pm(n.href);var o=Wt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Fm(e)))?o._p||(s.instance=o,s.state.loading=5):(o=vm.get(e),o||(o={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},vm.set(e,o)),Lm(a,e,o,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(n=Rm(n),t=Wt(a).hoistableScripts,r=t.get(n),r||(r={type:`script`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Pm(e){return`href="`+fn(e)+`"`}function Fm(e){return`link[rel="stylesheet"][`+e+`]`}function Im(e){return w({},e,{"data-precedence":e.precedence,precedence:null})}function Lm(e,t,n,r){if(t=e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)){if(!0!==t[zt]){r.loading=1;return}}else t=e.createElement(`link`),t[zt]=!0,t.onload=t.onerror=Kt.bind(null,t),np(t,`link`,n),Gt(t),e.head.appendChild(t);r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2})}function Rm(e){return`[src="`+fn(e)+`"]`}function zm(e){return`script[async]`+e}function Bm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+fn(n.href)+`"]`);if(r)return t.instance=r,Gt(r),r;var a=w({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),Gt(r),np(r,`style`,a),Vm(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Pm(n.href);var o=e.querySelector(Fm(a));if(o)return t.state.loading|=4,t.instance=o,Gt(o),o;r=Im(n),(a=vm.get(a))&&Hm(r,a),o=(e.ownerDocument||e).createElement(`link`),Gt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),np(o,`link`,r),t.state.loading|=4,Vm(o,n.precedence,e),t.instance=o;case`script`:return o=Rm(n.src),(a=e.querySelector(zm(o)))?(t.instance=a,Gt(a),a):(r=n,(a=vm.get(o))&&(r=w({},n),Um(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),Gt(a),np(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Vm(r,n.precedence,e));return t.instance}function Vm(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function qm(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Jm(e,t){return e===`img`&&t.src!=null&&t.src!==``&&t.onLoad==null&&t.loading!==`lazy`}function Ym(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Xm(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio==`number`?devicePixelRatio:1)*.25}function Zm(e,t){typeof t.decode==`function`&&(e.imgCount++,t.complete||(e.imgBytes+=Xm(t),e.suspenseyImages.push(t)),e=rh.bind(e),t.decode().then(e,e))}function Qm(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Pm(r.href),a=t.querySelector(Fm(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=nh.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,Gt(a);return}a=t.ownerDocument||t,r=Im(r),(i=vm.get(i))&&Hm(r,i),a=a.createElement(`link`),Gt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=nh.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var $m=0;function eh(e,t){return e.stylesheets&&e.count===0&&ah(e,e.stylesheets),0$m?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function th(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)ah(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function nh(){this.count--,th(this)}function rh(){this.imgCount--,th(this)}var ih=null;function ah(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ih=new Map,t.forEach(oh,e),ih=null,nh.call(e))}function oh(e,t){if(!(t.state.loading&4)){var n=ih.get(e);if(n)var r=n.get(null);else{n=new Map,ih.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y=JSON.parse(`[{"id":"0004d4b651","url":"0004d4b651.jpg","ar":0.8594,"blur":"LaKUp4WBRkn$?vxuxuoM~pxuR+j["},{"id":"001160216e","url":"001160216e.jpg","ar":1.4566,"blur":"LlJ8IjMwtRoe~qRikDs:oJt7WXoJ"},{"id":"001b9c7a22","url":"001b9c7a22.jpg","ar":1.3989,"blur":"LIJHp;~q4n?bNcM_RkofM_9Z-:WB"},{"id":"00243920f3","url":"00243920f3.jpg","ar":1.4993,"blur":"LDI#li0MRPa{?v9ai^-o~qI9M_xu"},{"id":"002b1f6f2c134b5de8dc52737e774ba5b93e1055","url":"002b1f6f2c134b5de8dc52737e774ba5b93e1055.jpg","ar":1.3333,"blur":"LbC@KyRjRiWBlCWCacj[RjozRiof"},{"id":"00413fa633054264","url":"00413fa633054264.jpg","ar":0.7568,"blur":"L8Gm3[56MKI:.8DijZof4T.S.8.8"},{"id":"0059044946","url":"0059044946.jpg","ar":1.4993,"blur":"LWKnPI-;00ad-:WBazt74nWAxuWq"},{"id":"005ec5c9032f4531488ec6116ed22d937abb0270","url":"005ec5c9032f4531488ec6116ed22d937abb0270.jpg","ar":1.0,"blur":"LbNTar-mRkV[_MSjjEaJx^t3jYkC"},{"id":"00a272ab96","url":"00a272ab96.jpg","ar":1.7778,"blur":"LIJQir%hit?E~p%MRjRkMvM{tT%L"},{"id":"00c3f2ef50a572aa","url":"00c3f2ef50a572aa.jpg","ar":1.0,"blur":"LqKK~DkDbIt7.TRlxaoet8V@jXjY"},{"id":"014056ab879ee13d2f97f329aa0ce7c0b8f98381","url":"014056ab879ee13d2f97f329aa0ce7c0b8f98381.jpg","ar":1.158,"blur":"LaPGpmxuf6kC~qxutRjZIUMxRjof"},{"id":"0144ebe50c","url":"0144ebe50c.jpg","ar":1.7778,"blur":"L#H-V?0z$*nixtRjofj[V@V[oft7"},{"id":"0180811bf586a7e966145eb9a9a68f1d4bec9a9b","url":"0180811bf586a7e966145eb9a9a68f1d4bec9a9b.jpg","ar":1.4376,"blur":"LbL|lgozIooy~VE1IUkCIBafV@V@"},{"id":"01af8f7ae1de1fac20e05d4391d3a8912be1ca03","url":"01af8f7ae1de1fac20e05d4391d3a8912be1ca03.jpg","ar":1.7058,"blur":"LBGuag-:Iq?b_3t7n~j]IU00%M%1"},{"id":"01b0637bbe","url":"01b0637bbe.jpg","ar":1.4085,"blur":"LPL}T.?Hx^n$_Nxaj?oe-p%LWAbH"},{"id":"01da965e05","url":"01da965e05.jpg","ar":1.6516,"blur":"LMKn6kxvtjtQ~VIpx[kCtR?Hnkxt"},{"id":"01f554a00c698daeebb10d764d9ad0fa30217137","url":"01f554a00c698daeebb10d764d9ad0fa30217137.jpg","ar":1.7786,"blur":"LDNKCpxUbc_4?a.8M|Mx~qn$%Lx]"},{"id":"01fa1b4c91a4c4becc390c7d2d202aeed55fb3ac","url":"01fa1b4c91a4c4becc390c7d2d202aeed55fb3ac.jpg","ar":1.0,"blur":"LILW#4r;McMx_NIWD%M{x^SiIpt8"},{"id":"02076f4467","url":"02076f4467.jpg","ar":0.71,"blur":"LmK-k3NG-pkB~qbHxuoft8ogofof"},{"id":"0234975b64","url":"0234975b64.jpg","ar":0.71,"blur":"L]F$-RoftRof?woLt7j[t9fkWAay"},{"id":"0281cfa48ea78f36da950a523152ca4cc2c40a1e","url":"0281cfa48ea78f36da950a523152ca4cc2c40a1e.jpg","ar":1.7786,"blur":"LHKA[?8^~qxs~V-:%1%2-;M{IVog"},{"id":"02e07648862aa4e73fa2c902c693047bc84f44d3","url":"02e07648862aa4e73fa2c902c693047bc84f44d3.jpg","ar":1.7786,"blur":"LAL4vmR24UxZ?vo~SQR+%fkWM_W="},{"id":"030081ed6ef344462edad525ddb9705c539d328d","url":"030081ed6ef344462edad525ddb9705c539d328d.jpg","ar":1.0,"blur":"LXI=3{_4X9s,Oa%0RjE2%gxtoJR-"},{"id":"030d59eaf3","url":"030d59eaf3.jpg","ar":1.7778,"blur":"LJG+2NNGD*of%M-:D%xv~qWBs.WE"},{"id":"0411e60c40c7ed40a2efc0391af7982947cc4595","url":"0411e60c40c7ed40a2efc0391af7982947cc4595.jpg","ar":1.5009,"blur":"LRI#iR?ID%%M~q-;V@t5%ix[M{o#"},{"id":"04312d898f5527e8f1166449a4235fca08094a21","url":"04312d898f5527e8f1166449a4235fca08094a21.jpg","ar":1.0,"blur":"L,I#cLjFjZof~qoLjtj[%NbIWXay"},{"id":"04361069885f01c20b6614a127dc142646143044","url":"04361069885f01c20b6614a127dc142646143044.jpg","ar":1.7786,"blur":"LFJ[Cn57D%%1pJI9xuoz~px]RkR*"},{"id":"043f4d6c61e80b519bf5a48c2804ab8b5070922c","url":"043f4d6c61e80b519bf5a48c2804ab8b5070922c.jpg","ar":1.0,"blur":"LpOgTm%M?baeR*NGtRof_NWCE1t7"},{"id":"0450bc3d37a5380795d7f949f6e620ef8441e11a","url":"0450bc3d37a5380795d7f949f6e620ef8441e11a.jpg","ar":1.641,"blur":"LSJu1G_3j[xu8^x]xaof_4%MV@of"},{"id":"046419145602bbae04804b9dce8231bddaaf8074","url":"046419145602bbae04804b9dce8231bddaaf8074.jpg","ar":1.658,"blur":"LYIF6^~9a%bcx_-:j]afxC%hWUIo"},{"id":"04cb52c8c668f7ac6bbee7accaa311134aaafc27","url":"04cb52c8c668f7ac6bbee7accaa311134aaafc27.jpg","ar":0.6667,"blur":"LJMaO$M{ozoL.ToJWBt7~WD%RPj["},{"id":"04d41cf78e","url":"04d41cf78e.jpg","ar":1.3333,"blur":"LFLzpraJM|01?cD*M{%N_3-:Rj-:"},{"id":"05900ee7819a9680034af84b299ea88563a33a6e","url":"05900ee7819a9680034af84b299ea88563a33a6e.jpg","ar":0.962,"blur":"LYNw4gxZt6R*_4IUR+xaD%xutRof"},{"id":"05a0d26810","url":"05a0d26810.jpg","ar":0.8762,"blur":"LIK-2ma}%M-;_NoLxtV@xabHM{t6"},{"id":"05a7ff308b8914f238b0cb69941d50b59cde8141","url":"05a7ff308b8914f238b0cb69941d50b59cde8141.jpg","ar":1.0,"blur":"LDD]bk9s_N%pRZIBo#IDS+Di%L9G"},{"id":"05c9aaad4ef0c11e5ec7be9f11a63bb685d844bf","url":"05c9aaad4ef0c11e5ec7be9f11a63bb685d844bf.jpg","ar":1.0,"blur":"LeO|IOMa?Fo$^*xtIWWAEVI^M{n#"},{"id":"05e1b0ea98","url":"05e1b0ea98.jpg","ar":1.665,"blur":"LaJRXEs-M{xt~qxut8WBR.xaRkWB"},{"id":"05e2441942fefc07f27f3cd8341ff416018c0dc8","url":"05e2441942fefc07f27f3cd8341ff416018c0dc8.jpg","ar":1.6606,"blur":"LoHfL|%LM{of.TRlkCofD%V@ogWB"},{"id":"063779d7f4fb3508b906e1b1ab809d81ddb23ff6","url":"063779d7f4fb3508b906e1b1ab809d81ddb23ff6.jpg","ar":1.7778,"blur":"LMJ*eo^+NGxus*i^t6of_NM|s.WA"},{"id":"0665a6f40b","url":"0665a6f40b.jpg","ar":1.3333,"blur":"LWJRKt?w9aNGMxIVjZkC%1RjRPRP"},{"id":"06ab82854261e4ad4791ba6e66af868c5aeaa9ba","url":"06ab82854261e4ad4791ba6e66af868c5aeaa9ba.jpg","ar":1.499,"blur":"L997qfMQJ5-o?k8yXl-.%yDkIp%L"},{"id":"06ae040031","url":"06ae040031.jpg","ar":1.7778,"blur":"L7DSg[n20LXTA2%MWBIo4:kr%MRO"},{"id":"06c4afd97e80347ef53527289bb5bbc620a64930","url":"06c4afd97e80347ef53527289bb5bbc620a64930.jpg","ar":1.7778,"blur":"L4DJYa?w4mR*?cWAxuRjohWBfRRi"},{"id":"071b4e4c6d","url":"071b4e4c6d.jpg","ar":0.8018,"blur":"L98z+8x]9bNM?dofM|bIo%RiIToH"},{"id":"07b49375ff","url":"07b49375ff.jpg","ar":1.4124,"blur":"LNGvn#M_ImxZT#oyRORjESxv%3X9"},{"id":"07b7636d4b","url":"07b7636d4b.jpg","ar":1.4993,"blur":"LOJkJ,4TS4R5RPxukDsn~WaeM{WC"},{"id":"07b82ac74aaae9738baad9a0d33e8ba2a76ecec1","url":"07b82ac74aaae9738baad9a0d33e8ba2a76ecec1.jpg","ar":1.0,"blur":"LMQRzX_NF}?bMHMIrpof.8NHnhWA"},{"id":"07b8871c4b","url":"07b8871c4b.jpg","ar":1.5,"blur":"LFGuXaEM9aDh?wRks:xus,x]WXS5"},{"id":"08038d4053","url":"08038d4053.jpg","ar":1.1929,"blur":"LCF$IkIUIAM{~q-;Di?H0KE1x]IV"},{"id":"0810fad184febfa0e9add5e0a2ee43638eb659bc","url":"0810fad184febfa0e9add5e0a2ee43638eb659bc.jpg","ar":1.9827,"blur":"LkJ*elr@8_Ri~qIVITogxvM{bbt7"},{"id":"087e5129518f6cbd547f50c3e5ace0d91f924787","url":"087e5129518f6cbd547f50c3e5ace0d91f924787.jpg","ar":1.2528,"blur":"LGH.A[ITJ:_3~pxZt8%MNHM{t7V?"},{"id":"0887c4fa251a3482d82304ab303099c87f3eb3fa","url":"0887c4fa251a3482d82304ab303099c87f3eb3fa.jpg","ar":1.3722,"blur":"LGK1q84m.89F~qxuIU%MtT-;D$%L"},{"id":"08a40caf9f","url":"08a40caf9f.jpg","ar":1.6,"blur":"LNHxW;_4Mw?c~qxvxto#e-V@ofn$"},{"id":"08e7c6c0ce5ac8fbdb7461a4c75712cd0d3a7e8c","url":"08e7c6c0ce5ac8fbdb7461a4c75712cd0d3a7e8c.jpg","ar":0.8,"blur":"LDE_~$8^x]%N=^.8WARi8_%MjuWB"},{"id":"094191a64dee02e5644e472e51111bbf5f4663db","url":"094191a64dee02e5644e472e51111bbf5f4663db.jpg","ar":1.5717,"blur":"LaIq[h-:4n%M~p%LWAofj@WBaxRj"},{"id":"096c71e7b9","url":"096c71e7b9.jpg","ar":1.4993,"blur":"LMJ[Cp_3r;Ri~qoIxtxa?bM{MxjY"},{"id":"098287d9263d4540aad6b1ca0533942eecedd4b2","url":"098287d9263d4540aad6b1ca0533942eecedd4b2.jpg","ar":1.9526,"blur":"L6DcHx?vxw-4Im0LM{aKR5-oIVoy"},{"id":"09a16f36f81be708946b5d140f6c10b975c5dd62","url":"09a16f36f81be708946b5d140f6c10b975c5dd62.jpg","ar":1.498,"blur":"LHOpV.4n9FS%4nF{H?tl0L0eR5x["},{"id":"09b740d0252184e0df291a568c11f0f867b0b899","url":"09b740d0252184e0df291a568c11f0f867b0b899.jpg","ar":1.5,"blur":"LMFFTm-#9bIv~Ws+E2jvxvNHRkj="},{"id":"09e4fb21be30487ff95d14f23dd05846403d383c","url":"09e4fb21be30487ff95d14f23dd05846403d383c.jpg","ar":1.5,"blur":"LHLqLX4n?F%L?Gs,?Zt6~U-:IUD*"},{"id":"0a217058a3","url":"0a217058a3.jpg","ar":1.6678,"blur":"LOJHs_x]-p%MWVRjayof~qt7IUM{"},{"id":"0a2f5a88be9d1b3e","url":"0a2f5a88be9d1b3e.jpg","ar":1.3665,"blur":"LpL4f~Mwxut7~qM{Rka#IUWBj[WB"},{"id":"0a8c153c2b","url":"0a8c153c2b.jpg","ar":1.4981,"blur":"LjJkZLRPWBof~pjYRkt7t7axozfk"},{"id":"0a95ff4496076debdbd0c4e67486f710ff7de958","url":"0a95ff4496076debdbd0c4e67486f710ff7de958.jpg","ar":1.7786,"blur":"LKG[TQ00j^RQtn4.?a?F={NGNIM}"},{"id":"0aa1d8bdf6fe12d5","url":"0aa1d8bdf6fe12d5.jpg","ar":0.45,"blur":"LJGIWCsQIB-U~qbFRkaeE3xu-ooz"},{"id":"0ae115709800bae0a8779ffa650f698da14b5a27","url":"0ae115709800bae0a8779ffa650f698da14b5a27.jpg","ar":1.0,"blur":"LhPZ4Dx[E0slVrbwniay4TaKogjt"},{"id":"0b2ca2e0baebaf95","url":"0b2ca2e0baebaf95.jpg","ar":1.4092,"blur":"LBHU:}0K0LspW=9Ft7NG~qxt?Hjr"},{"id":"0b6bed6a9ef2b6ec2aef47cc31e87c884b986974","url":"0b6bed6a9ef2b6ec2aef47cc31e87c884b986974.jpg","ar":1.476,"blur":"LEJthz-;D%tl^+IV~p.8%29ZIVS4"},{"id":"0b8aa7492a2ae1880b2d4bc13fb8364dcac205ab","url":"0b8aa7492a2ae1880b2d4bc13fb8364dcac205ab.jpg","ar":1.7778,"blur":"LOGvIfE2vfF14To#S%#+vy-pEka$"},{"id":"0be704f472a6a87c935981b3ec47602c9bde92be","url":"0be704f472a6a87c935981b3ec47602c9bde92be.jpg","ar":1.25,"blur":"LNJ[FnOqIUjF_Nae%gRP-WxIRjoy"},{"id":"0bf7945a8cb3d2d1","url":"0bf7945a8cb3d2d1.jpg","ar":0.675,"blur":"LiGl0D%1X8t6?w%1xtayk@oes.of"},{"id":"0c174bb1b1","url":"0c174bb1b1.jpg","ar":1.5119,"blur":"L7F#p#9b9a_M~UxZ$|IC^haes+IB"},{"id":"0c234c2bed4150c52709bce6eeb0449259cb9afe","url":"0c234c2bed4150c52709bce6eeb0449259cb9afe.jpg","ar":1.3333,"blur":"LPMQ379GD%t6~VM|WCay4TxtX9s:"},{"id":"0c556d4383d64a3395fbc7394d294983aee9f634","url":"0c556d4383d64a3395fbc7394d294983aee9f634.jpg","ar":1.3344,"blur":"LEKBac?bs+kWtp-k%1o#0K~V%Lt7"},{"id":"0ca506d168","url":"0ca506d168.jpg","ar":1.2863,"blur":"LUF?FS-;b_WE%%t7o#ofE4M{ngjY"},{"id":"0cbc9d2ac8f635c3e96a84eea28580792dfce884","url":"0cbc9d2ac8f635c3e96a84eea28580792dfce884.jpg","ar":1.0,"blur":"LFIhQ#8^Mw%M%hM{NGxuE2x^xuE1"},{"id":"0d73e4dbc7","url":"0d73e4dbc7.jpg","ar":1.4144,"blur":"LFS6MZ%M?d%M-:oft7Ri?dofISRP"},{"id":"0de0a729643171c5c9fd942a7ede592f61a35bad","url":"0de0a729643171c5c9fd942a7ede592f61a35bad.jpg","ar":1.6512,"blur":"L$N11Bxu-;%M~qRiM{WB%gt7WBj]"},{"id":"0e0e1df65d2ce0a5be4baea7db4fd712023ff26b","url":"0e0e1df65d2ce0a5be4baea7db4fd712023ff26b.jpg","ar":1.5009,"blur":"LBCF|u^%-:tR9FX9WBt70LMyxvM{"},{"id":"0e62272ad930c9ac581a11dff9023c6d6d2356ea","url":"0e62272ad930c9ac581a11dff9023c6d6d2356ea.jpg","ar":0.667,"blur":"LBFYMt0K4TWB?vM{MxD*jFazNG-:"},{"id":"0e65e1ac67","url":"0e65e1ac67.jpg","ar":1.4656,"blur":"LGL4yx?v~q?G_4M_xvV@8_RjR*Io"},{"id":"0e6f868344d6f23a1fd6c9dbe46bf3d3e757870b","url":"0e6f868344d6f23a1fd6c9dbe46bf3d3e757870b.jpg","ar":1.3325,"blur":"LZFYfP~pR*IUocs:ayj[xbs:WVof"},{"id":"0e8f19b074","url":"0e8f19b074.jpg","ar":1.5306,"blur":"LUJ*hq4oM{of~pD%R*ofM|t7M{Rj"},{"id":"0ea43235685c94b98f107395f25a60cb9b011e89","url":"0ea43235685c94b98f107395f25a60cb9b011e89.jpg","ar":1.5802,"blur":"LjHL*pVXWBxu?ws8ayRktSt7ayWY"},{"id":"0ea43573788da571b4649f4621e1488137a4b7c9","url":"0ea43573788da571b4649f4621e1488137a4b7c9.jpg","ar":1.4052,"blur":"LEHxvaxDRMI:*IIpocxvIAs:xa%M"},{"id":"0ee01bd728122a1697ace2d93b2687595ccb0d41","url":"0ee01bd728122a1697ace2d93b2687595ccb0d41.jpg","ar":1.641,"blur":"LIK9}lyrD4^+%ga0WCX9KjaKS#oz"},{"id":"0f13bc9a0198fd5905cdcfb8237fbc14c8f8e256","url":"0f13bc9a0198fd5905cdcfb8237fbc14c8f8e256.jpg","ar":1.457,"blur":"LAA,qEI[8{.8~VS5M}xtMeawb;nP"},{"id":"0f1ab6e120f70c02b3ba2453b3eca3854754287f","url":"0f1ab6e120f70c02b3ba2453b3eca3854754287f.jpg","ar":1.7837,"blur":"LQFs0x?wx]IU%#tnbuV[pJtm%ft7"},{"id":"0f62efb08b","url":"0f62efb08b.jpg","ar":1.3333,"blur":"LaHBxZn34.R+%%RkROR*%Mxut7Rj"},{"id":"0f6855c9a3ec8fde3ff7ff782c7580510c9b07f4","url":"0f6855c9a3ec8fde3ff7ff782c7580510c9b07f4.jpg","ar":1.5009,"blur":"LVJkWJ%h~q%MIUaeoft8I9ofRjWB"},{"id":"0f7e16fa3de7a19c3cd70af090a899d24496ae4e","url":"0f7e16fa3de7a19c3cd70af090a899d24496ae4e.jpg","ar":1.0,"blur":"LNLgLh?aE30M0f%2jrn$?GM|%L?G"},{"id":"10451e1a838a83413ce65f273490871b2c0809c9","url":"10451e1a838a83413ce65f273490871b2c0809c9.jpg","ar":1.0,"blur":"LfI5Y-$wInt6~WWFS4WCK-NIxaRl"},{"id":"105271022eda4174d90b9aea40037ab29e802326","url":"105271022eda4174d90b9aea40037ab29e802326.jpg","ar":1.25,"blur":"LDKU4e_NRP-=?G_3.89anNt6RPxt"},{"id":"10776742fdc1fe7065295d2d3f1fe537cef1e134","url":"10776742fdc1fe7065295d2d3f1fe537cef1e134.jpg","ar":1.7773,"blur":"LFDStDI8%fM|?wIo%ft7bE%MoLs."},{"id":"10b96667fa","url":"10b96667fa.jpg","ar":1.4981,"blur":"LUJ*hu.9%Mof~q%MWEofIAIUaeR*"},{"id":"10c86fec1911d17aac66acca843f9a6ddc86c44e","url":"10c86fec1911d17aac66acca843f9a6ddc86c44e.jpg","ar":1.5054,"blur":"LRHCGtIn9E%NZ+s=bFRj4,WBxujc"},{"id":"111338df47","url":"111338df47.jpg","ar":1.9212,"blur":"LBLzy|^+_NWqu5Rj%LRjiva{Nx%2"},{"id":"113ab153ba5a3f3008cc8386a318181ad4e6fd4f","url":"113ab153ba5a3f3008cc8386a318181ad4e6fd4f.jpg","ar":1.5006,"blur":"L9F~N-aenh~qI8-o9F9ERlR+M|xu"},{"id":"115f746b04313791","url":"115f746b04313791.jpg","ar":1.0,"blur":"LJNJt9-o~p%MRjxaofay~pxtD%oJ"},{"id":"1197818c57cd32041c5dfd5385d24befba667481","url":"1197818c57cd32041c5dfd5385d24befba667481.jpg","ar":0.722,"blur":"LCC$WF^jv#Inwbe-M{sD0LNHNx%1"},{"id":"11d0bbda90080f55","url":"11d0bbda90080f55.jpg","ar":1.3571,"blur":"LID+uRIoRjWB~VR*IVWB9GxaIpaz"},{"id":"127e90aac8","url":"127e90aac8.jpg","ar":1.4993,"blur":"LSKBBuIAMwoe~U%2bIxuV[IoxZNH"},{"id":"1294ff7573e8b51e713a38cd01816215968b073e","url":"1294ff7573e8b51e713a38cd01816215968b073e.jpg","ar":1.4011,"blur":"LOH_lR_4t8jF_N%MxuaytSITRixu"},{"id":"12b1eb4e363141fa01d03040833d009676b17c91","url":"12b1eb4e363141fa01d03040833d009676b17c91.jpg","ar":1.8021,"blur":"LSEySq014:-;%fRjROt7E2xaxGWB"},{"id":"12b3821a16d99cd3025dcc2711dd2e8992acf40b","url":"12b3821a16d99cd3025dcc2711dd2e8992acf40b.jpg","ar":1.4401,"blur":"LPGb*YMeR.b_%jtnkDV?NzS*xusk"},{"id":"12ebf0d3b5","url":"12ebf0d3b5.jpg","ar":1.7668,"blur":"LTI;*O00D*IU?HRPt7xaxF%2RjM|"},{"id":"12ff65d104ad631c","url":"12ff65d104ad631c.jpg","ar":1.7778,"blur":"L%KnrNt6tRt8_4oet8t7t7t6ofRj"},{"id":"1312e94ff2","url":"1312e94ff2.jpg","ar":1.3491,"blur":"LGLNlS-n4.8__N9Gnh.8MwIT%gkC"},{"id":"1326c325cbd6f469b580076ebbc792c8488d30fc","url":"1326c325cbd6f469b580076ebbc792c8488d30fc.jpg","ar":1.7786,"blur":"LBEVse9X?IIm9YoNX6RQ4mjvk8V["},{"id":"13b205f4174fb810dc8ffe3bb830021db547f473","url":"13b205f4174fb810dc8ffe3bb830021db547f473.jpg","ar":1.3599,"blur":"LIFil4?H9YxD_Ixa-qxu~pxuD+W."},{"id":"13d72d8fe1","url":"13d72d8fe1.jpg","ar":1.3333,"blur":"LbLzppMytkx[_NWBRjaeXTMxs:t6"},{"id":"141c60ffeb","url":"141c60ffeb.jpg","ar":1.4667,"blur":"LdLW|h%2M_WC~qxZt6ay-VNaM{xZ"},{"id":"14a728c539e47070c23c87d39f571fd26703ba0f","url":"14a728c539e47070c23c87d39f571fd26703ba0f.jpg","ar":1.3344,"blur":"LJGIT3_NtS%2~W%fNIWBM_IAV?t8"},{"id":"14b817fd2e47f15194a44125a6bafb1e116250a9","url":"14b817fd2e47f15194a44125a6bafb1e116250a9.jpg","ar":1.499,"blur":"LCB3$w-=4n8_~qbIITNFM|IVxuxu"},{"id":"14bac130fa","url":"14bac130fa.jpg","ar":1.4819,"blur":"LEHU%$?utPx]-:?HRP9G00-;t7Mx"},{"id":"14c234dce46f17ac5f37853016b535cb900f9673","url":"14c234dce46f17ac5f37853016b535cb900f9673.jpg","ar":1.4376,"blur":"L8D0Jq?aI@_4I[tQ~qIV4:xu^+%M"},{"id":"150739100239c2faee914963e6a26abd01f4ff58","url":"150739100239c2faee914963e6a26abd01f4ff58.jpg","ar":1.4854,"blur":"LEGbbV.AFvAHE^^l%LEL0Kr=V@V?"},{"id":"152de8c5ae","url":"152de8c5ae.jpg","ar":1.7747,"blur":"LQKB2VIAMxoz~qRjWAxuM{xuxukC"},{"id":"1575ee00b5","url":"1575ee00b5.jpg","ar":1.2995,"blur":"LFJRHn4T-:s.?HM{9GofjbM{t8Rj"},{"id":"15df9c14cb","url":"15df9c14cb.jpg","ar":1.6,"blur":"LADI:[^,xcR-_4RiRjxb8_D%xuxa"},{"id":"16161750d314538f","url":"16161750d314538f.jpg","ar":0.6667,"blur":"LgHeRb%1Nbof_N%1xtWBXooLxZs:"},{"id":"161f9c7eef","url":"161f9c7eef.jpg","ar":1.4993,"blur":"LNJuDo0LD%Rk?baySix]W?IUxYRj"},{"id":"162b7551a0280ae84d58f0ed231b6a440b66db0a","url":"162b7551a0280ae84d58f0ed231b6a440b66db0a.jpg","ar":0.936,"blur":"LgDvvVxuW=ad.TtRt7WAk@xut7kB"},{"id":"163ecde6b8","url":"163ecde6b8.jpg","ar":1.3491,"blur":"LDRp8+j;t7tR~qogR*WC.8WEM{j?"},{"id":"163ff650396409507e0b1a6d5bc7b0012c8a9dc5","url":"163ff650396409507e0b1a6d5bc7b0012c8a9dc5.jpg","ar":1.5,"blur":"LCGS4D-:Dhd;*0MwRipI^+$yIVNH"},{"id":"16be79606a9d4610e67eb6b1f1c6e65383fb5275","url":"16be79606a9d4610e67eb6b1f1c6e65383fb5275.jpg","ar":1.0,"blur":"LAF$IqIv00%L~D%M0Kt7=r9F?bE2"},{"id":"16c718951f5bd2b194bdaed6daca339e0ea460ee","url":"16c718951f5bd2b194bdaed6daca339e0ea460ee.jpg","ar":1.5009,"blur":"LDCs1{5q-l-:NG-o%Mxa17^jxux]"},{"id":"172755c17f830d8d","url":"172755c17f830d8d.jpg","ar":0.9375,"blur":"LHEC%u9a4.n1lCM|Rj-kIwjE%MWr"},{"id":"17e09caa69388c95e1bf808a66916a5d5bf8c902","url":"17e09caa69388c95e1bf808a66916a5d5bf8c902.jpg","ar":1.7778,"blur":"LWGln$E0IAWB_4NIaxV?%$IpM_oe"},{"id":"17e9170d1ab28fe9ea5a50bfcdada87a12f61c21","url":"17e9170d1ab28fe9ea5a50bfcdada87a12f61c21.jpg","ar":1.9208,"blur":"LGGIip9F%gf5~qxuIUM|?cD*oJxt"},{"id":"17f55638b1","url":"17f55638b1.jpg","ar":1.0305,"blur":"L*EW,sROROfhyZRPaJk8RpfhjqV@"},{"id":"17fc3aa6721d8e57","url":"17fc3aa6721d8e57.jpg","ar":0.45,"blur":"LKE_%0WAE2xa~BkCNHoL^%s.xts:"},{"id":"1808b1c8d8","url":"1808b1c8d8.jpg","ar":0.75,"blur":"LYKdbyjZRP%2~qWXIVogs8s.jsRj"},{"id":"183aa5b6e79d9c8d734dc36d0256671b3ed2803a","url":"183aa5b6e79d9c8d734dc36d0256671b3ed2803a.jpg","ar":1.7897,"blur":"LPGIcmpJ4n9F0NaekEkE9xxUo#t7"},{"id":"18478a1e9b8c2e98a279546ede417ee8243dca8b","url":"18478a1e9b8c2e98a279546ede417ee8243dca8b.jpg","ar":1.0,"blur":"LCFN^z+uIpEh~o4;nOs..79aE2Sh"},{"id":"1849af8720116af4f50e5cbfa5a9a4b1d2490bea","url":"1849af8720116af4f50e5cbfa5a9a4b1d2490bea.jpg","ar":1.3333,"blur":"LDECm_0f9FM{IAE2-;xt4;-okWxu"},{"id":"184eaa723a","url":"184eaa723a.jpg","ar":1.3333,"blur":"LIIO91T0D*kX~qE2EOSOIVI;_3Nd"},{"id":"186a0e946ddaf03f5a92e92d76a537c57d48df8e","url":"186a0e946ddaf03f5a92e92d76a537c57d48df8e.jpg","ar":1.25,"blur":"L7Jt@+xR~W-;_3rA9Z%is:9FD%4."},{"id":"187564fa761923204821db8bc2438b7bc99a885b","url":"187564fa761923204821db8bc2438b7bc99a885b.jpg","ar":1.0,"blur":"LDKnlE_3f4RP%MRP%M_3M|WC_NIU"},{"id":"18958c08d8f334ce137f76905d8df4e2801bd36c","url":"18958c08d8f334ce137f76905d8df4e2801bd36c.jpg","ar":1.477,"blur":"L5S~x5~q_3_3_3of%Mof-;ayIUof"},{"id":"18ee0eb7d455f4ff878008996e8bae2852de901e","url":"18ee0eb7d455f4ff878008996e8bae2852de901e.jpg","ar":0.75,"blur":"LMHU5$0ho#tQ1RNH%MNfAv%1%2kX"},{"id":"191a686537edc4f6c1af4b29b29fac2db88afd76","url":"191a686537edc4f6c1af4b29b29fac2db88afd76.jpg","ar":1.5,"blur":"LwJ8t*jEV?og?wRms;aygPNHn$WA"},{"id":"195632a655e3b04fff339c8499d30574d87e9c95","url":"195632a655e3b04fff339c8499d30574d87e9c95.jpg","ar":1.5009,"blur":"LjL4j5o$%Lt7~qo#axofN2ngRlR*"},{"id":"19852cb1a6","url":"19852cb1a6.jpg","ar":1.4993,"blur":"LhJ86A%hxtoy~VkXxts,R+M{MxWB"},{"id":"19be1dfaab","url":"19be1dfaab.jpg","ar":0.8682,"blur":"LeCjw|MxIpWYyGRjW=azM}oft7WB"},{"id":"19d3f7dfac","url":"19d3f7dfac.jpg","ar":1.2674,"blur":"LqHCvK%L%gWY%%jYxvj[IWWBRPax"},{"id":"1a36c65d57","url":"1a36c65d57.jpg","ar":1.7297,"blur":"LED04Ssp0eo#9aWr%3r=IpNFxuj]"},{"id":"1a672ed003","url":"1a672ed003.jpg","ar":0.8652,"blur":"L~E;DyM|R.oM.TRlj]oMpJogahj["},{"id":"1ace2615d62d8862","url":"1ace2615d62d8862.jpg","ar":1.7778,"blur":"L%KnrNt6tRt8_4oet8t7t7t6ofRj"},{"id":"1adb1b7003","url":"1adb1b7003.jpg","ar":0.6667,"blur":"LlI5b*IUR*s;.Aj]s:a_?ct5M{of"},{"id":"1b69a899c2","url":"1b69a899c2.jpg","ar":1.6732,"blur":"LuH2NA~qozRjt7oLWBbHM_M{WBj["},{"id":"1bcdaa4ca5dc25a12c90de1dac6a71ca28766401","url":"1bcdaa4ca5dc25a12c90de1dac6a71ca28766401.jpg","ar":1.6598,"blur":"LHD]Yh-pRjIqnORjxuWW0LRixuxt"},{"id":"1c02f1a98fd2e39c7505066dbb24d36bef919322","url":"1c02f1a98fd2e39c7505066dbb24d36bef919322.jpg","ar":0.75,"blur":"LPLNx*%g~qt8-o-;ofRj-;xuM{V@"},{"id":"1c0a2fb619a9aae50d2cd0585436b0dc47f8e73f","url":"1c0a2fb619a9aae50d2cd0585436b0dc47f8e73f.jpg","ar":1.6667,"blur":"LSDlKRRj55S2~XRjE0bH?HR*M{of"},{"id":"1c173e621dbf0c745f883ef3b5ff37ed308e7aa7","url":"1c173e621dbf0c745f883ef3b5ff37ed308e7aa7.jpg","ar":0.6917,"blur":"LDGkn1tR~pXU58%NtRt7xrxZM{E1"},{"id":"1c4de2f922","url":"1c4de2f922.jpg","ar":1.7625,"blur":"LKD04A0Loet7%LRjWAogRkofaxog"},{"id":"1cdcca0d8dd8ce1a5d08a090c43ffe923f25917e","url":"1cdcca0d8dd8ce1a5d08a090c43ffe923f25917e.jpg","ar":1.25,"blur":"LkFZKdM|ayt7%%IVa#xux_kDj[ay"},{"id":"1d0367a3e93df452217445dbc5bf8a37d6aea978","url":"1d0367a3e93df452217445dbc5bf8a37d6aea978.jpg","ar":1.7786,"blur":"LXLqX^D%_4%NNGRj%Mt7x^WBRit7"},{"id":"1d0d3526d176d182428b84655ad015a1d5ab7fb8","url":"1d0d3526d176d182428b84655ad015a1d5ab7fb8.jpg","ar":1.0,"blur":"LQG+2D~otRxttSg3-;ofIvtSxvRk"},{"id":"1d1659341c21cb32a74a1e627f5be72f455f9109","url":"1d1659341c21cb32a74a1e627f5be72f455f9109.jpg","ar":2.0177,"blur":"LtIhjWozkXad_4xuxuWAp0t8t6bH"},{"id":"1d238de6be26fd044f39a951f5c26ce5c58b3657","url":"1d238de6be26fd044f39a951f5c26ce5c58b3657.jpg","ar":1.7786,"blur":"LBFFa7jUO@xG0M4o^*S5EL9Fw}o}"},{"id":"1d66f7f8a2","url":"1d66f7f8a2.jpg","ar":0.7363,"blur":"LiCtR}ogI[kXpMofkXbIMxj[s.ae"},{"id":"1db0f7be5c4ed774595cb1b9086c6133b319a777","url":"1db0f7be5c4ed774595cb1b9086c6133b319a777.jpg","ar":1.25,"blur":"LiKU7j9Et7%MSgx]WARj~qIAogog"},{"id":"1dfda167c5","url":"1dfda167c5.jpg","ar":1.9505,"blur":"LDR:A{.7kCxZ~qtRj[WC-=oLjut7"},{"id":"1e5b2e00e6b088a4","url":"1e5b2e00e6b088a4.jpg","ar":0.7568,"blur":"LIN,oE_N?b%N?aofR*axV@M{IUjZ"},{"id":"1ea1b5382237420c","url":"1ea1b5382237420c.jpg","ar":1.7778,"blur":"L%KeD%t5xuxu_4oet8oft7s:ofWB"},{"id":"1ef55302d7a34dcf5c11e36d008a0b69221672df","url":"1ef55302d7a34dcf5c11e36d008a0b69221672df.jpg","ar":1.5009,"blur":"LaEo}Y4nM{ay_4D%Rjt7xut7M{of"},{"id":"1f0ee9d27cdfae7745ab19815652a742d3d4a0e2","url":"1f0ee9d27cdfae7745ab19815652a742d3d4a0e2.jpg","ar":1.4988,"blur":"LkKwwh%Mb_Mx~qxt%Mt8%gRjxuX8"},{"id":"1f1a79da37","url":"1f1a79da37.jpg","ar":0.6729,"blur":"LzE:[DRnNGayyZWCofWCWtV@oKt7"},{"id":"1f4482d92f0866f2ff3887a7389d2a9f262b5fe6","url":"1f4482d92f0866f2ff3887a7389d2a9f262b5fe6.jpg","ar":1.0,"blur":"LBJkGs~CIVWU?9v|%20LxtD%V?aK"},{"id":"1f565df634","url":"1f565df634.jpg","ar":1.2234,"blur":"LJFiGWkDIUt7_N%Ms:j=^%WBM|xZ"},{"id":"1f82e601f7","url":"1f82e601f7.jpg","ar":1.4993,"blur":"LZJkis-;D%e._4M{M{t7Rjt6t7ax"},{"id":"1f8dd4779a774bcbce66821ae46295186ad86fe1","url":"1f8dd4779a774bcbce66821ae46295186ad86fe1.jpg","ar":1.0,"blur":"LNHU8;}lEmNH%%RPogoz?vR%Siog"},{"id":"1fb636c604d3bdd68ab13e4d9dbef0721d7ec664","url":"1fb636c604d3bdd68ab13e4d9dbef0721d7ec664.jpg","ar":1.25,"blur":"LJFF?K?b-=?c_3~qs+xv-;R%jcRP"},{"id":"1fbf938209","url":"1fbf938209.jpg","ar":1.4656,"blur":"LHKU1W0KyEw]ITahWDSd-;.8%Lni"},{"id":"1fc123e63e","url":"1fc123e63e.jpg","ar":1.5215,"blur":"L6RC;*tTx__1~oNLM^%Mavx_xv%N"},{"id":"1fda69d05d84b1f6e0fc9ec41ef64ce173b776d3","url":"1fda69d05d84b1f6e0fc9ec41ef64ce173b776d3.jpg","ar":1.0,"blur":"LRKw%=4Tk8NH4@%$x^9F-:?Gx]Io"},{"id":"1ff5a86b458b433f50d827e75c401fc511aa72ff","url":"1ff5a86b458b433f50d827e75c401fc511aa72ff.jpg","ar":1.2492,"blur":"LZM%}{?bIntR?wofRjxu.9ogV@oL"},{"id":"2082cb89e0c4d85d9c9880a1c522584a8d8ddd93","url":"2082cb89e0c4d85d9c9880a1c522584a8d8ddd93.jpg","ar":1.7505,"blur":"LRKnVe_NNe~q~Wx[M{V@M~Ios.Io"},{"id":"20b41f64e901bed5d61684eca322c3ca5382b50f","url":"20b41f64e901bed5d61684eca322c3ca5382b50f.jpg","ar":1.5,"blur":"LXL|}w_4W8xa~Wx]IUtRoeRkkDof"}]`);function b(e){let t=2166136261;for(let n=0;n>>0)/4294967295}function x(e){return e<650?56:96}function S(e,t){let n=Math.max(68,Math.min(168,t/10.25)),r=n*n*(.74+b(e.id+`size`)*.48),i=Math.max(.5,Math.min(2,e.ar));return{width:Math.sqrt(r*i),height:Math.sqrt(r/i)}}function ee(e,t,n,r,i){let a=Math.ceil(Math.sqrt(n*r/i)),o=Math.ceil(n/a);return{x:-35+(t%a+.5+(b(e.id+`x`)-.5)*.44)*(r+70)/a,y:-40+(Math.floor(t/a)+.5+(b(e.id+`y`)-.5)*.48)*(i+80)/o,scale:.88+b(e.id+`scale`)*.2}}function te(e,t,n,r,i){let a=t*2.399963229728653+.54,o=Math.sqrt((t+.6)/n),s=r/2+Math.cos(a)*o*r*.68,c=Math.sin(a)*o*i*.7,l=Math.max(0,1-Math.abs(s-r/2)/(r*.31));return c+=Math.sign(c||1)*l*(r<650?65:95)*(1-o*.45),{x:s,y:i/2+c,scale:.96+b(e.id+`scale`)*.18+(1-o)*.18}}function C(e,t,n,r){let i=r.x-t/2||1,a=r.y-n/2||1,o=Math.min((t/2+210)/Math.abs(i),(n/2+210)/Math.abs(a));return{x:t/2+i*o,y:n/2+a*o,scale:r.scale}}function ne(e,t){let n=Math.max(0,Math.min(1,(t-e.started)/e.duration)),r=n*n,i=r*n,a=i*n,o=a*n,s=10*i-15*a+6*o,c=n-6*i+8*a-3*o,l=64*i*(1-n)**3,u=30*r*(1-n)**2,d=1-18*r+32*i-15*a,f=192*r*(1-n)**2*(1-2*n),p=e.duration/1e3,m={},h={};for(let t of[`x`,`y`,`scale`]){let n=e.to[t]-e.from[t],r=e.velocity[t]||0,i=e.arc[t]||0;m[t]=e.from[t]+n*s+r*p*c+i*l,h[t]=n*u/p+r*d+i*f/p}return{value:m,velocity:h,done:n===1}}function w(e,t,n,r=!1){let i=e.motion?ne(e.motion,n):{value:e,velocity:{}},a={x:i.value.x,y:i.value.y,scale:i.value.scale},o=t.x-a.x,s=t.y-a.y,c=Math.hypot(o,s),l=Math.min(36,c*.055);e.motion={from:a,to:t,velocity:i.velocity,arc:{x:-s/(c||1)*l,y:o/(c||1)*l},started:n,duration:r?1:Math.min(950,600+c*.22)}}var re={opacity:1,blur:0},ie={opacity:.14,blur:2.4},ae=.02,oe=e=>1/(1+Math.exp(-14*(e-.38))),se=oe(0),ce=oe(1)-se;function le(e){if(!e.length)return()=>re;let t=e.filter(e=>Number.isFinite(e.score)),n=new Map(t.map(e=>[e.id,e.score]));if(!t.length)return()=>ie;let r=t[Math.min(5,t.length-1)].score,i=t[t.length-1].score,a=Math.max(ae,r-i);return e=>{let t=n.get(e);if(t===void 0)return ie;let i=(oe(Math.max(0,Math.min(1,1-(r-t)/a)))-se)/ce;return{opacity:.18+i*.82,blur:1.8*(1-i)**2}}}var ue=`https://huggingface.co/datasets/bep40/interior-image-field-assets/resolve/main/`;function de(e,t=360){return`${ue}images/${e.url}?w=${t}&q=80`}function fe({concurrency:e=6,cacheSize:t=64}={}){let n=[],r=[],i=new Set,a=new Map,o=!1,s=0,c=!1;function l(e){if(!e?.naturalWidth||!e.src||o)return;let n=e.src;a.delete(n),a.set(n,e),a.size>t&&a.delete(a.keys().next().value)}function u(){s=0;for(let e=0;e<2&&r.length;e++){let e=r.shift();e.cancelled?l(e.image):e.receive(e.image)}r.length&&(s=requestAnimationFrame(u))}function d(e){r.push(e),s||=requestAnimationFrame(u)}function f(){if(!o)for(n.sort((e,t)=>e.priority-t.priority);i.size{o||(e.cancelled?l(t):d(e))}).catch(()=>{}).finally(()=>{i.delete(e),f()})}}return{request(e,t,r=1e3){let i={url:e,receive:t,priority:r,cancelled:!1,image:null},o=a.get(e);return o?(a.delete(e),i.image=o,d(i)):(n.push(i),c||(c=!0,queueMicrotask(()=>{c=!1,f()}))),{cancel(){i.cancelled=!0;let e=n.indexOf(i);e>=0&&n.splice(e,1)},prioritize(e){i.priority=e}}},release:l,dispose(){o=!0,cancelAnimationFrame(s);for(let e of i)e.cancelled=!0,e.image.removeAttribute(`src`);n.length=r.length=0,a.clear()}}}var pe=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~`;function me(e){if(!e||e.length<6)return`#252823`;let t=0;for(let n of e.slice(2,6)){let e=pe.indexOf(n);if(e<0)return`#252823`;t=t*83+e}return`#${(t&16777215).toString(16).padStart(6,`0`)}`}function he(e,t=1,n=1){return Math.min(512,Math.max(256,Math.ceil(e*Math.max(t,1.25)*Math.min(n,2)/128)*128))}function ge(){let e=new Map,t=new Map,n;try{n=new Worker(new URL(new URL(`placeholder.worker-DNqHbwAK.js`,import.meta.url).href,``+import.meta.url),{type:`module`})}catch{}return n&&(n.onmessage=({data:{hash:n,url:r}})=>{e.delete(n),e.set(n,r),e.size>512&&e.delete(e.keys().next().value);for(let e of t.get(n)||[])e(r);t.delete(n)},n.onerror=()=>{n.terminate(),n=null,t.clear()}),{request(r,i){if(!r||!n)return()=>{};if(e.has(r))return i(e.get(r)),()=>{};let a=t.get(r);return a||(a=new Set,t.set(r,a),n.postMessage(r)),a.add(i),()=>a.delete(i)},dispose(){n?.terminate(),t.clear(),e.clear()}}}var _e=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),T=o(((e,t)=>{t.exports=_e()}))();function ve({results:e,onSelect:t,paused:n}){let r=(0,_.useRef)(null),i=(0,_.useRef)(null),a=(0,_.useRef)(t);return a.current=t,(0,_.useEffect)(()=>{let e=r.current,t=new Map,n=fe(),o=ge(),s=matchMedia(`(prefers-reduced-motion: reduce)`),c={width:e.clientWidth,height:e.clientHeight,results:[],pool:[],paused:!1,pointer:{x:0,y:0},x:0,y:0},l,u=performance.now(),d=0;function f(n,r,i=!1){let s=document.createElement(`button`);s.className=`image-tile`,s.type=`button`,s.dataset.imageId=n.id,s.style.backgroundColor=me(n.blur),s.style.zIndex=1+Math.floor(b(n.id)*100),e.append(s);let l=i?r:C(n,c.width,c.height,r),u={image:n,button:s,...l,target:l,motion:null,exit:!1,phase:b(n.id)*Math.PI*2};return p(u),s.style.transform=`translate3d(${l.x-u.width/2}px,${l.y-u.height/2}px,0) scale(${l.scale})`,t.set(n.id,u),u.cancelPlaceholder=o.request(n.blur,e=>{e&&t.get(n.id)===u&&!u.photo&&(s.style.backgroundImage=`url("${e}")`)}),s.onclick=()=>a.current({...n,previewURL:u.photo?.currentSrc||u.photo?.src},s.getBoundingClientRect().toJSON()),u}function p(e){let{width:t,height:n}=S(e.image,c.width);(e.width!==t||e.height!==n)&&(e.width=t,e.height=n,e.button.style.width=`${t}px`,e.button.style.height=`${n}px`)}function m(e){e.load?.cancel(),e.cancelPlaceholder?.(),e.button.remove(),e.photo&&(e.photo.remove(),n.release(e.photo)),t.delete(e.image.id)}function h(e,r){let i=de(e.image,he(e.width,e.target.scale,window.devicePixelRatio||1));e.load=n.request(i,r=>{if(e.load=null,e.exit||t.get(e.image.id)!==e){n.release(r);return}r.alt=``,r.draggable=!1,r.className=``,e.photo=r,e.button.append(r),s.matches||r.animate([{opacity:0},{opacity:1}],{duration:180,easing:`ease-out`}),r.classList.add(`loaded`)},r)}function g(e=!1){let n=performance.now(),r=new Set(c.pool.map(e=>e.id)),i=new Map(c.results.map((e,t)=>[e.id,t])),a=c.pool.map((e,t)=>c.results.length?te(e,t,c.pool.length,c.width,c.height):ee(e,t,c.pool.length,c.width,c.height)),o=le(c.results);c.pool.forEach((r,l)=>{let u=a[l],d=t.get(r.id)||f(r,u,e);d.target=u,d.exit=!1,d.button.removeAttribute(`aria-hidden`);let m=i.get(r.id);p(d),!d.photo&&!d.load&&h(d,m??200+l),d.load?.prioritize(m??200+l),d.button.setAttribute(`aria-label`,m==null?`Phóng to ảnh`:`Phóng to kết quả ${m+1}`),d.button.setAttribute(`aria-haspopup`,`dialog`);let{opacity:g,blur:_}=o(r.id);d.button.style.setProperty(`--relevance-opacity`,g),d.button.style.setProperty(`--relevance-blur`,`${_}px`),d.button.dataset.rank=m==null?``:m+1,d.button.tabIndex=c.results.length?m!=null&&m<12?0:-1:l<12?0:-1,w(d,u,n,e||s.matches)});for(let[e,i]of t)r.has(e)||i.exit||(i.exit=!0,i.load?.cancel(),i.load=null,i.button.setAttribute(`aria-hidden`,`true`),i.button.dataset.rank=``,i.button.tabIndex=-1,w(i,C(i.image,c.width,c.height,i),n,s.matches))}function _(e){let t=x(c.width),n=new Set,r=e.length?[...e,...c.pool,...y]:y,i=[];for(let e of r)if(!n.has(e.id)&&(n.add(e.id),i.push(e),i.length===t))break;c.results=e,c.pool=i,g()}function v(e){let n=e-u,r=Math.min(n/1e3,.04);if(u=e,c.paused){for(let e of t.values())e.motion&&(e.motion.started+=n);l=requestAnimationFrame(v);return}document.hidden||(d+=r);let i=1-Math.exp(-4*r);c.x+=(c.pointer.x-c.x)*i,c.y+=(c.pointer.y-c.y)*i;for(let n of t.values()){let t=!0;if(n.motion){let r=ne(n.motion,s.matches?1/0:e);Object.assign(n,r.value),t=r.done,t&&(n.motion=null)}if(n.exit&&t){m(n);continue}let r=n.phase,i=s.matches?0:Math.sin(d*.22+r)*3+c.x*7,a=s.matches?0:Math.cos(d*.18+r)*3+c.y*7;n.button.style.transform=`translate3d(${(n.x-n.width/2+i).toFixed(2)}px,${(n.y-n.height/2+a).toFixed(2)}px,0) scale(${n.scale.toFixed(4)})`,n.button.style.pointerEvents=n.exit?`none`:``}l=requestAnimationFrame(v)}c.pool=y.slice(0,x(c.width)),g(!0);let re=new ResizeObserver(([e])=>{let{width:t,height:n}=e.contentRect;(t!==c.width||n!==c.height)&&(c.width=t,c.height=n,_(c.results))});re.observe(e);let ie=e=>{e.pointerType!==`touch`&&(c.pointer.x=(e.clientX/c.width-.5)*2,c.pointer.y=(e.clientY/c.height-.5)*2)},ae=()=>{c.pointer.x=c.pointer.y=0};return e.addEventListener(`pointermove`,ie),e.addEventListener(`pointerleave`,ae),l=requestAnimationFrame(v),i.current={state:c,update:_},()=>{cancelAnimationFrame(l),re.disconnect(),e.removeEventListener(`pointermove`,ie),e.removeEventListener(`pointerleave`,ae),n.dispose(),o.dispose(),e.replaceChildren(),i.current=null}},[]),(0,_.useEffect)(()=>{i.current?.update(e)},[e]),(0,_.useEffect)(()=>{i.current&&(i.current.state.paused=n)},[n]),(0,T.jsx)(`div`,{className:`image-field`,ref:r,"aria-label":`Photograph collection`})}function ye({photo:e,onClose:t}){let n=(0,_.useRef)(null),r=(0,_.useRef)(null),i=(0,_.useRef)(!1),a=(0,_.useRef)([]),o=(0,_.useRef)(null),[s,c]=(0,_.useState)(!1),[l,u]=(0,_.useState)(!1),d=(0,_.useCallback)(()=>{let t=r.current.getBoundingClientRect(),n=e.origin;return!n||!t.width||!t.height?`scale(.96)`:`translate(${n.x+n.width/2-t.x-t.width/2}px, ${n.y+n.height/2-t.y-t.height/2}px) scale(${n.width/t.width}, ${n.height/t.height})`},[e.origin]);(0,_.useEffect)(()=>{let e=document.activeElement;return n.current.showModal(),matchMedia(`(prefers-reduced-motion: reduce)`).matches||(a.current=[r.current.animate([{transform:d(),opacity:.7},{transform:`none`,opacity:1}],{duration:560,easing:`cubic-bezier(.22,1,.36,1)`})]),()=>{a.current.forEach(e=>e.cancel()),e?.isConnected&&e.focus({preventScroll:!0})}},[d]),(0,_.useLayoutEffect)(()=>{let e=o.current;if(o.current=null,!e||matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=r.current.getBoundingClientRect();a.current=[r.current.animate([{transform:`translate(${e.x+e.width/2-t.x-t.width/2}px, ${e.y+e.height/2-t.y-t.height/2}px) scale(${e.width/t.width}, ${e.height/t.height})`},{transform:`none`}],{duration:460,easing:`cubic-bezier(.22,1,.36,1)`})]},[l]);let f=(0,_.useCallback)(async()=>{if(!i.current){if(i.current=!0,!matchMedia(`(prefers-reduced-motion: reduce)`).matches){let e=getComputedStyle(r.current).transform;a.current.forEach(e=>e.cancel());let t=r.current.animate([{transform:e===`none`?`none`:e,opacity:1},{transform:d(),opacity:0}],{duration:320,easing:`cubic-bezier(.4,0,.2,1)`,fill:`forwards`});a.current=[t],n.current.classList.add(`is-closing`),await t.finished.catch(()=>{})}t()}},[t,d]);return(0,T.jsxs)(`dialog`,{ref:n,className:`photo-viewer`,"aria-label":`Ảnh toàn màn hình`,onCancel:e=>{e.preventDefault(),f()},onClick:e=>{e.target===n.current&&f()},children:[(0,T.jsxs)(`div`,{className:`photo-toolbar`,children:[e.source?(0,T.jsx)(`a`,{href:e.source,target:`_blank`,rel:`noreferrer`,children:`View source ↗`}):(0,T.jsx)(`span`,{className:`photo-origin`,children:(e.categories||[])[0]||e.title||`Interior design`}),(0,T.jsx)(`button`,{type:`button`,"aria-label":`Đóng ảnh`,autoFocus:!0,onClick:f,children:(0,T.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,T.jsx)(`path`,{d:`m6 6 12 12M6 18 18 6`})})})]}),(0,T.jsx)(`div`,{className:`photo-viewport ${l?`is-zoomed`:``}`,onClick:e=>{e.target===e.currentTarget&&f()},children:(0,T.jsx)(`button`,{ref:r,type:`button`,className:`photo-frame`,"aria-label":l?`Thu nhỏ`:`Phóng to ảnh`,"aria-pressed":l,style:{"--photo-ar":e.ar,backgroundImage:`url("${e.previewURL||de(e,640)}")`},onClick:()=>{o.current=r.current.getBoundingClientRect(),a.current.forEach(e=>e.cancel()),u(e=>!e)},children:(0,T.jsx)(`img`,{src:de(e,2400),alt:`Ảnh nội thất đã phóng to`,className:s?`loaded`:``,onLoad:()=>c(!0)})})})]})}var be=new URL(`products-index.json`,document.baseURI).href,xe=`https://huggingface.co/datasets/bep40/interior-image-field-assets/resolve/main/`;function Se(e){return!e||typeof e!=`string`?``:e.startsWith(`prodimgs/`)?xe+e:e}var Ce=`interior-image-field-products-v1`,we=216e5,E=new URL(`products-gallery.json.gz`,document.baseURI).href,D=new URL(`products-gallery.json`,document.baseURI).href,Te=null;async function Ee(e){let t=await fetch(e);if(!t.ok)return null;if(typeof DecompressionStream==`function`)try{let e=t.body.pipeThrough(new DecompressionStream(`gzip`));return await new Response(e).json()}catch{return t.json().catch(()=>null)}return t.json().catch(()=>null)}async function De(){let e=await Ee(E).catch(()=>null);if(e&&e.items)return e;let t=await fetch(D).then(e=>e.ok?e.json():null).catch(()=>null);return t&&t.items?t:null}async function Oe(e){if(!e)return null;Te||=De().catch(()=>null);let t=await Te;return!t||!t.items?null:t.items[e]||null}var O=e=>String(e??``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase().trim(),k=e=>{let t=String(e??``).replace(/[^\d]/g,``);return t?Number(t):null};function ke(e,t){let n=O(t);if(!n)return e;let r=n.split(/\s+/).filter(Boolean),i=/^\d[\d.\s]*$/.test(n.replace(/\s/g,``))?k(n):null,a=[];for(let t of e){if(i!=null){if(k(t.price)!==i)continue;a.push({product:t,score:1e3});continue}let e=t.haystack,o=O(t.sku),s=O(t.name),c=O(t.brand);if(!r.every(t=>e.includes(t)))continue;let l=0;o&&(o===n?l+=1200:o.startsWith(n)?l+=600:o.includes(n)&&(l+=300)),s.includes(n)&&(l+=250),c&&c===n?l+=200:c&&c.includes(n)&&(l+=80);for(let t of r)o.includes(t)&&(l+=60),s.includes(t)&&(l+=40),c.includes(t)&&(l+=15),e.includes(t)&&(l+=6);a.push({product:t,score:l})}return a.sort((e,t)=>t.score-e.score||e.product.name.localeCompare(t.product.name,`vi`)),a.map(e=>e.product)}var Ae=null;async function je({force:e=!1}={}){if(Ae)return Ae;Ae=(async()=>{let t=Ne();if(!e&&t&&Date.now()-t.savedAt`${e} ${t}`).join(` `),n=O([e.name,e.sku,e.brand,e.price,e.category,(e.feats||[]).join(` `),t].join(` `)),r=(e.images||[]).map(Se).filter(Boolean);return{...e,images:r,haystack:n}}function Ne(){try{let e=localStorage.getItem(Ce);if(!e)return null;let t=JSON.parse(e);return!Array.isArray(t?.products)||!t.products.length?null:t}catch{return null}}function Pe(e){try{let t=e.map(({haystack:e,...t})=>t);localStorage.setItem(Ce,JSON.stringify({savedAt:Date.now(),products:t}))}catch{try{localStorage.removeItem(Ce)}catch{}}}var Fe=48;function Ie({product:e,onOpen:t,eager:n}){let[r,i]=(0,_.useState)(!1),a=e.images?.[0];return(0,T.jsxs)(`button`,{type:`button`,className:`product-card`,onClick:()=>t(e),"aria-label":`Xem ${e.name}`,children:[a&&!r?(0,T.jsx)(`img`,{src:a,alt:``,loading:n?`eager`:`lazy`,decoding:`async`,onError:()=>i(!0)}):(0,T.jsx)(`span`,{className:`product-no-image`,"aria-hidden":`true`,children:`Chưa có ảnh`}),(0,T.jsxs)(`span`,{className:`product-card-body`,children:[e.brand&&(0,T.jsx)(`span`,{className:`product-brand`,children:e.brand}),(0,T.jsx)(`span`,{className:`product-name`,children:e.name}),e.price?(0,T.jsx)(`span`,{className:`product-price`,children:e.price}):e.sku&&(0,T.jsx)(`span`,{className:`product-sku`,children:e.sku})]})]})}function Le({open:e,onClose:t,onOpenDetail:n}){let[r,i]=(0,_.useState)(null),[a,o]=(0,_.useState)(null),[s,c]=(0,_.useState)(``),[l,u]=(0,_.useState)(``),[d,f]=(0,_.useState)(Fe),p=(0,_.useRef)(null);(0,_.useEffect)(()=>{if(!e||r)return;let t=!0;return je().then(e=>{t&&i(e)}).catch(e=>{t&&o(e.message)}),()=>{t=!1}},[e,r]),(0,_.useEffect)(()=>{if(e){f(Fe);let e=setTimeout(()=>p.current?.focus(),60);return()=>clearTimeout(e)}},[e]);let m=(0,_.useMemo)(()=>{if(!r)return[];let e=new Map;for(let t of r)t.brand&&e.set(t.brand,(e.get(t.brand)||0)+1);return[...e.entries()].sort((e,t)=>t[1]-e[1]).map(([e])=>e)},[r]),h=(0,_.useMemo)(()=>r?ke(l?r.filter(e=>e.brand===l):r,s):[],[r,s,l]);return e?(0,T.jsxs)(`div`,{className:`product-panel`,role:`dialog`,"aria-label":`Tư vấn nhanh sản phẩm`,"aria-modal":`false`,children:[(0,T.jsxs)(`header`,{className:`product-panel-head`,children:[(0,T.jsxs)(`div`,{className:`product-panel-title`,children:[(0,T.jsx)(`h2`,{children:`Tư vấn nhanh`}),r&&(0,T.jsxs)(`span`,{className:`product-count`,children:[s||l?`${h.length.toLocaleString()} / `:``,r.length.toLocaleString(),` sản phẩm`]})]}),(0,T.jsx)(`form`,{className:`product-search`,role:`search`,onSubmit:e=>e.preventDefault(),children:(0,T.jsx)(`input`,{ref:p,type:`search`,value:s,onChange:e=>{c(e.target.value),f(Fe)},placeholder:`Tìm theo tên, mã, thương hiệu…`,"aria-label":`Tìm sản phẩm`,autoComplete:`off`})}),(0,T.jsx)(`button`,{type:`button`,className:`product-close`,onClick:t,"aria-label":`Đóng danh sách sản phẩm`,children:`✕`})]}),m.length>0&&(0,T.jsxs)(`div`,{className:`product-brands`,role:`group`,"aria-label":`Lọc theo thương hiệu`,children:[(0,T.jsx)(`button`,{type:`button`,className:l?``:`active`,onClick:()=>{u(``),f(Fe)},children:`Tất cả`}),m.map(e=>(0,T.jsx)(`button`,{type:`button`,className:l===e?`active`:``,onClick:()=>{u(e),f(Fe)},children:e},e))]}),(0,T.jsxs)(`div`,{className:`product-body`,children:[a&&(0,T.jsxs)(`p`,{className:`product-empty`,children:[`Không tải được danh sách sản phẩm: `,a]}),!a&&!r&&(0,T.jsx)(`p`,{className:`product-empty`,children:`Đang tải danh sách sản phẩm…`}),r&&h.length===0&&(0,T.jsx)(`p`,{className:`product-empty`,children:`Không tìm thấy sản phẩm phù hợp.`}),r&&h.length>0&&(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`div`,{className:`product-grid`,children:h.slice(0,d).map((e,t)=>(0,T.jsx)(Ie,{product:e,onOpen:n,eager:td&&(0,T.jsxs)(`button`,{type:`button`,className:`product-more`,onClick:()=>f(e=>e+Fe),children:[`Xem thêm `,Math.min(Fe,h.length-d).toLocaleString(),` sản phẩm`,(0,T.jsxs)(`span`,{className:`product-more-total`,children:[`(`,(h.length-d).toLocaleString(),` còn lại)`]})]})]})]})]}):null}function Re({product:e,onClose:t}){let[n,r]=(0,_.useState)(0),[i,a]=(0,_.useState)({}),[o,s]=(0,_.useState)(null);if((0,_.useEffect)(()=>{r(0),a({})},[e]),(0,_.useEffect)(()=>{if(!e)return;let t=!0;return s(null),Oe(e.key).then(e=>{t&&s(e)}),()=>{t=!1}},[e]),(0,_.useEffect)(()=>{if(!e)return;let n=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,n),()=>window.removeEventListener(`keydown`,n)},[e,t]),!e)return null;let c=[...e.images||[],...(o?.images||[]).map(Se)].filter((e,t,n)=>e&&n.indexOf(e)===t),l=c[n],u=o?.specs||e.specs||[],d=o?.summary||e.summary||``,f=o?.feats||e.feats||[];return(0,T.jsxs)(`div`,{className:`product-detail`,role:`dialog`,"aria-label":e.name,children:[(0,T.jsx)(`button`,{type:`button`,className:`product-detail-backdrop`,onClick:t,"aria-label":`Đóng`}),(0,T.jsxs)(`div`,{className:`product-detail-panel`,children:[(0,T.jsx)(`button`,{type:`button`,className:`product-detail-close`,onClick:t,"aria-label":`Đóng`,children:`✕`}),(0,T.jsxs)(`div`,{className:`product-detail-media`,children:[l&&!i[l]?(0,T.jsx)(`img`,{src:l,alt:e.name,onError:()=>a(e=>({...e,[l]:!0}))}):(0,T.jsx)(`div`,{className:`product-detail-noimage`,children:`Không có ảnh sản phẩm`}),c.length>1&&(0,T.jsx)(`div`,{className:`product-thumbs`,children:c.map((e,t)=>(0,T.jsx)(`button`,{type:`button`,className:t===n?`active`:``,onClick:()=>r(t),"aria-label":`Ảnh ${t+1}`,children:(0,T.jsx)(`img`,{src:e,alt:``,loading:`lazy`,onError:()=>a(t=>({...t,[e]:!0}))})},e+t))})]}),(0,T.jsxs)(`div`,{className:`product-detail-info`,children:[e.brand&&(0,T.jsx)(`span`,{className:`product-detail-brand`,children:e.brand}),(0,T.jsx)(`h3`,{children:e.name}),(0,T.jsxs)(`div`,{className:`product-detail-meta`,children:[e.price&&(0,T.jsx)(`span`,{className:`product-detail-price`,children:e.price}),e.sku&&(0,T.jsxs)(`span`,{className:`product-detail-sku`,children:[`Mã: `,e.sku]})]}),e.link&&(0,T.jsx)(`a`,{className:`product-detail-link`,href:e.link,target:`_blank`,rel:`noreferrer`,children:`Xem trên website →`}),d&&(0,T.jsx)(`p`,{className:`product-detail-summary`,children:d}),f.length>0&&(0,T.jsx)(`div`,{className:`product-detail-feats`,children:f.map(e=>(0,T.jsx)(`span`,{children:e},e))}),u.length>0&&(0,T.jsxs)(`table`,{className:`product-detail-specs`,children:[(0,T.jsx)(`caption`,{children:`Thông số kỹ thuật`}),(0,T.jsx)(`tbody`,{children:u.map(([e,t],n)=>(0,T.jsxs)(`tr`,{children:[(0,T.jsx)(`th`,{scope:`row`,children:e}),(0,T.jsx)(`td`,{children:t})]},e+n))})]})]})]})]})}function ze(){return(0,T.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,T.jsx)(`path`,{d:`m7 7 10 10M7 17 17 7`})})}function Be(){let[e,t]=(0,_.useState)(``),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)({phase:`idle`,label:``}),[o,s]=(0,_.useState)(!1),[c,l]=(0,_.useState)(null),[u,d]=(0,_.useState)(!1),[f,p]=(0,_.useState)(null),[m,h]=(0,_.useState)(1222),g=(0,_.useRef)(null),v=(0,_.useRef)(null),y=(0,_.useRef)(0),b=(0,_.useRef)(!1),x=(0,_.useRef)(null);(0,_.useEffect)(()=>{let e=new Worker(new URL(new URL(`worker-DHCTNpZY.js`,import.meta.url).href,``+import.meta.url),{type:`module`});g.current=e,e.onmessage=({data:e})=>{e.status===`loading`&&a({phase:`loading`,label:e.label,progress:e.progress}),e.status===`ready`&&(b.current=!0,a({phase:`ready`,label:``}),h(e.count)),e.status===`complete`&&e.id===y.current&&(r(e.output),s(!1),a({phase:`ready`,label:``,elapsed:e.elapsed}),x.current?.resolve({query:e.text,matches:e.output.slice(0,12).map(({id:e,score:t})=>({id:e,score:t})),elapsedMs:Math.round(e.elapsed)}),x.current=null),e.status===`error`&&(e.id==null||e.id===y.current)&&(a({phase:`error`,label:e.message}),s(!1),x.current?.reject(Error(e.message)),x.current=null)},e.onerror=e=>{a({phase:`error`,label:e.message||`Search could not start. Please reload and try again.`}),s(!1),x.current?.reject(Error(`Search worker failed.`)),x.current=null};let t=setTimeout(()=>e.postMessage({type:`init`}),900);return()=>{clearTimeout(t),e.terminate()}},[]);let S=(0,_.useCallback)(e=>{x.current?.reject(Error(`Search superseded by a newer query.`)),x.current=null,t(e),l(null);let n=++y.current,i=e.trim();if(!i){g.current?.postMessage({type:`clear`}),r([]),s(!1);return}s(!0),g.current?.postMessage({type:`search`,text:i,id:n})},[]);(0,_.useEffect)(()=>{let e=e=>{if(!f&&!(c||e.metaKey||e.ctrlKey||e.altKey)){if(e.key===`Escape`&&u){d(!1);return}e.key===`/`&&e.target.tagName!==`INPUT`&&(e.preventDefault(),v.current?.focus()),e.key===`p`&&e.target.tagName!==`INPUT`&&d(e=>!e),e.key===`Escape`&&(S(``),v.current?.blur())}};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[c,S,u,f]),(0,_.useEffect)(()=>{let e=document.modelContext;if(!e?.registerTool)return;let t=new AbortController,n={name:`search_images`,title:`Tìm ảnh nội thất`,description:`Tìm ảnh nội thất theo ý nghĩa và sắp xếp lại trường ảnh đang hiển thị. Truy vấn rỗng sẽ khôi phục bộ sưu tập.`,inputSchema:{type:`object`,properties:{query:{type:`string`,maxLength:300}},required:[`query`],additionalProperties:!1},annotations:{readOnlyHint:!1,untrustedContentHint:!1},execute:async({query:e})=>{if(typeof e!=`string`||e.length>300)throw Error(`Query must be a string of at most 300 characters.`);return S(e),e.trim()?new Promise((e,t)=>{x.current={resolve:e,reject:t}}):(await new Promise(e=>requestAnimationFrame(e)),{query:``,reset:!0})}};try{Promise.resolve(e.registerTool(n,{signal:t.signal})).catch(console.warn)}catch{}return()=>t.abort()},[S]);let ee=i.phase===`loading`,te=i.phase===`error`;return(0,T.jsxs)(`main`,{className:`app relative isolate h-dvh w-full overflow-hidden`,children:[(0,T.jsx)(ve,{results:n,paused:!!c,onSelect:(e,t)=>l({...e,origin:t})}),(0,T.jsx)(`div`,{className:`vignette`,"aria-hidden":`true`}),(0,T.jsx)(`div`,{className:`grain`,"aria-hidden":`true`}),(0,T.jsxs)(`section`,{className:`search-center`,"aria-label":`Tìm kiếm ảnh ngữ nghĩa`,children:[(0,T.jsxs)(`form`,{className:`search-pill`,role:`search`,onSubmit:t=>{t.preventDefault(),S(e)},children:[(0,T.jsx)(`input`,{ref:v,type:`text`,value:e,placeholder:`Tìm ảnh nội thất…`,"aria-label":`Tìm ảnh nội thất theo ý nghĩa`,"aria-describedby":`search-status`,autoComplete:`off`,spellCheck:`false`,maxLength:300,onChange:e=>S(e.target.value)}),e&&(0,T.jsx)(`button`,{type:`button`,className:`clear-button`,"aria-label":`Xoá tìm kiếm`,onClick:()=>{S(``),v.current?.focus()},children:(0,T.jsx)(ze,{})}),(0,T.jsx)(`div`,{className:`search-progress ${ee||o?`visible`:``}`,"aria-hidden":`true`,children:(0,T.jsx)(`span`,{style:{width:ee&&i.progress?`${i.progress}%`:`35%`}})})]}),(0,T.jsx)(`div`,{id:`search-status`,className:`search-status ${te?`has-error`:``}`,role:`status`,"aria-live":`polite`,children:te?(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`span`,{children:`Không tải được bộ tìm kiếm.`}),(0,T.jsx)(`button`,{onClick:()=>{a({phase:`loading`,label:`Retrying`}),g.current?.postMessage({type:`init`}),e.trim()&&S(e)},children:`Thử lại`}),(0,T.jsx)(`span`,{className:`error-detail`,children:i.label})]}):ee?(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`span`,{className:`status-dot`}),i.label,i.progress==null?``:` · ${Math.round(i.progress)}%`]}):o?(0,T.jsx)(`span`,{className:`sr-only`,children:`Searching`}):null})]}),(0,T.jsxs)(`footer`,{className:`footer pointer-events-none absolute inset-x-0 bottom-0 flex items-center justify-between`,children:[(0,T.jsxs)(`a`,{className:`pointer-events-auto`,href:`https://github.com/huggingface/transformers.js-examples/tree/main/semantic-image-search-web`,target:`_blank`,rel:`noreferrer`,children:[`Transformers.js `,(0,T.jsx)(`span`,{className:`version`,children:`4.3.0`})]}),(0,T.jsxs)(`button`,{type:`button`,className:`footer-catalog pointer-events-auto`,onClick:()=>d(e=>!e),"aria-expanded":u,children:[u?`Đóng danh sách`:`Tư vấn nhanh`,` `,(0,T.jsx)(`kbd`,{children:`P`})]}),(0,T.jsxs)(`span`,{children:[m.toLocaleString(),` images `,(0,T.jsx)(`span`,{className:`footer-divider`,children:`/`}),` `,b.current?`On-device search`:`Semantic search`]})]}),u&&(0,T.jsx)(Le,{open:!0,onClose:()=>d(!1),onOpenDetail:p}),f&&(0,T.jsx)(Re,{product:f,onClose:()=>p(null)}),c&&(0,T.jsx)(ye,{photo:c,onClose:()=>l(null)})]})}(0,v.createRoot)(document.getElementById(`root`)).render((0,T.jsx)(Be,{})); \ No newline at end of file diff --git a/dist/assets/index-CigEzVrZ.js b/dist/assets/index-CigEzVrZ.js new file mode 100644 index 0000000000000000000000000000000000000000..45438bf3259bf6199f8ca1fe23cde253a43a4a69 --- /dev/null +++ b/dist/assets/index-CigEzVrZ.js @@ -0,0 +1,9 @@ +var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.for(`react.view_transition`),m=Symbol.iterator;function h(e){return typeof e!=`object`||!e?null:(e=m&&e[m]||e[`@@iterator`],typeof e==`function`?e:null)}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function y(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function b(){}b.prototype=y.prototype;function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}var S=x.prototype=new b;S.constructor=x,_(S,y.prototype),S.isPureReactComponent=!0;var ee=Array.isArray;function te(){}var C={H:null,A:null,T:null,S:null},ne=Object.prototype.hasOwnProperty;function w(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return w(e.type,t,e.props)}function ie(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ae(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var oe=/\/+/g;function se(e,t){return typeof e==`object`&&e&&e.key!=null?ae(``+e.key):t.toString(36)}function ce(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(te,te):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function le(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,le(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+se(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(oe,`$&/`)+`/`),le(o,r,i,``,function(e){return e})):o!=null&&(ie(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(oe,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,S||(S=!0,re());else{var t=n(l);t!==null&&oe(x,t.startTime-e)}}}var S=!1,ee=-1,te=5,C=-1;function ne(){return g?!0:!(e.unstable_now()-Ct&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&oe(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?re():S=!1}}}var re;if(typeof y==`function`)re=function(){y(w)};else if(typeof MessageChannel<`u`){var ie=new MessageChannel,ae=ie.port2;ie.port1.onmessage=w,re=function(){ae.postMessage(null)}}else re=function(){_(w,0)};function oe(t,n){ee=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(ee),ee=-1):h=!0,oe(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,re()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1De||(e.current=Ee[De],Ee[De]=null,De--)}function k(e,t){De++,Ee[De]=e.current,e.current=t}var ke=Oe(null),Ae=Oe(null),je=Oe(null),Me=Oe(null);function Ne(e,t){switch(k(je,t),k(Ae,e),k(ke,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?up(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=up(t),e=dp(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}O(ke),k(ke,e)}function Pe(){O(ke),O(Ae),O(je)}function Fe(e){var t=e.memoizedState;t!==null&&(sh._currentValue=t.memoizedState,k(Me,e)),t=ke.current;var n=dp(t,e.type);t!==n&&(k(Ae,e),k(ke,n))}function Ie(e){Ae.current===e&&(O(ke),O(Ae)),Me.current===e&&(O(Me),sh._currentValue=Te)}var Le,Re;function ze(e){if(Le===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Le=t&&t[1]||``,Re=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Be=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?ze(n):``}function He(e,t){switch(e.tag){case 26:case 27:case 5:return ze(e.type);case 16:return ze(`Lazy`);case 13:return e.child!==t&&t!==null?ze(`Suspense Fallback`):ze(`Suspense`);case 19:return ze(`SuspenseList`);case 0:case 15:return Ve(e.type,!1);case 11:return Ve(e.type.render,!1);case 1:return Ve(e.type,!0);case 31:return ze(`Activity`);case 30:return ze(`ViewTransition`);default:return``}}function Ue(e){try{var t=``,n=null;do t+=He(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var We=Object.prototype.hasOwnProperty,Ge=t.unstable_scheduleCallback,Ke=t.unstable_cancelCallback,qe=t.unstable_shouldYield,Je=t.unstable_requestPaint,Ye=t.unstable_now,Xe=t.unstable_getCurrentPriorityLevel,Ze=t.unstable_ImmediatePriority,Qe=t.unstable_UserBlockingPriority,$e=t.unstable_NormalPriority,et=t.unstable_LowPriority,tt=t.unstable_IdlePriority,nt=t.log,rt=t.unstable_setDisableYieldValue,it=null,at=null;function ot(e){if(typeof nt==`function`&&rt(e),at&&typeof at.setStrictMode==`function`)try{at.setStrictMode(it,e)}catch{}}var st=Math.clz32?Math.clz32:ut,ct=Math.log,lt=Math.LN2;function ut(e){return e>>>=0,e===0?32:31-(ct(e)/lt|0)|0}var dt=256,ft=262144,pt=4194304;function mt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ht(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=mt(n))):i=mt(o):i=mt(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=mt(n))):i=mt(o)):i=mt(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function gt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function _t(e,t){t&8&&(t|=t&32);var n=e.entangledLanes;if(n!==0)for(e=e.entanglements,n&=t;0n;n++)t.push(e);return t}function xt(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function St(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0=xr),wr=` `,Tr=!1;function Er(e,t){switch(e){case`keyup`:return yr.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function Dr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var Or=!1;function kr(e,t){switch(e){case`compositionend`:return Dr(t);case`keypress`:return t.which===32?(Tr=!0,wr):null;case`textInput`:return e=t.data,e===wr&&Tr?null:e;default:return null}}function Ar(e,t){if(Or)return e===`compositionend`||!br&&Er(e,t)?(e=Hn(),Vn=Bn=zn=null,Or=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=$r(n)}}function ti(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ti(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ni(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Qr(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Qr(e.document)}return t}function ri(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var ii=In&&`documentMode`in document&&11>=document.documentMode,ai=null,oi=null,si=null,ci=!1;function li(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ci||ai==null||ai!==Qr(r)||(r=ai,`selectionStart`in r&&ri(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),si&&Zr(si,r)||(si=r,r=Jf(oi,`onSelect`),0>=o,i-=o,aa=1<<32-st(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),M&&sa(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),M&&sa(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return M&&sa(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&(_=v.alternate,_!==null&&h.delete(_.key===null?g:_.key)),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),M&&sa(a,g),u}function _(e,r,o,c){if(typeof o==`object`&&o&&o.type===oe&&o.key===null&&o.props.ref===void 0&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case ie:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===oe){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),go(c,o),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===he&&co(l)===r.type){n(e,r.sibling),c=a(r,o.props),go(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===oe?(c=Ki(o.props.children,e.mode,c,o.key),go(c,o),c.return=e,e=c):(c=Gi(o.type,o.key,o.props,null,e.mode,c),go(c,o),c.return=e,e=c)}return s(e);case ae:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=Yi(o,e.mode,c),c.return=e,e=c}return s(e);case he:return o=co(o),_(e,r,o,c)}if(we(o))return h(e,r,o,c);if(xe(o)){if(l=xe(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return _(e,r,ho(o),c);if(o.$$typeof===ue)return _(e,r,Pa(e,o),c);_o(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=qi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{mo=0;var i=_(e,t,n,r);return po=null,i}catch(t){if(t===no||t===io)throw t;var a=Vi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var yo=vo(!0),bo=vo(!1),xo=!1;function So(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Co(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function wo(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function To(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,W&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=Ri(e),Li(e,null,n),t}return Pi(e,r,t,n),Ri(e)}function Eo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,wt(e,n)}}function Do(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Oo=!1;function ko(){if(Oo){var e=qa;if(e!==null)throw e}}function Ao(e,t,n,r){Oo=!1;var i=e.updateQueue;xo=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(q&f)===f:(r&f)===f){f!==0&&f===Ka&&(Oo=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,h=s;f=t;var g=n;switch(h.tag){case 1:if(m=h.payload,typeof m==`function`){d=m.call(g,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=h.payload,f=typeof m==`function`?m.call(g,d,f):m,f==null)break a;d=w({},d,f);break a;case 2:xo=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),sd|=o,e.lanes=o,e.memoizedState=d}}function jo(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Mo(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=E.T,s={};s.types=o===null?null:o.types,E.T=s,hc(e,!1,t,n);try{var c=i(),l=E.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?mc(e,t,Xa(c,r),jd(e)):mc(e,t,r,jd(e))}catch(n){mc(e,t,{then:function(){},status:`rejected`,reason:n},jd())}finally{D.p=a,o!==null&&s.types!==null&&(o.types=s.types),E.T=o}}function ic(){}function ac(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=oc(e).queue;rc(e,a,t,Te,n===null?ic:function(){return sc(e),n(r)})}function oc(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:Te,baseState:Te,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:gs,lastRenderedState:Te},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:gs,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function sc(e){var t=oc(e);t.next===null&&(t=e.alternate.memoizedState),mc(e,t.next.queue,{},jd())}function cc(){return Na(sh)}function lc(){return R().memoizedState}function uc(){return R().memoizedState}function dc(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=jd();e=wo(n);var r=To(t,e,n);r!==null&&(Pd(r,t,n),Eo(r,t,n)),t={cache:za()},e.payload=t;return}t=t.return}}function fc(e,t,n){var r=jd();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},gc(e)?_c(t,n):(n=Fi(e,t,n,r),n!==null&&(Pd(n,e,r),vc(n,t,r)))}function pc(e,t,n){mc(e,t,n,jd())}function mc(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(gc(e))_c(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Xr(s,o))return Pi(e,t,i,0),G===null&&Ni(),!1}catch{}if(n=Fi(e,t,i,r),n!==null)return Pd(n,e,r),vc(n,t,r),!0}return!1}function hc(e,t,n,r){if(r={lane:2,revertLane:Pf(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},gc(e)){if(t)throw Error(i(479))}else t=Fi(e,n,r,2),t!==null&&Pd(t,e,2)}function gc(e){var t=e.alternate;return e===P||t!==null&&t===P}function _c(e,t){Zo=Xo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function vc(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,wt(e,n)}}var yc={readContext:Na,use:ms,useCallback:L,useContext:L,useEffect:L,useImperativeHandle:L,useLayoutEffect:L,useInsertionEffect:L,useMemo:L,useReducer:L,useRef:L,useState:L,useDebugValue:L,useDeferredValue:L,useTransition:L,useSyncExternalStore:L,useId:L,useHostTransitionStatus:L,useFormState:L,useActionState:L,useOptimistic:L,useMemoCache:L,useCacheRefresh:L,useEffectEvent:L},bc={readContext:Na,use:ms,useCallback:function(e,t){return ds().memoizedState=[e,t===void 0?null:t],e},useContext:Na,useEffect:Ws,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),Hs(4194308,4,Xs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Hs(4194308,4,e,t)},useInsertionEffect:function(e,t){Hs(4,2,e,t)},useMemo:function(e,t){var n=ds();t=t===void 0?null:t;var r=e();if(Qo){ot(!0);try{e()}finally{ot(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=ds();if(n!==void 0){var i=n(t);if(Qo){ot(!0);try{n(t)}finally{ot(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=fc.bind(null,P,e),[r.memoizedState,e]},useRef:function(e){var t=ds();return e={current:e},t.memoizedState=e},useState:function(e){e=Es(e);var t=e.queue,n=pc.bind(null,P,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Qs,useDeferredValue:function(e,t){return tc(ds(),e,t)},useTransition:function(){var e=Es(!1);return e=rc.bind(null,P,e.queue,!0,!1),ds().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=P,a=ds();if(M){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),G===null)throw Error(i(349));q&127||xs(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,Ws(Cs.bind(null,r,o,e),[e]),r.flags|=2048,Bs(9,{destroy:void 0},Ss.bind(null,r,o,n,t),null),n},useId:function(){var e=ds(),t=G.identifierPrefix;if(M){var n=oa,r=aa;n=(r&~(1<<32-st(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=$o++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[jt]=t,o[Mt]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(np(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&gl(t)}}return V(t),t.subtreeFlags&=-33554433,_l(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&gl(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=je.current,ya(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=fa,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[jt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||ep(e.nodeValue,n)),e||ga(t,!0)}else e=lp(e).createTextNode(r),e[jt]=t,t.stateNode=e}return V(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=ya(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[jt]=t}else ba(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),e=!1}else n=xa(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(Wo(t),t):(Wo(t),null);if(t.flags&128)throw Error(i(558))}return V(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=ya(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[jt]=t}else ba(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),a=!1}else a=xa(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(Wo(t),t):(Wo(t),null)}return Wo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),yl(t,t.updateQueue),V(t),null);case 4:return Pe(),e===null&&Wf(t.stateNode.containerInfo),t.flags|=67108864,V(t),null;case 10:return Da(t.type),V(t),null;case 19:if(qo(t),r=t.memoizedState,r===null)return V(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)bl(r,!1);else{if(Y!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=Jo(e),o!==null){for(t.flags|=128,bl(r,!1),e=o.updateQueue,t.updateQueue=e,yl(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)Wi(n,e),n=n.sibling;return Ko(t,Go.current&1|2),M&&sa(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ye()>_d&&(t.flags|=128,a=!0,bl(r,!1),t.lanes=4194304)}}else{if(!a){if(e=Jo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,yl(t,e),bl(r,!0),r.tail===null&&r.tailMode!==`collapsed`&&r.tailMode!==`visible`&&!o.alternate&&!M)return V(t),null}else 2*Ye()-r.renderingStartTime>_d&&n!==536870912&&(t.flags|=128,a=!0,bl(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}if(r.tail!==null){e=r.tail;a:{for(n=e;n!==null;){if(n.alternate!==null){n=!1;break a}n=n.sibling}n=!0}return r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ye(),e.sibling=null,o=Go.current,o=a?o&1|2:o&1,r.tailMode===`visible`||r.tailMode===`collapsed`||!n||M?Ko(t,o):(n=o,k(Ro,t),k(Go,n),zo===null&&(zo=t)),M&&sa(t,r.treeForkCount),e}return V(t),null;case 22:case 23:return Wo(t),Lo(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(V(t),t.subtreeFlags&6&&(t.flags|=8192)):V(t),n=t.updateQueue,n!==null&&yl(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&O(Qa),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Da(N),V(t),null;case 25:return null;case 30:return t.flags|=33554432,V(t),null}throw Error(i(156,t.tag))}function Sl(e,t){switch(ua(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Da(N),Pe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ie(t),null;case 31:if(t.memoizedState!==null){if(Wo(t),t.alternate===null)throw Error(i(340));ba()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Wo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));ba()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return qo(t),e=t.flags,e&65536?(t.flags=e&-65537|128,e=t.memoizedState,e!==null&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return Pe(),null;case 10:return Da(t.type),null;case 22:case 23:return Wo(t),Lo(),e!==null&&O(Qa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Da(N),null;case 25:return null;default:return null}}function Cl(e,t){switch(ua(t),t.tag){case 3:Da(N),Pe();break;case 26:case 27:case 5:Ie(t);break;case 4:Pe();break;case 31:t.memoizedState!==null&&Wo(t);break;case 13:Wo(t);break;case 19:qo(t);break;case 10:Da(t.type);break;case 22:case 23:Wo(t),Lo(),e!==null&&O(Qa);break;case 24:Da(N)}}function wl(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Tl(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function El(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Mo(t,n)}catch(t){Z(e,e.return,t)}}}function Dl(e,t,n){n.props=Dc(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Ol(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:var i=e.stateNode,a=Ei(e.memoizedProps,i);(i.ref===null||i.ref.name!==a)&&(i.ref=Pp(a)),r=i.ref;break;case 7:if(e.stateNode===null){var o=new Fp(e);h(e.child,!1,Qp,o,void 0,void 0),e.stateNode=o}r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function kl(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Al(e,t){if((e.tag===5||e.tag===27||e.tag===6)&&e.alternate===null&&t!==null)for(var n=0;n title`))),np(r,t,n),r[jt]=e,Gt(r),t=r;break a;case`link`:if(o=Gm(`link`,`href`,a).get(t+(n.href||``))){for(s=0;sg&&(o=g,g=h,h=o);var _=ei(s,h),v=ei(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,E.T=null,n=wd,wd=null;var o=bd,s=Sd;if(X=0,xd=bd=null,Sd=0,W&6)throw Error(i(331));var c=W;if(W|=4,Zu(o.current),Uu(o,o.current,s,n),W=c,Df(0,!1),at&&typeof at.onPostCommitFiberRoot==`function`)try{at.onPostCommitFiberRoot(it,o)}catch{}return!0}finally{D.p=a,E.T=r,uf(e,t)}}function pf(e,t,n){t=Zi(n,t),t=Nc(e.stateNode,t,2),e=To(e,t,2),e!==null&&(xt(e,2),Ef(e))}function Z(e,t,n){if(e.tag===3)pf(e,e,n);else for(;t!==null;){if(t.tag===3){pf(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(yd===null||!yd.has(r))){e=Zi(n,e),n=Pc(2),r=To(t,n,2),r!==null&&(Fc(n,r,t,e),xt(r,2),Ef(r));break}}t=t.return}}function mf(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new td;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(ad=!0,i.add(n),e=hf.bind(null,e,t,n),t.then(e,e))}function hf(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Y===4||Y===3&&(q&62914560)===q&&300>Ye()-hd?W&2?ld|=n:Vd(e,0):ld|=n,dd===q&&(dd=0)),Ef(e)}function gf(e,t){t===0&&(t=yt()),e=Ii(e,t),e!==null&&(xt(e,t),Ef(e))}function _f(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),gf(e,n)}function vf(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),gf(e,n)}function yf(e,t){return Ge(e,t)}var bf=null,xf=null,Sf=!1,Cf=!1,wf=!1,Tf=0;function Ef(e){e!==xf&&e.next===null&&(xf===null?bf=xf=e:xf=xf.next=e),Cf=!0,Sf||(Sf=!0,Nf())}function Df(e,t){if(!wf&&Cf){wf=!0;do for(var n=!1,r=bf;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-st(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,Mf(r,a))}else a=q,a=ht(r,r===G?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||gt(r,a)||(n=!0,Mf(r,a))}r=r.next}while(n);wf=!1}}function Of(){kf()}function kf(){Cf=Sf=!1;var e=0;Tf!==0&&hp()&&(e=Tf);for(var t=Ye(),n=null,r=bf;r!==null;){var i=r.next,a=Af(r,t);a===0?(r.next=null,n===null?bf=i:n.next=i,i===null&&(xf=n)):(n=r,(e!==0||a&3)&&(Cf=!0)),r=i}X!==0&&X!==5||Df(e,!1),Tf!==0&&(Tf=0)}function Af(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&ap(d)&&(c=c.responseEnd,o+=u*(c$m){s.length=o;break}f=new Promise(jp.bind(f)),s.push(f)}}}if(0`u`?null:document;function Tm(e,t,n){var r=wm;if(r&&typeof t==`string`&&t){var i=fn(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),ym.has(i)||(ym.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),np(t,`link`,e),Gt(t),r.head.appendChild(t)))}}function Em(e){xm.D(e),Tm(`dns-prefetch`,e,null)}function Dm(e,t){xm.C(e,t),Tm(`preconnect`,e,t)}function Om(e,t,n){xm.L(e,t,n);var r=wm;if(r&&e&&t){var i=`link[rel="preload"][as="`+fn(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+fn(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+fn(n.imageSizes)+`"]`)):i+=`[href="`+fn(e)+`"]`;var a=i;switch(t){case`style`:a=Pm(e);break;case`script`:a=Rm(e)}if(!(vm.has(a)||(e=w({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),vm.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Fm(a))||t===`script`&&r.querySelector(zm(a))))){var o=r.createElement(`link`);np(o,`link`,e),t===`style`&&(o[zt]=!0,o.onload=o.onerror=function(){Kt(o)}),Gt(o),r.head.appendChild(o)}}}function km(e,t){xm.m(e,t);var n=wm;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+fn(r)+`"][href="`+fn(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Rm(e)}if(!vm.has(a)&&(e=w({rel:`modulepreload`,href:e},t),vm.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(zm(a)))return}r=n.createElement(`link`),np(r,`link`,e),Gt(r),n.head.appendChild(r)}}}function Am(e,t,n){xm.S(e,t,n);var r=wm;if(r&&e){var i=Wt(r).hoistableStyles,a=Pm(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Fm(a)))s.loading=5;else{e=w({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=vm.get(a))&&Hm(e,n);var c=o=r.createElement(`link`);Gt(c),np(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Vm(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function jm(e,t){xm.X(e,t);var n=wm;if(n&&e){var r=Wt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=w({src:e,async:!0},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),Gt(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mm(e,t){xm.M(e,t);var n=wm;if(n&&e){var r=Wt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=w({src:e,async:!0,type:`module`},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),Gt(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Nm(e,t,n,r){var a=(a=je.current)?bm(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(n=Pm(n.href),t=Wt(a).hoistableStyles,r=t.get(n),r||(r={type:`style`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Pm(n.href);var o=Wt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Fm(e)))?o._p||(s.instance=o,s.state.loading=5):(o=vm.get(e),o||(o={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},vm.set(e,o)),Lm(a,e,o,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(n=Rm(n),t=Wt(a).hoistableScripts,r=t.get(n),r||(r={type:`script`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Pm(e){return`href="`+fn(e)+`"`}function Fm(e){return`link[rel="stylesheet"][`+e+`]`}function Im(e){return w({},e,{"data-precedence":e.precedence,precedence:null})}function Lm(e,t,n,r){if(t=e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)){if(!0!==t[zt]){r.loading=1;return}}else t=e.createElement(`link`),t[zt]=!0,t.onload=t.onerror=Kt.bind(null,t),np(t,`link`,n),Gt(t),e.head.appendChild(t);r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2})}function Rm(e){return`[src="`+fn(e)+`"]`}function zm(e){return`script[async]`+e}function Bm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+fn(n.href)+`"]`);if(r)return t.instance=r,Gt(r),r;var a=w({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),Gt(r),np(r,`style`,a),Vm(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Pm(n.href);var o=e.querySelector(Fm(a));if(o)return t.state.loading|=4,t.instance=o,Gt(o),o;r=Im(n),(a=vm.get(a))&&Hm(r,a),o=(e.ownerDocument||e).createElement(`link`),Gt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),np(o,`link`,r),t.state.loading|=4,Vm(o,n.precedence,e),t.instance=o;case`script`:return o=Rm(n.src),(a=e.querySelector(zm(o)))?(t.instance=a,Gt(a),a):(r=n,(a=vm.get(o))&&(r=w({},n),Um(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),Gt(a),np(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Vm(r,n.precedence,e));return t.instance}function Vm(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function qm(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Jm(e,t){return e===`img`&&t.src!=null&&t.src!==``&&t.onLoad==null&&t.loading!==`lazy`}function Ym(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Xm(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio==`number`?devicePixelRatio:1)*.25}function Zm(e,t){typeof t.decode==`function`&&(e.imgCount++,t.complete||(e.imgBytes+=Xm(t),e.suspenseyImages.push(t)),e=rh.bind(e),t.decode().then(e,e))}function Qm(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Pm(r.href),a=t.querySelector(Fm(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=nh.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,Gt(a);return}a=t.ownerDocument||t,r=Im(r),(i=vm.get(i))&&Hm(r,i),a=a.createElement(`link`),Gt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=nh.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var $m=0;function eh(e,t){return e.stylesheets&&e.count===0&&ah(e,e.stylesheets),0$m?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function th(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)ah(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function nh(){this.count--,th(this)}function rh(){this.imgCount--,th(this)}var ih=null;function ah(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ih=new Map,t.forEach(oh,e),ih=null,nh.call(e))}function oh(e,t){if(!(t.state.loading&4)){var n=ih.get(e);if(n)var r=n.get(null);else{n=new Map,ih.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y=JSON.parse(`[{"id":"0004d4b651","url":"0004d4b651.jpg","ar":0.8594,"blur":"LaKUp4WBRkn$?vxuxuoM~pxuR+j["},{"id":"001160216e","url":"001160216e.jpg","ar":1.4566,"blur":"LlJ8IjMwtRoe~qRikDs:oJt7WXoJ"},{"id":"001b9c7a22","url":"001b9c7a22.jpg","ar":1.3989,"blur":"LIJHp;~q4n?bNcM_RkofM_9Z-:WB"},{"id":"00243920f3","url":"00243920f3.jpg","ar":1.4993,"blur":"LDI#li0MRPa{?v9ai^-o~qI9M_xu"},{"id":"002b1f6f2c134b5de8dc52737e774ba5b93e1055","url":"002b1f6f2c134b5de8dc52737e774ba5b93e1055.jpg","ar":1.3333,"blur":"LbC@KyRjRiWBlCWCacj[RjozRiof"},{"id":"00413fa633054264","url":"00413fa633054264.jpg","ar":0.7568,"blur":"L8Gm3[56MKI:.8DijZof4T.S.8.8"},{"id":"0059044946","url":"0059044946.jpg","ar":1.4993,"blur":"LWKnPI-;00ad-:WBazt74nWAxuWq"},{"id":"005ec5c9032f4531488ec6116ed22d937abb0270","url":"005ec5c9032f4531488ec6116ed22d937abb0270.jpg","ar":1.0,"blur":"LbNTar-mRkV[_MSjjEaJx^t3jYkC"},{"id":"00a272ab96","url":"00a272ab96.jpg","ar":1.7778,"blur":"LIJQir%hit?E~p%MRjRkMvM{tT%L"},{"id":"00c3f2ef50a572aa","url":"00c3f2ef50a572aa.jpg","ar":1.0,"blur":"LqKK~DkDbIt7.TRlxaoet8V@jXjY"},{"id":"014056ab879ee13d2f97f329aa0ce7c0b8f98381","url":"014056ab879ee13d2f97f329aa0ce7c0b8f98381.jpg","ar":1.158,"blur":"LaPGpmxuf6kC~qxutRjZIUMxRjof"},{"id":"0144ebe50c","url":"0144ebe50c.jpg","ar":1.7778,"blur":"L#H-V?0z$*nixtRjofj[V@V[oft7"},{"id":"0180811bf586a7e966145eb9a9a68f1d4bec9a9b","url":"0180811bf586a7e966145eb9a9a68f1d4bec9a9b.jpg","ar":1.4376,"blur":"LbL|lgozIooy~VE1IUkCIBafV@V@"},{"id":"01af8f7ae1de1fac20e05d4391d3a8912be1ca03","url":"01af8f7ae1de1fac20e05d4391d3a8912be1ca03.jpg","ar":1.7058,"blur":"LBGuag-:Iq?b_3t7n~j]IU00%M%1"},{"id":"01b0637bbe","url":"01b0637bbe.jpg","ar":1.4085,"blur":"LPL}T.?Hx^n$_Nxaj?oe-p%LWAbH"},{"id":"01da965e05","url":"01da965e05.jpg","ar":1.6516,"blur":"LMKn6kxvtjtQ~VIpx[kCtR?Hnkxt"},{"id":"01f554a00c698daeebb10d764d9ad0fa30217137","url":"01f554a00c698daeebb10d764d9ad0fa30217137.jpg","ar":1.7786,"blur":"LDNKCpxUbc_4?a.8M|Mx~qn$%Lx]"},{"id":"01fa1b4c91a4c4becc390c7d2d202aeed55fb3ac","url":"01fa1b4c91a4c4becc390c7d2d202aeed55fb3ac.jpg","ar":1.0,"blur":"LILW#4r;McMx_NIWD%M{x^SiIpt8"},{"id":"02076f4467","url":"02076f4467.jpg","ar":0.71,"blur":"LmK-k3NG-pkB~qbHxuoft8ogofof"},{"id":"0234975b64","url":"0234975b64.jpg","ar":0.71,"blur":"L]F$-RoftRof?woLt7j[t9fkWAay"},{"id":"0281cfa48ea78f36da950a523152ca4cc2c40a1e","url":"0281cfa48ea78f36da950a523152ca4cc2c40a1e.jpg","ar":1.7786,"blur":"LHKA[?8^~qxs~V-:%1%2-;M{IVog"},{"id":"02e07648862aa4e73fa2c902c693047bc84f44d3","url":"02e07648862aa4e73fa2c902c693047bc84f44d3.jpg","ar":1.7786,"blur":"LAL4vmR24UxZ?vo~SQR+%fkWM_W="},{"id":"030081ed6ef344462edad525ddb9705c539d328d","url":"030081ed6ef344462edad525ddb9705c539d328d.jpg","ar":1.0,"blur":"LXI=3{_4X9s,Oa%0RjE2%gxtoJR-"},{"id":"030d59eaf3","url":"030d59eaf3.jpg","ar":1.7778,"blur":"LJG+2NNGD*of%M-:D%xv~qWBs.WE"},{"id":"0411e60c40c7ed40a2efc0391af7982947cc4595","url":"0411e60c40c7ed40a2efc0391af7982947cc4595.jpg","ar":1.5009,"blur":"LRI#iR?ID%%M~q-;V@t5%ix[M{o#"},{"id":"04312d898f5527e8f1166449a4235fca08094a21","url":"04312d898f5527e8f1166449a4235fca08094a21.jpg","ar":1.0,"blur":"L,I#cLjFjZof~qoLjtj[%NbIWXay"},{"id":"04361069885f01c20b6614a127dc142646143044","url":"04361069885f01c20b6614a127dc142646143044.jpg","ar":1.7786,"blur":"LFJ[Cn57D%%1pJI9xuoz~px]RkR*"},{"id":"043f4d6c61e80b519bf5a48c2804ab8b5070922c","url":"043f4d6c61e80b519bf5a48c2804ab8b5070922c.jpg","ar":1.0,"blur":"LpOgTm%M?baeR*NGtRof_NWCE1t7"},{"id":"0450bc3d37a5380795d7f949f6e620ef8441e11a","url":"0450bc3d37a5380795d7f949f6e620ef8441e11a.jpg","ar":1.641,"blur":"LSJu1G_3j[xu8^x]xaof_4%MV@of"},{"id":"046419145602bbae04804b9dce8231bddaaf8074","url":"046419145602bbae04804b9dce8231bddaaf8074.jpg","ar":1.658,"blur":"LYIF6^~9a%bcx_-:j]afxC%hWUIo"},{"id":"04cb52c8c668f7ac6bbee7accaa311134aaafc27","url":"04cb52c8c668f7ac6bbee7accaa311134aaafc27.jpg","ar":0.6667,"blur":"LJMaO$M{ozoL.ToJWBt7~WD%RPj["},{"id":"04d41cf78e","url":"04d41cf78e.jpg","ar":1.3333,"blur":"LFLzpraJM|01?cD*M{%N_3-:Rj-:"},{"id":"05900ee7819a9680034af84b299ea88563a33a6e","url":"05900ee7819a9680034af84b299ea88563a33a6e.jpg","ar":0.962,"blur":"LYNw4gxZt6R*_4IUR+xaD%xutRof"},{"id":"05a0d26810","url":"05a0d26810.jpg","ar":0.8762,"blur":"LIK-2ma}%M-;_NoLxtV@xabHM{t6"},{"id":"05a7ff308b8914f238b0cb69941d50b59cde8141","url":"05a7ff308b8914f238b0cb69941d50b59cde8141.jpg","ar":1.0,"blur":"LDD]bk9s_N%pRZIBo#IDS+Di%L9G"},{"id":"05c9aaad4ef0c11e5ec7be9f11a63bb685d844bf","url":"05c9aaad4ef0c11e5ec7be9f11a63bb685d844bf.jpg","ar":1.0,"blur":"LeO|IOMa?Fo$^*xtIWWAEVI^M{n#"},{"id":"05e1b0ea98","url":"05e1b0ea98.jpg","ar":1.665,"blur":"LaJRXEs-M{xt~qxut8WBR.xaRkWB"},{"id":"05e2441942fefc07f27f3cd8341ff416018c0dc8","url":"05e2441942fefc07f27f3cd8341ff416018c0dc8.jpg","ar":1.6606,"blur":"LoHfL|%LM{of.TRlkCofD%V@ogWB"},{"id":"063779d7f4fb3508b906e1b1ab809d81ddb23ff6","url":"063779d7f4fb3508b906e1b1ab809d81ddb23ff6.jpg","ar":1.7778,"blur":"LMJ*eo^+NGxus*i^t6of_NM|s.WA"},{"id":"0665a6f40b","url":"0665a6f40b.jpg","ar":1.3333,"blur":"LWJRKt?w9aNGMxIVjZkC%1RjRPRP"},{"id":"06ab82854261e4ad4791ba6e66af868c5aeaa9ba","url":"06ab82854261e4ad4791ba6e66af868c5aeaa9ba.jpg","ar":1.499,"blur":"L997qfMQJ5-o?k8yXl-.%yDkIp%L"},{"id":"06ae040031","url":"06ae040031.jpg","ar":1.7778,"blur":"L7DSg[n20LXTA2%MWBIo4:kr%MRO"},{"id":"06c4afd97e80347ef53527289bb5bbc620a64930","url":"06c4afd97e80347ef53527289bb5bbc620a64930.jpg","ar":1.7778,"blur":"L4DJYa?w4mR*?cWAxuRjohWBfRRi"},{"id":"071b4e4c6d","url":"071b4e4c6d.jpg","ar":0.8018,"blur":"L98z+8x]9bNM?dofM|bIo%RiIToH"},{"id":"07b49375ff","url":"07b49375ff.jpg","ar":1.4124,"blur":"LNGvn#M_ImxZT#oyRORjESxv%3X9"},{"id":"07b7636d4b","url":"07b7636d4b.jpg","ar":1.4993,"blur":"LOJkJ,4TS4R5RPxukDsn~WaeM{WC"},{"id":"07b82ac74aaae9738baad9a0d33e8ba2a76ecec1","url":"07b82ac74aaae9738baad9a0d33e8ba2a76ecec1.jpg","ar":1.0,"blur":"LMQRzX_NF}?bMHMIrpof.8NHnhWA"},{"id":"07b8871c4b","url":"07b8871c4b.jpg","ar":1.5,"blur":"LFGuXaEM9aDh?wRks:xus,x]WXS5"},{"id":"08038d4053","url":"08038d4053.jpg","ar":1.1929,"blur":"LCF$IkIUIAM{~q-;Di?H0KE1x]IV"},{"id":"0810fad184febfa0e9add5e0a2ee43638eb659bc","url":"0810fad184febfa0e9add5e0a2ee43638eb659bc.jpg","ar":1.9827,"blur":"LkJ*elr@8_Ri~qIVITogxvM{bbt7"},{"id":"087e5129518f6cbd547f50c3e5ace0d91f924787","url":"087e5129518f6cbd547f50c3e5ace0d91f924787.jpg","ar":1.2528,"blur":"LGH.A[ITJ:_3~pxZt8%MNHM{t7V?"},{"id":"0887c4fa251a3482d82304ab303099c87f3eb3fa","url":"0887c4fa251a3482d82304ab303099c87f3eb3fa.jpg","ar":1.3722,"blur":"LGK1q84m.89F~qxuIU%MtT-;D$%L"},{"id":"08a40caf9f","url":"08a40caf9f.jpg","ar":1.6,"blur":"LNHxW;_4Mw?c~qxvxto#e-V@ofn$"},{"id":"08e7c6c0ce5ac8fbdb7461a4c75712cd0d3a7e8c","url":"08e7c6c0ce5ac8fbdb7461a4c75712cd0d3a7e8c.jpg","ar":0.8,"blur":"LDE_~$8^x]%N=^.8WARi8_%MjuWB"},{"id":"094191a64dee02e5644e472e51111bbf5f4663db","url":"094191a64dee02e5644e472e51111bbf5f4663db.jpg","ar":1.5717,"blur":"LaIq[h-:4n%M~p%LWAofj@WBaxRj"},{"id":"096c71e7b9","url":"096c71e7b9.jpg","ar":1.4993,"blur":"LMJ[Cp_3r;Ri~qoIxtxa?bM{MxjY"},{"id":"098287d9263d4540aad6b1ca0533942eecedd4b2","url":"098287d9263d4540aad6b1ca0533942eecedd4b2.jpg","ar":1.9526,"blur":"L6DcHx?vxw-4Im0LM{aKR5-oIVoy"},{"id":"09a16f36f81be708946b5d140f6c10b975c5dd62","url":"09a16f36f81be708946b5d140f6c10b975c5dd62.jpg","ar":1.498,"blur":"LHOpV.4n9FS%4nF{H?tl0L0eR5x["},{"id":"09b740d0252184e0df291a568c11f0f867b0b899","url":"09b740d0252184e0df291a568c11f0f867b0b899.jpg","ar":1.5,"blur":"LMFFTm-#9bIv~Ws+E2jvxvNHRkj="},{"id":"09e4fb21be30487ff95d14f23dd05846403d383c","url":"09e4fb21be30487ff95d14f23dd05846403d383c.jpg","ar":1.5,"blur":"LHLqLX4n?F%L?Gs,?Zt6~U-:IUD*"},{"id":"0a217058a3","url":"0a217058a3.jpg","ar":1.6678,"blur":"LOJHs_x]-p%MWVRjayof~qt7IUM{"},{"id":"0a2f5a88be9d1b3e","url":"0a2f5a88be9d1b3e.jpg","ar":1.3665,"blur":"LpL4f~Mwxut7~qM{Rka#IUWBj[WB"},{"id":"0a8c153c2b","url":"0a8c153c2b.jpg","ar":1.4981,"blur":"LjJkZLRPWBof~pjYRkt7t7axozfk"},{"id":"0a95ff4496076debdbd0c4e67486f710ff7de958","url":"0a95ff4496076debdbd0c4e67486f710ff7de958.jpg","ar":1.7786,"blur":"LKG[TQ00j^RQtn4.?a?F={NGNIM}"},{"id":"0aa1d8bdf6fe12d5","url":"0aa1d8bdf6fe12d5.jpg","ar":0.45,"blur":"LJGIWCsQIB-U~qbFRkaeE3xu-ooz"},{"id":"0ae115709800bae0a8779ffa650f698da14b5a27","url":"0ae115709800bae0a8779ffa650f698da14b5a27.jpg","ar":1.0,"blur":"LhPZ4Dx[E0slVrbwniay4TaKogjt"},{"id":"0b2ca2e0baebaf95","url":"0b2ca2e0baebaf95.jpg","ar":1.4092,"blur":"LBHU:}0K0LspW=9Ft7NG~qxt?Hjr"},{"id":"0b6bed6a9ef2b6ec2aef47cc31e87c884b986974","url":"0b6bed6a9ef2b6ec2aef47cc31e87c884b986974.jpg","ar":1.476,"blur":"LEJthz-;D%tl^+IV~p.8%29ZIVS4"},{"id":"0b8aa7492a2ae1880b2d4bc13fb8364dcac205ab","url":"0b8aa7492a2ae1880b2d4bc13fb8364dcac205ab.jpg","ar":1.7778,"blur":"LOGvIfE2vfF14To#S%#+vy-pEka$"},{"id":"0be704f472a6a87c935981b3ec47602c9bde92be","url":"0be704f472a6a87c935981b3ec47602c9bde92be.jpg","ar":1.25,"blur":"LNJ[FnOqIUjF_Nae%gRP-WxIRjoy"},{"id":"0bf7945a8cb3d2d1","url":"0bf7945a8cb3d2d1.jpg","ar":0.675,"blur":"LiGl0D%1X8t6?w%1xtayk@oes.of"},{"id":"0c174bb1b1","url":"0c174bb1b1.jpg","ar":1.5119,"blur":"L7F#p#9b9a_M~UxZ$|IC^haes+IB"},{"id":"0c234c2bed4150c52709bce6eeb0449259cb9afe","url":"0c234c2bed4150c52709bce6eeb0449259cb9afe.jpg","ar":1.3333,"blur":"LPMQ379GD%t6~VM|WCay4TxtX9s:"},{"id":"0c556d4383d64a3395fbc7394d294983aee9f634","url":"0c556d4383d64a3395fbc7394d294983aee9f634.jpg","ar":1.3344,"blur":"LEKBac?bs+kWtp-k%1o#0K~V%Lt7"},{"id":"0ca506d168","url":"0ca506d168.jpg","ar":1.2863,"blur":"LUF?FS-;b_WE%%t7o#ofE4M{ngjY"},{"id":"0cbc9d2ac8f635c3e96a84eea28580792dfce884","url":"0cbc9d2ac8f635c3e96a84eea28580792dfce884.jpg","ar":1.0,"blur":"LFIhQ#8^Mw%M%hM{NGxuE2x^xuE1"},{"id":"0d73e4dbc7","url":"0d73e4dbc7.jpg","ar":1.4144,"blur":"LFS6MZ%M?d%M-:oft7Ri?dofISRP"},{"id":"0de0a729643171c5c9fd942a7ede592f61a35bad","url":"0de0a729643171c5c9fd942a7ede592f61a35bad.jpg","ar":1.6512,"blur":"L$N11Bxu-;%M~qRiM{WB%gt7WBj]"},{"id":"0e0e1df65d2ce0a5be4baea7db4fd712023ff26b","url":"0e0e1df65d2ce0a5be4baea7db4fd712023ff26b.jpg","ar":1.5009,"blur":"LBCF|u^%-:tR9FX9WBt70LMyxvM{"},{"id":"0e62272ad930c9ac581a11dff9023c6d6d2356ea","url":"0e62272ad930c9ac581a11dff9023c6d6d2356ea.jpg","ar":0.667,"blur":"LBFYMt0K4TWB?vM{MxD*jFazNG-:"},{"id":"0e65e1ac67","url":"0e65e1ac67.jpg","ar":1.4656,"blur":"LGL4yx?v~q?G_4M_xvV@8_RjR*Io"},{"id":"0e6f868344d6f23a1fd6c9dbe46bf3d3e757870b","url":"0e6f868344d6f23a1fd6c9dbe46bf3d3e757870b.jpg","ar":1.3325,"blur":"LZFYfP~pR*IUocs:ayj[xbs:WVof"},{"id":"0e8f19b074","url":"0e8f19b074.jpg","ar":1.5306,"blur":"LUJ*hq4oM{of~pD%R*ofM|t7M{Rj"},{"id":"0ea43235685c94b98f107395f25a60cb9b011e89","url":"0ea43235685c94b98f107395f25a60cb9b011e89.jpg","ar":1.5802,"blur":"LjHL*pVXWBxu?ws8ayRktSt7ayWY"},{"id":"0ea43573788da571b4649f4621e1488137a4b7c9","url":"0ea43573788da571b4649f4621e1488137a4b7c9.jpg","ar":1.4052,"blur":"LEHxvaxDRMI:*IIpocxvIAs:xa%M"},{"id":"0ee01bd728122a1697ace2d93b2687595ccb0d41","url":"0ee01bd728122a1697ace2d93b2687595ccb0d41.jpg","ar":1.641,"blur":"LIK9}lyrD4^+%ga0WCX9KjaKS#oz"},{"id":"0f13bc9a0198fd5905cdcfb8237fbc14c8f8e256","url":"0f13bc9a0198fd5905cdcfb8237fbc14c8f8e256.jpg","ar":1.457,"blur":"LAA,qEI[8{.8~VS5M}xtMeawb;nP"},{"id":"0f1ab6e120f70c02b3ba2453b3eca3854754287f","url":"0f1ab6e120f70c02b3ba2453b3eca3854754287f.jpg","ar":1.7837,"blur":"LQFs0x?wx]IU%#tnbuV[pJtm%ft7"},{"id":"0f62efb08b","url":"0f62efb08b.jpg","ar":1.3333,"blur":"LaHBxZn34.R+%%RkROR*%Mxut7Rj"},{"id":"0f6855c9a3ec8fde3ff7ff782c7580510c9b07f4","url":"0f6855c9a3ec8fde3ff7ff782c7580510c9b07f4.jpg","ar":1.5009,"blur":"LVJkWJ%h~q%MIUaeoft8I9ofRjWB"},{"id":"0f7e16fa3de7a19c3cd70af090a899d24496ae4e","url":"0f7e16fa3de7a19c3cd70af090a899d24496ae4e.jpg","ar":1.0,"blur":"LNLgLh?aE30M0f%2jrn$?GM|%L?G"},{"id":"10451e1a838a83413ce65f273490871b2c0809c9","url":"10451e1a838a83413ce65f273490871b2c0809c9.jpg","ar":1.0,"blur":"LfI5Y-$wInt6~WWFS4WCK-NIxaRl"},{"id":"105271022eda4174d90b9aea40037ab29e802326","url":"105271022eda4174d90b9aea40037ab29e802326.jpg","ar":1.25,"blur":"LDKU4e_NRP-=?G_3.89anNt6RPxt"},{"id":"10776742fdc1fe7065295d2d3f1fe537cef1e134","url":"10776742fdc1fe7065295d2d3f1fe537cef1e134.jpg","ar":1.7773,"blur":"LFDStDI8%fM|?wIo%ft7bE%MoLs."},{"id":"10b96667fa","url":"10b96667fa.jpg","ar":1.4981,"blur":"LUJ*hu.9%Mof~q%MWEofIAIUaeR*"},{"id":"10c86fec1911d17aac66acca843f9a6ddc86c44e","url":"10c86fec1911d17aac66acca843f9a6ddc86c44e.jpg","ar":1.5054,"blur":"LRHCGtIn9E%NZ+s=bFRj4,WBxujc"},{"id":"111338df47","url":"111338df47.jpg","ar":1.9212,"blur":"LBLzy|^+_NWqu5Rj%LRjiva{Nx%2"},{"id":"113ab153ba5a3f3008cc8386a318181ad4e6fd4f","url":"113ab153ba5a3f3008cc8386a318181ad4e6fd4f.jpg","ar":1.5006,"blur":"L9F~N-aenh~qI8-o9F9ERlR+M|xu"},{"id":"115f746b04313791","url":"115f746b04313791.jpg","ar":1.0,"blur":"LJNJt9-o~p%MRjxaofay~pxtD%oJ"},{"id":"1197818c57cd32041c5dfd5385d24befba667481","url":"1197818c57cd32041c5dfd5385d24befba667481.jpg","ar":0.722,"blur":"LCC$WF^jv#Inwbe-M{sD0LNHNx%1"},{"id":"11d0bbda90080f55","url":"11d0bbda90080f55.jpg","ar":1.3571,"blur":"LID+uRIoRjWB~VR*IVWB9GxaIpaz"},{"id":"127e90aac8","url":"127e90aac8.jpg","ar":1.4993,"blur":"LSKBBuIAMwoe~U%2bIxuV[IoxZNH"},{"id":"1294ff7573e8b51e713a38cd01816215968b073e","url":"1294ff7573e8b51e713a38cd01816215968b073e.jpg","ar":1.4011,"blur":"LOH_lR_4t8jF_N%MxuaytSITRixu"},{"id":"12b1eb4e363141fa01d03040833d009676b17c91","url":"12b1eb4e363141fa01d03040833d009676b17c91.jpg","ar":1.8021,"blur":"LSEySq014:-;%fRjROt7E2xaxGWB"},{"id":"12b3821a16d99cd3025dcc2711dd2e8992acf40b","url":"12b3821a16d99cd3025dcc2711dd2e8992acf40b.jpg","ar":1.4401,"blur":"LPGb*YMeR.b_%jtnkDV?NzS*xusk"},{"id":"12ebf0d3b5","url":"12ebf0d3b5.jpg","ar":1.7668,"blur":"LTI;*O00D*IU?HRPt7xaxF%2RjM|"},{"id":"12ff65d104ad631c","url":"12ff65d104ad631c.jpg","ar":1.7778,"blur":"L%KnrNt6tRt8_4oet8t7t7t6ofRj"},{"id":"1312e94ff2","url":"1312e94ff2.jpg","ar":1.3491,"blur":"LGLNlS-n4.8__N9Gnh.8MwIT%gkC"},{"id":"1326c325cbd6f469b580076ebbc792c8488d30fc","url":"1326c325cbd6f469b580076ebbc792c8488d30fc.jpg","ar":1.7786,"blur":"LBEVse9X?IIm9YoNX6RQ4mjvk8V["},{"id":"13b205f4174fb810dc8ffe3bb830021db547f473","url":"13b205f4174fb810dc8ffe3bb830021db547f473.jpg","ar":1.3599,"blur":"LIFil4?H9YxD_Ixa-qxu~pxuD+W."},{"id":"13d72d8fe1","url":"13d72d8fe1.jpg","ar":1.3333,"blur":"LbLzppMytkx[_NWBRjaeXTMxs:t6"},{"id":"141c60ffeb","url":"141c60ffeb.jpg","ar":1.4667,"blur":"LdLW|h%2M_WC~qxZt6ay-VNaM{xZ"},{"id":"14a728c539e47070c23c87d39f571fd26703ba0f","url":"14a728c539e47070c23c87d39f571fd26703ba0f.jpg","ar":1.3344,"blur":"LJGIT3_NtS%2~W%fNIWBM_IAV?t8"},{"id":"14b817fd2e47f15194a44125a6bafb1e116250a9","url":"14b817fd2e47f15194a44125a6bafb1e116250a9.jpg","ar":1.499,"blur":"LCB3$w-=4n8_~qbIITNFM|IVxuxu"},{"id":"14bac130fa","url":"14bac130fa.jpg","ar":1.4819,"blur":"LEHU%$?utPx]-:?HRP9G00-;t7Mx"},{"id":"14c234dce46f17ac5f37853016b535cb900f9673","url":"14c234dce46f17ac5f37853016b535cb900f9673.jpg","ar":1.4376,"blur":"L8D0Jq?aI@_4I[tQ~qIV4:xu^+%M"},{"id":"150739100239c2faee914963e6a26abd01f4ff58","url":"150739100239c2faee914963e6a26abd01f4ff58.jpg","ar":1.4854,"blur":"LEGbbV.AFvAHE^^l%LEL0Kr=V@V?"},{"id":"152de8c5ae","url":"152de8c5ae.jpg","ar":1.7747,"blur":"LQKB2VIAMxoz~qRjWAxuM{xuxukC"},{"id":"1575ee00b5","url":"1575ee00b5.jpg","ar":1.2995,"blur":"LFJRHn4T-:s.?HM{9GofjbM{t8Rj"},{"id":"15df9c14cb","url":"15df9c14cb.jpg","ar":1.6,"blur":"LADI:[^,xcR-_4RiRjxb8_D%xuxa"},{"id":"16161750d314538f","url":"16161750d314538f.jpg","ar":0.6667,"blur":"LgHeRb%1Nbof_N%1xtWBXooLxZs:"},{"id":"161f9c7eef","url":"161f9c7eef.jpg","ar":1.4993,"blur":"LNJuDo0LD%Rk?baySix]W?IUxYRj"},{"id":"162b7551a0280ae84d58f0ed231b6a440b66db0a","url":"162b7551a0280ae84d58f0ed231b6a440b66db0a.jpg","ar":0.936,"blur":"LgDvvVxuW=ad.TtRt7WAk@xut7kB"},{"id":"163ecde6b8","url":"163ecde6b8.jpg","ar":1.3491,"blur":"LDRp8+j;t7tR~qogR*WC.8WEM{j?"},{"id":"163ff650396409507e0b1a6d5bc7b0012c8a9dc5","url":"163ff650396409507e0b1a6d5bc7b0012c8a9dc5.jpg","ar":1.5,"blur":"LCGS4D-:Dhd;*0MwRipI^+$yIVNH"},{"id":"16be79606a9d4610e67eb6b1f1c6e65383fb5275","url":"16be79606a9d4610e67eb6b1f1c6e65383fb5275.jpg","ar":1.0,"blur":"LAF$IqIv00%L~D%M0Kt7=r9F?bE2"},{"id":"16c718951f5bd2b194bdaed6daca339e0ea460ee","url":"16c718951f5bd2b194bdaed6daca339e0ea460ee.jpg","ar":1.5009,"blur":"LDCs1{5q-l-:NG-o%Mxa17^jxux]"},{"id":"172755c17f830d8d","url":"172755c17f830d8d.jpg","ar":0.9375,"blur":"LHEC%u9a4.n1lCM|Rj-kIwjE%MWr"},{"id":"17e09caa69388c95e1bf808a66916a5d5bf8c902","url":"17e09caa69388c95e1bf808a66916a5d5bf8c902.jpg","ar":1.7778,"blur":"LWGln$E0IAWB_4NIaxV?%$IpM_oe"},{"id":"17e9170d1ab28fe9ea5a50bfcdada87a12f61c21","url":"17e9170d1ab28fe9ea5a50bfcdada87a12f61c21.jpg","ar":1.9208,"blur":"LGGIip9F%gf5~qxuIUM|?cD*oJxt"},{"id":"17f55638b1","url":"17f55638b1.jpg","ar":1.0305,"blur":"L*EW,sROROfhyZRPaJk8RpfhjqV@"},{"id":"17fc3aa6721d8e57","url":"17fc3aa6721d8e57.jpg","ar":0.45,"blur":"LKE_%0WAE2xa~BkCNHoL^%s.xts:"},{"id":"1808b1c8d8","url":"1808b1c8d8.jpg","ar":0.75,"blur":"LYKdbyjZRP%2~qWXIVogs8s.jsRj"},{"id":"183aa5b6e79d9c8d734dc36d0256671b3ed2803a","url":"183aa5b6e79d9c8d734dc36d0256671b3ed2803a.jpg","ar":1.7897,"blur":"LPGIcmpJ4n9F0NaekEkE9xxUo#t7"},{"id":"18478a1e9b8c2e98a279546ede417ee8243dca8b","url":"18478a1e9b8c2e98a279546ede417ee8243dca8b.jpg","ar":1.0,"blur":"LCFN^z+uIpEh~o4;nOs..79aE2Sh"},{"id":"1849af8720116af4f50e5cbfa5a9a4b1d2490bea","url":"1849af8720116af4f50e5cbfa5a9a4b1d2490bea.jpg","ar":1.3333,"blur":"LDECm_0f9FM{IAE2-;xt4;-okWxu"},{"id":"184eaa723a","url":"184eaa723a.jpg","ar":1.3333,"blur":"LIIO91T0D*kX~qE2EOSOIVI;_3Nd"},{"id":"186a0e946ddaf03f5a92e92d76a537c57d48df8e","url":"186a0e946ddaf03f5a92e92d76a537c57d48df8e.jpg","ar":1.25,"blur":"L7Jt@+xR~W-;_3rA9Z%is:9FD%4."},{"id":"187564fa761923204821db8bc2438b7bc99a885b","url":"187564fa761923204821db8bc2438b7bc99a885b.jpg","ar":1.0,"blur":"LDKnlE_3f4RP%MRP%M_3M|WC_NIU"},{"id":"18958c08d8f334ce137f76905d8df4e2801bd36c","url":"18958c08d8f334ce137f76905d8df4e2801bd36c.jpg","ar":1.477,"blur":"L5S~x5~q_3_3_3of%Mof-;ayIUof"},{"id":"18ee0eb7d455f4ff878008996e8bae2852de901e","url":"18ee0eb7d455f4ff878008996e8bae2852de901e.jpg","ar":0.75,"blur":"LMHU5$0ho#tQ1RNH%MNfAv%1%2kX"},{"id":"191a686537edc4f6c1af4b29b29fac2db88afd76","url":"191a686537edc4f6c1af4b29b29fac2db88afd76.jpg","ar":1.5,"blur":"LwJ8t*jEV?og?wRms;aygPNHn$WA"},{"id":"195632a655e3b04fff339c8499d30574d87e9c95","url":"195632a655e3b04fff339c8499d30574d87e9c95.jpg","ar":1.5009,"blur":"LjL4j5o$%Lt7~qo#axofN2ngRlR*"},{"id":"19852cb1a6","url":"19852cb1a6.jpg","ar":1.4993,"blur":"LhJ86A%hxtoy~VkXxts,R+M{MxWB"},{"id":"19be1dfaab","url":"19be1dfaab.jpg","ar":0.8682,"blur":"LeCjw|MxIpWYyGRjW=azM}oft7WB"},{"id":"19d3f7dfac","url":"19d3f7dfac.jpg","ar":1.2674,"blur":"LqHCvK%L%gWY%%jYxvj[IWWBRPax"},{"id":"1a36c65d57","url":"1a36c65d57.jpg","ar":1.7297,"blur":"LED04Ssp0eo#9aWr%3r=IpNFxuj]"},{"id":"1a672ed003","url":"1a672ed003.jpg","ar":0.8652,"blur":"L~E;DyM|R.oM.TRlj]oMpJogahj["},{"id":"1ace2615d62d8862","url":"1ace2615d62d8862.jpg","ar":1.7778,"blur":"L%KnrNt6tRt8_4oet8t7t7t6ofRj"},{"id":"1adb1b7003","url":"1adb1b7003.jpg","ar":0.6667,"blur":"LlI5b*IUR*s;.Aj]s:a_?ct5M{of"},{"id":"1b69a899c2","url":"1b69a899c2.jpg","ar":1.6732,"blur":"LuH2NA~qozRjt7oLWBbHM_M{WBj["},{"id":"1bcdaa4ca5dc25a12c90de1dac6a71ca28766401","url":"1bcdaa4ca5dc25a12c90de1dac6a71ca28766401.jpg","ar":1.6598,"blur":"LHD]Yh-pRjIqnORjxuWW0LRixuxt"},{"id":"1c02f1a98fd2e39c7505066dbb24d36bef919322","url":"1c02f1a98fd2e39c7505066dbb24d36bef919322.jpg","ar":0.75,"blur":"LPLNx*%g~qt8-o-;ofRj-;xuM{V@"},{"id":"1c0a2fb619a9aae50d2cd0585436b0dc47f8e73f","url":"1c0a2fb619a9aae50d2cd0585436b0dc47f8e73f.jpg","ar":1.6667,"blur":"LSDlKRRj55S2~XRjE0bH?HR*M{of"},{"id":"1c173e621dbf0c745f883ef3b5ff37ed308e7aa7","url":"1c173e621dbf0c745f883ef3b5ff37ed308e7aa7.jpg","ar":0.6917,"blur":"LDGkn1tR~pXU58%NtRt7xrxZM{E1"},{"id":"1c4de2f922","url":"1c4de2f922.jpg","ar":1.7625,"blur":"LKD04A0Loet7%LRjWAogRkofaxog"},{"id":"1cdcca0d8dd8ce1a5d08a090c43ffe923f25917e","url":"1cdcca0d8dd8ce1a5d08a090c43ffe923f25917e.jpg","ar":1.25,"blur":"LkFZKdM|ayt7%%IVa#xux_kDj[ay"},{"id":"1d0367a3e93df452217445dbc5bf8a37d6aea978","url":"1d0367a3e93df452217445dbc5bf8a37d6aea978.jpg","ar":1.7786,"blur":"LXLqX^D%_4%NNGRj%Mt7x^WBRit7"},{"id":"1d0d3526d176d182428b84655ad015a1d5ab7fb8","url":"1d0d3526d176d182428b84655ad015a1d5ab7fb8.jpg","ar":1.0,"blur":"LQG+2D~otRxttSg3-;ofIvtSxvRk"},{"id":"1d1659341c21cb32a74a1e627f5be72f455f9109","url":"1d1659341c21cb32a74a1e627f5be72f455f9109.jpg","ar":2.0177,"blur":"LtIhjWozkXad_4xuxuWAp0t8t6bH"},{"id":"1d238de6be26fd044f39a951f5c26ce5c58b3657","url":"1d238de6be26fd044f39a951f5c26ce5c58b3657.jpg","ar":1.7786,"blur":"LBFFa7jUO@xG0M4o^*S5EL9Fw}o}"},{"id":"1d66f7f8a2","url":"1d66f7f8a2.jpg","ar":0.7363,"blur":"LiCtR}ogI[kXpMofkXbIMxj[s.ae"},{"id":"1db0f7be5c4ed774595cb1b9086c6133b319a777","url":"1db0f7be5c4ed774595cb1b9086c6133b319a777.jpg","ar":1.25,"blur":"LiKU7j9Et7%MSgx]WARj~qIAogog"},{"id":"1dfda167c5","url":"1dfda167c5.jpg","ar":1.9505,"blur":"LDR:A{.7kCxZ~qtRj[WC-=oLjut7"},{"id":"1e5b2e00e6b088a4","url":"1e5b2e00e6b088a4.jpg","ar":0.7568,"blur":"LIN,oE_N?b%N?aofR*axV@M{IUjZ"},{"id":"1ea1b5382237420c","url":"1ea1b5382237420c.jpg","ar":1.7778,"blur":"L%KeD%t5xuxu_4oet8oft7s:ofWB"},{"id":"1ef55302d7a34dcf5c11e36d008a0b69221672df","url":"1ef55302d7a34dcf5c11e36d008a0b69221672df.jpg","ar":1.5009,"blur":"LaEo}Y4nM{ay_4D%Rjt7xut7M{of"},{"id":"1f0ee9d27cdfae7745ab19815652a742d3d4a0e2","url":"1f0ee9d27cdfae7745ab19815652a742d3d4a0e2.jpg","ar":1.4988,"blur":"LkKwwh%Mb_Mx~qxt%Mt8%gRjxuX8"},{"id":"1f1a79da37","url":"1f1a79da37.jpg","ar":0.6729,"blur":"LzE:[DRnNGayyZWCofWCWtV@oKt7"},{"id":"1f4482d92f0866f2ff3887a7389d2a9f262b5fe6","url":"1f4482d92f0866f2ff3887a7389d2a9f262b5fe6.jpg","ar":1.0,"blur":"LBJkGs~CIVWU?9v|%20LxtD%V?aK"},{"id":"1f565df634","url":"1f565df634.jpg","ar":1.2234,"blur":"LJFiGWkDIUt7_N%Ms:j=^%WBM|xZ"},{"id":"1f82e601f7","url":"1f82e601f7.jpg","ar":1.4993,"blur":"LZJkis-;D%e._4M{M{t7Rjt6t7ax"},{"id":"1f8dd4779a774bcbce66821ae46295186ad86fe1","url":"1f8dd4779a774bcbce66821ae46295186ad86fe1.jpg","ar":1.0,"blur":"LNHU8;}lEmNH%%RPogoz?vR%Siog"},{"id":"1fb636c604d3bdd68ab13e4d9dbef0721d7ec664","url":"1fb636c604d3bdd68ab13e4d9dbef0721d7ec664.jpg","ar":1.25,"blur":"LJFF?K?b-=?c_3~qs+xv-;R%jcRP"},{"id":"1fbf938209","url":"1fbf938209.jpg","ar":1.4656,"blur":"LHKU1W0KyEw]ITahWDSd-;.8%Lni"},{"id":"1fc123e63e","url":"1fc123e63e.jpg","ar":1.5215,"blur":"L6RC;*tTx__1~oNLM^%Mavx_xv%N"},{"id":"1fda69d05d84b1f6e0fc9ec41ef64ce173b776d3","url":"1fda69d05d84b1f6e0fc9ec41ef64ce173b776d3.jpg","ar":1.0,"blur":"LRKw%=4Tk8NH4@%$x^9F-:?Gx]Io"},{"id":"1ff5a86b458b433f50d827e75c401fc511aa72ff","url":"1ff5a86b458b433f50d827e75c401fc511aa72ff.jpg","ar":1.2492,"blur":"LZM%}{?bIntR?wofRjxu.9ogV@oL"},{"id":"2082cb89e0c4d85d9c9880a1c522584a8d8ddd93","url":"2082cb89e0c4d85d9c9880a1c522584a8d8ddd93.jpg","ar":1.7505,"blur":"LRKnVe_NNe~q~Wx[M{V@M~Ios.Io"},{"id":"20b41f64e901bed5d61684eca322c3ca5382b50f","url":"20b41f64e901bed5d61684eca322c3ca5382b50f.jpg","ar":1.5,"blur":"LXL|}w_4W8xa~Wx]IUtRoeRkkDof"}]`);function b(e){let t=2166136261;for(let n=0;n>>0)/4294967295}function x(e){return e<650?56:96}function S(e,t){let n=Math.max(68,Math.min(168,t/10.25)),r=n*n*(.74+b(e.id+`size`)*.48),i=Math.max(.5,Math.min(2,e.ar));return{width:Math.sqrt(r*i),height:Math.sqrt(r/i)}}function ee(e,t,n,r,i){let a=Math.ceil(Math.sqrt(n*r/i)),o=Math.ceil(n/a);return{x:-35+(t%a+.5+(b(e.id+`x`)-.5)*.44)*(r+70)/a,y:-40+(Math.floor(t/a)+.5+(b(e.id+`y`)-.5)*.48)*(i+80)/o,scale:.88+b(e.id+`scale`)*.2}}function te(e,t,n,r,i){let a=t*2.399963229728653+.54,o=Math.sqrt((t+.6)/n),s=r/2+Math.cos(a)*o*r*.68,c=Math.sin(a)*o*i*.7,l=Math.max(0,1-Math.abs(s-r/2)/(r*.31));return c+=Math.sign(c||1)*l*(r<650?65:95)*(1-o*.45),{x:s,y:i/2+c,scale:.96+b(e.id+`scale`)*.18+(1-o)*.18}}function C(e,t,n,r){let i=r.x-t/2||1,a=r.y-n/2||1,o=Math.min((t/2+210)/Math.abs(i),(n/2+210)/Math.abs(a));return{x:t/2+i*o,y:n/2+a*o,scale:r.scale}}function ne(e,t){let n=Math.max(0,Math.min(1,(t-e.started)/e.duration)),r=n*n,i=r*n,a=i*n,o=a*n,s=10*i-15*a+6*o,c=n-6*i+8*a-3*o,l=64*i*(1-n)**3,u=30*r*(1-n)**2,d=1-18*r+32*i-15*a,f=192*r*(1-n)**2*(1-2*n),p=e.duration/1e3,m={},h={};for(let t of[`x`,`y`,`scale`]){let n=e.to[t]-e.from[t],r=e.velocity[t]||0,i=e.arc[t]||0;m[t]=e.from[t]+n*s+r*p*c+i*l,h[t]=n*u/p+r*d+i*f/p}return{value:m,velocity:h,done:n===1}}function w(e,t,n,r=!1){let i=e.motion?ne(e.motion,n):{value:e,velocity:{}},a={x:i.value.x,y:i.value.y,scale:i.value.scale},o=t.x-a.x,s=t.y-a.y,c=Math.hypot(o,s),l=Math.min(36,c*.055);e.motion={from:a,to:t,velocity:i.velocity,arc:{x:-s/(c||1)*l,y:o/(c||1)*l},started:n,duration:r?1:Math.min(950,600+c*.22)}}var re={opacity:1,blur:0},ie={opacity:.14,blur:2.4},ae=.02,oe=e=>1/(1+Math.exp(-14*(e-.38))),se=oe(0),ce=oe(1)-se;function le(e){if(!e.length)return()=>re;let t=e.filter(e=>Number.isFinite(e.score)),n=new Map(t.map(e=>[e.id,e.score]));if(!t.length)return()=>ie;let r=t[Math.min(5,t.length-1)].score,i=t[t.length-1].score,a=Math.max(ae,r-i);return e=>{let t=n.get(e);if(t===void 0)return ie;let i=(oe(Math.max(0,Math.min(1,1-(r-t)/a)))-se)/ce;return{opacity:.18+i*.82,blur:1.8*(1-i)**2}}}var ue=`https://huggingface.co/datasets/bep40/interior-image-field-assets/resolve/main/`;function de(e,t=360){return`${ue}images/${e.url}?w=${t}&q=80`}function fe({concurrency:e=6,cacheSize:t=64}={}){let n=[],r=[],i=new Set,a=new Map,o=!1,s=0,c=!1;function l(e){if(!e?.naturalWidth||!e.src||o)return;let n=e.src;a.delete(n),a.set(n,e),a.size>t&&a.delete(a.keys().next().value)}function u(){s=0;for(let e=0;e<2&&r.length;e++){let e=r.shift();e.cancelled?l(e.image):e.receive(e.image)}r.length&&(s=requestAnimationFrame(u))}function d(e){r.push(e),s||=requestAnimationFrame(u)}function f(){if(!o)for(n.sort((e,t)=>e.priority-t.priority);i.size{o||(e.cancelled?l(t):d(e))}).catch(()=>{}).finally(()=>{i.delete(e),f()})}}return{request(e,t,r=1e3){let i={url:e,receive:t,priority:r,cancelled:!1,image:null},o=a.get(e);return o?(a.delete(e),i.image=o,d(i)):(n.push(i),c||(c=!0,queueMicrotask(()=>{c=!1,f()}))),{cancel(){i.cancelled=!0;let e=n.indexOf(i);e>=0&&n.splice(e,1)},prioritize(e){i.priority=e}}},release:l,dispose(){o=!0,cancelAnimationFrame(s);for(let e of i)e.cancelled=!0,e.image.removeAttribute(`src`);n.length=r.length=0,a.clear()}}}var pe=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~`;function me(e){if(!e||e.length<6)return`#252823`;let t=0;for(let n of e.slice(2,6)){let e=pe.indexOf(n);if(e<0)return`#252823`;t=t*83+e}return`#${(t&16777215).toString(16).padStart(6,`0`)}`}function he(e,t=1,n=1){return Math.min(512,Math.max(256,Math.ceil(e*Math.max(t,1.25)*Math.min(n,2)/128)*128))}function ge(){let e=new Map,t=new Map,n;try{n=new Worker(new URL(new URL(`placeholder.worker-DNqHbwAK.js`,import.meta.url).href,``+import.meta.url),{type:`module`})}catch{}return n&&(n.onmessage=({data:{hash:n,url:r}})=>{e.delete(n),e.set(n,r),e.size>512&&e.delete(e.keys().next().value);for(let e of t.get(n)||[])e(r);t.delete(n)},n.onerror=()=>{n.terminate(),n=null,t.clear()}),{request(r,i){if(!r||!n)return()=>{};if(e.has(r))return i(e.get(r)),()=>{};let a=t.get(r);return a||(a=new Set,t.set(r,a),n.postMessage(r)),a.add(i),()=>a.delete(i)},dispose(){n?.terminate(),t.clear(),e.clear()}}}var _e=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),T=o(((e,t)=>{t.exports=_e()}))();function ve({results:e,onSelect:t,paused:n}){let r=(0,_.useRef)(null),i=(0,_.useRef)(null),a=(0,_.useRef)(t);return a.current=t,(0,_.useEffect)(()=>{let e=r.current,t=new Map,n=fe(),o=ge(),s=matchMedia(`(prefers-reduced-motion: reduce)`),c={width:e.clientWidth,height:e.clientHeight,results:[],pool:[],paused:!1,pointer:{x:0,y:0},x:0,y:0},l,u=performance.now(),d=0;function f(n,r,i=!1){let s=document.createElement(`button`);s.className=`image-tile`,s.type=`button`,s.dataset.imageId=n.id,s.style.backgroundColor=me(n.blur),s.style.zIndex=1+Math.floor(b(n.id)*100),e.append(s);let l=i?r:C(n,c.width,c.height,r),u={image:n,button:s,...l,target:l,motion:null,exit:!1,phase:b(n.id)*Math.PI*2};return p(u),s.style.transform=`translate3d(${l.x-u.width/2}px,${l.y-u.height/2}px,0) scale(${l.scale})`,t.set(n.id,u),u.cancelPlaceholder=o.request(n.blur,e=>{e&&t.get(n.id)===u&&!u.photo&&(s.style.backgroundImage=`url("${e}")`)}),s.onclick=()=>a.current({...n,previewURL:u.photo?.currentSrc||u.photo?.src},s.getBoundingClientRect().toJSON()),u}function p(e){let{width:t,height:n}=S(e.image,c.width);(e.width!==t||e.height!==n)&&(e.width=t,e.height=n,e.button.style.width=`${t}px`,e.button.style.height=`${n}px`)}function m(e){e.load?.cancel(),e.cancelPlaceholder?.(),e.button.remove(),e.photo&&(e.photo.remove(),n.release(e.photo)),t.delete(e.image.id)}function h(e,r){let i=de(e.image,he(e.width,e.target.scale,window.devicePixelRatio||1));e.load=n.request(i,r=>{if(e.load=null,e.exit||t.get(e.image.id)!==e){n.release(r);return}r.alt=``,r.draggable=!1,r.className=``,e.photo=r,e.button.append(r),s.matches||r.animate([{opacity:0},{opacity:1}],{duration:180,easing:`ease-out`}),r.classList.add(`loaded`)},r)}function g(e=!1){let n=performance.now(),r=new Set(c.pool.map(e=>e.id)),i=new Map(c.results.map((e,t)=>[e.id,t])),a=c.pool.map((e,t)=>c.results.length?te(e,t,c.pool.length,c.width,c.height):ee(e,t,c.pool.length,c.width,c.height)),o=le(c.results);c.pool.forEach((r,l)=>{let u=a[l],d=t.get(r.id)||f(r,u,e);d.target=u,d.exit=!1,d.button.removeAttribute(`aria-hidden`);let m=i.get(r.id);p(d),!d.photo&&!d.load&&h(d,m??200+l),d.load?.prioritize(m??200+l),d.button.setAttribute(`aria-label`,m==null?`Phóng to ảnh`:`Phóng to kết quả ${m+1}`),d.button.setAttribute(`aria-haspopup`,`dialog`);let{opacity:g,blur:_}=o(r.id);d.button.style.setProperty(`--relevance-opacity`,g),d.button.style.setProperty(`--relevance-blur`,`${_}px`),d.button.dataset.rank=m==null?``:m+1,d.button.tabIndex=c.results.length?m!=null&&m<12?0:-1:l<12?0:-1,w(d,u,n,e||s.matches)});for(let[e,i]of t)r.has(e)||i.exit||(i.exit=!0,i.load?.cancel(),i.load=null,i.button.setAttribute(`aria-hidden`,`true`),i.button.dataset.rank=``,i.button.tabIndex=-1,w(i,C(i.image,c.width,c.height,i),n,s.matches))}function _(e){let t=x(c.width),n=new Set,r=e.length?[...e,...c.pool,...y]:y,i=[];for(let e of r)if(!n.has(e.id)&&(n.add(e.id),i.push(e),i.length===t))break;c.results=e,c.pool=i,g()}function v(e){let n=e-u,r=Math.min(n/1e3,.04);if(u=e,c.paused){for(let e of t.values())e.motion&&(e.motion.started+=n);l=requestAnimationFrame(v);return}document.hidden||(d+=r);let i=1-Math.exp(-4*r);c.x+=(c.pointer.x-c.x)*i,c.y+=(c.pointer.y-c.y)*i;for(let n of t.values()){let t=!0;if(n.motion){let r=ne(n.motion,s.matches?1/0:e);Object.assign(n,r.value),t=r.done,t&&(n.motion=null)}if(n.exit&&t){m(n);continue}let r=n.phase,i=s.matches?0:Math.sin(d*.22+r)*3+c.x*7,a=s.matches?0:Math.cos(d*.18+r)*3+c.y*7;n.button.style.transform=`translate3d(${(n.x-n.width/2+i).toFixed(2)}px,${(n.y-n.height/2+a).toFixed(2)}px,0) scale(${n.scale.toFixed(4)})`,n.button.style.pointerEvents=n.exit?`none`:``}l=requestAnimationFrame(v)}c.pool=y.slice(0,x(c.width)),g(!0);let re=new ResizeObserver(([e])=>{let{width:t,height:n}=e.contentRect;(t!==c.width||n!==c.height)&&(c.width=t,c.height=n,_(c.results))});re.observe(e);let ie=e=>{e.pointerType!==`touch`&&(c.pointer.x=(e.clientX/c.width-.5)*2,c.pointer.y=(e.clientY/c.height-.5)*2)},ae=()=>{c.pointer.x=c.pointer.y=0};return e.addEventListener(`pointermove`,ie),e.addEventListener(`pointerleave`,ae),l=requestAnimationFrame(v),i.current={state:c,update:_},()=>{cancelAnimationFrame(l),re.disconnect(),e.removeEventListener(`pointermove`,ie),e.removeEventListener(`pointerleave`,ae),n.dispose(),o.dispose(),e.replaceChildren(),i.current=null}},[]),(0,_.useEffect)(()=>{i.current?.update(e)},[e]),(0,_.useEffect)(()=>{i.current&&(i.current.state.paused=n)},[n]),(0,T.jsx)(`div`,{className:`image-field`,ref:r,"aria-label":`Photograph collection`})}function ye({photo:e,onClose:t}){let n=(0,_.useRef)(null),r=(0,_.useRef)(null),i=(0,_.useRef)(!1),a=(0,_.useRef)([]),o=(0,_.useRef)(null),[s,c]=(0,_.useState)(!1),[l,u]=(0,_.useState)(!1),d=(0,_.useCallback)(()=>{let t=r.current.getBoundingClientRect(),n=e.origin;return!n||!t.width||!t.height?`scale(.96)`:`translate(${n.x+n.width/2-t.x-t.width/2}px, ${n.y+n.height/2-t.y-t.height/2}px) scale(${n.width/t.width}, ${n.height/t.height})`},[e.origin]);(0,_.useEffect)(()=>{let e=document.activeElement;return n.current.showModal(),matchMedia(`(prefers-reduced-motion: reduce)`).matches||(a.current=[r.current.animate([{transform:d(),opacity:.7},{transform:`none`,opacity:1}],{duration:560,easing:`cubic-bezier(.22,1,.36,1)`})]),()=>{a.current.forEach(e=>e.cancel()),e?.isConnected&&e.focus({preventScroll:!0})}},[d]),(0,_.useLayoutEffect)(()=>{let e=o.current;if(o.current=null,!e||matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=r.current.getBoundingClientRect();a.current=[r.current.animate([{transform:`translate(${e.x+e.width/2-t.x-t.width/2}px, ${e.y+e.height/2-t.y-t.height/2}px) scale(${e.width/t.width}, ${e.height/t.height})`},{transform:`none`}],{duration:460,easing:`cubic-bezier(.22,1,.36,1)`})]},[l]);let f=(0,_.useCallback)(async()=>{if(!i.current){if(i.current=!0,!matchMedia(`(prefers-reduced-motion: reduce)`).matches){let e=getComputedStyle(r.current).transform;a.current.forEach(e=>e.cancel());let t=r.current.animate([{transform:e===`none`?`none`:e,opacity:1},{transform:d(),opacity:0}],{duration:320,easing:`cubic-bezier(.4,0,.2,1)`,fill:`forwards`});a.current=[t],n.current.classList.add(`is-closing`),await t.finished.catch(()=>{})}t()}},[t,d]);return(0,T.jsxs)(`dialog`,{ref:n,className:`photo-viewer`,"aria-label":`Ảnh toàn màn hình`,onCancel:e=>{e.preventDefault(),f()},onClick:e=>{e.target===n.current&&f()},children:[(0,T.jsxs)(`div`,{className:`photo-toolbar`,children:[e.source?(0,T.jsx)(`a`,{href:e.source,target:`_blank`,rel:`noreferrer`,children:`View source ↗`}):(0,T.jsx)(`span`,{className:`photo-origin`,children:(e.categories||[])[0]||e.title||`Interior design`}),(0,T.jsx)(`button`,{type:`button`,"aria-label":`Đóng ảnh`,autoFocus:!0,onClick:f,children:(0,T.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,T.jsx)(`path`,{d:`m6 6 12 12M6 18 18 6`})})})]}),(0,T.jsx)(`div`,{className:`photo-viewport ${l?`is-zoomed`:``}`,onClick:e=>{e.target===e.currentTarget&&f()},children:(0,T.jsx)(`button`,{ref:r,type:`button`,className:`photo-frame`,"aria-label":l?`Thu nhỏ`:`Phóng to ảnh`,"aria-pressed":l,style:{"--photo-ar":e.ar,backgroundImage:`url("${e.previewURL||de(e,640)}")`},onClick:()=>{o.current=r.current.getBoundingClientRect(),a.current.forEach(e=>e.cancel()),u(e=>!e)},children:(0,T.jsx)(`img`,{src:de(e,2400),alt:`Ảnh nội thất đã phóng to`,className:s?`loaded`:``,onLoad:()=>c(!0)})})})]})}var be=new URL(`products-index.json`,document.baseURI).href,xe=new URL(`dist/prodimgs/`,document.baseURI).href;function Se(e){return!e||typeof e!=`string`?``:e.startsWith(`prodimgs/`)?xe+e.slice(9):e}var Ce=`interior-image-field-products-v1`,we=216e5,E=new URL(`products-gallery.json.gz`,document.baseURI).href,D=new URL(`products-gallery.json`,document.baseURI).href,Te=null;async function Ee(e){let t=await fetch(e);if(!t.ok)return null;if(typeof DecompressionStream==`function`)try{let e=t.body.pipeThrough(new DecompressionStream(`gzip`));return await new Response(e).json()}catch{return t.json().catch(()=>null)}return t.json().catch(()=>null)}async function De(){let e=await Ee(E).catch(()=>null);if(e&&e.items)return e;let t=await fetch(D).then(e=>e.ok?e.json():null).catch(()=>null);return t&&t.items?t:null}async function Oe(e){if(!e)return null;Te||=De().catch(()=>null);let t=await Te;return!t||!t.items?null:t.items[e]||null}var O=e=>String(e??``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase().trim(),k=e=>{let t=String(e??``).replace(/[^\d]/g,``);return t?Number(t):null};function ke(e,t){let n=O(t);if(!n)return e;let r=n.split(/\s+/).filter(Boolean),i=/^\d[\d.\s]*$/.test(n.replace(/\s/g,``))?k(n):null,a=[];for(let t of e){if(i!=null){if(k(t.price)!==i)continue;a.push({product:t,score:1e3});continue}let e=t.haystack,o=O(t.sku),s=O(t.name),c=O(t.brand);if(!r.every(t=>e.includes(t)))continue;let l=0;o&&(o===n?l+=1200:o.startsWith(n)?l+=600:o.includes(n)&&(l+=300)),s.includes(n)&&(l+=250),c&&c===n?l+=200:c&&c.includes(n)&&(l+=80);for(let t of r)o.includes(t)&&(l+=60),s.includes(t)&&(l+=40),c.includes(t)&&(l+=15),e.includes(t)&&(l+=6);a.push({product:t,score:l})}return a.sort((e,t)=>t.score-e.score||e.product.name.localeCompare(t.product.name,`vi`)),a.map(e=>e.product)}var Ae=null;async function je({force:e=!1}={}){if(Ae)return Ae;Ae=(async()=>{let t=Ne();if(!e&&t&&Date.now()-t.savedAt`${e} ${t}`).join(` `),n=O([e.name,e.sku,e.brand,e.price,e.category,(e.feats||[]).join(` `),t].join(` `)),r=(e.images||[]).map(Se).filter(Boolean);return{...e,images:r,haystack:n}}function Ne(){try{let e=localStorage.getItem(Ce);if(!e)return null;let t=JSON.parse(e);return!Array.isArray(t?.products)||!t.products.length?null:t}catch{return null}}function Pe(e){try{let t=e.map(({haystack:e,...t})=>t);localStorage.setItem(Ce,JSON.stringify({savedAt:Date.now(),products:t}))}catch{try{localStorage.removeItem(Ce)}catch{}}}var Fe=48;function Ie({product:e,onOpen:t,eager:n}){let[r,i]=(0,_.useState)(!1),a=e.images?.[0];return(0,T.jsxs)(`button`,{type:`button`,className:`product-card`,onClick:()=>t(e),"aria-label":`Xem ${e.name}`,children:[a&&!r?(0,T.jsx)(`img`,{src:a,alt:``,loading:n?`eager`:`lazy`,decoding:`async`,onError:()=>i(!0)}):(0,T.jsx)(`span`,{className:`product-no-image`,"aria-hidden":`true`,children:`Chưa có ảnh`}),(0,T.jsxs)(`span`,{className:`product-card-body`,children:[e.brand&&(0,T.jsx)(`span`,{className:`product-brand`,children:e.brand}),(0,T.jsx)(`span`,{className:`product-name`,children:e.name}),e.price?(0,T.jsx)(`span`,{className:`product-price`,children:e.price}):e.sku&&(0,T.jsx)(`span`,{className:`product-sku`,children:e.sku})]})]})}function Le({open:e,onClose:t,onOpenDetail:n}){let[r,i]=(0,_.useState)(null),[a,o]=(0,_.useState)(null),[s,c]=(0,_.useState)(``),[l,u]=(0,_.useState)(``),[d,f]=(0,_.useState)(Fe),p=(0,_.useRef)(null);(0,_.useEffect)(()=>{if(!e||r)return;let t=!0;return je().then(e=>{t&&i(e)}).catch(e=>{t&&o(e.message)}),()=>{t=!1}},[e,r]),(0,_.useEffect)(()=>{if(e){f(Fe);let e=setTimeout(()=>p.current?.focus(),60);return()=>clearTimeout(e)}},[e]);let m=(0,_.useMemo)(()=>{if(!r)return[];let e=new Map;for(let t of r)t.brand&&e.set(t.brand,(e.get(t.brand)||0)+1);return[...e.entries()].sort((e,t)=>t[1]-e[1]).map(([e])=>e)},[r]),h=(0,_.useMemo)(()=>r?ke(l?r.filter(e=>e.brand===l):r,s):[],[r,s,l]);return e?(0,T.jsxs)(`div`,{className:`product-panel`,role:`dialog`,"aria-label":`Tư vấn nhanh sản phẩm`,"aria-modal":`false`,children:[(0,T.jsxs)(`header`,{className:`product-panel-head`,children:[(0,T.jsxs)(`div`,{className:`product-panel-title`,children:[(0,T.jsx)(`h2`,{children:`Tư vấn nhanh`}),r&&(0,T.jsxs)(`span`,{className:`product-count`,children:[s||l?`${h.length.toLocaleString()} / `:``,r.length.toLocaleString(),` sản phẩm`]})]}),(0,T.jsx)(`form`,{className:`product-search`,role:`search`,onSubmit:e=>e.preventDefault(),children:(0,T.jsx)(`input`,{ref:p,type:`search`,value:s,onChange:e=>{c(e.target.value),f(Fe)},placeholder:`Tìm theo tên, mã, thương hiệu…`,"aria-label":`Tìm sản phẩm`,autoComplete:`off`})}),(0,T.jsx)(`button`,{type:`button`,className:`product-close`,onClick:t,"aria-label":`Đóng danh sách sản phẩm`,children:`✕`})]}),m.length>0&&(0,T.jsxs)(`div`,{className:`product-brands`,role:`group`,"aria-label":`Lọc theo thương hiệu`,children:[(0,T.jsx)(`button`,{type:`button`,className:l?``:`active`,onClick:()=>{u(``),f(Fe)},children:`Tất cả`}),m.map(e=>(0,T.jsx)(`button`,{type:`button`,className:l===e?`active`:``,onClick:()=>{u(e),f(Fe)},children:e},e))]}),(0,T.jsxs)(`div`,{className:`product-body`,children:[a&&(0,T.jsxs)(`p`,{className:`product-empty`,children:[`Không tải được danh sách sản phẩm: `,a]}),!a&&!r&&(0,T.jsx)(`p`,{className:`product-empty`,children:`Đang tải danh sách sản phẩm…`}),r&&h.length===0&&(0,T.jsx)(`p`,{className:`product-empty`,children:`Không tìm thấy sản phẩm phù hợp.`}),r&&h.length>0&&(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`div`,{className:`product-grid`,children:h.slice(0,d).map((e,t)=>(0,T.jsx)(Ie,{product:e,onOpen:n,eager:td&&(0,T.jsxs)(`button`,{type:`button`,className:`product-more`,onClick:()=>f(e=>e+Fe),children:[`Xem thêm `,Math.min(Fe,h.length-d).toLocaleString(),` sản phẩm`,(0,T.jsxs)(`span`,{className:`product-more-total`,children:[`(`,(h.length-d).toLocaleString(),` còn lại)`]})]})]})]})]}):null}function Re({product:e,onClose:t}){let[n,r]=(0,_.useState)(0),[i,a]=(0,_.useState)({}),[o,s]=(0,_.useState)(null);if((0,_.useEffect)(()=>{r(0),a({})},[e]),(0,_.useEffect)(()=>{if(!e)return;let t=!0;return s(null),Oe(e.key).then(e=>{t&&s(e)}),()=>{t=!1}},[e]),(0,_.useEffect)(()=>{if(!e)return;let n=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,n),()=>window.removeEventListener(`keydown`,n)},[e,t]),!e)return null;let c=[...e.images||[],...(o?.images||[]).map(Se)].filter((e,t,n)=>e&&n.indexOf(e)===t),l=c[n],u=o?.specs||e.specs||[],d=o?.summary||e.summary||``,f=o?.feats||e.feats||[];return(0,T.jsxs)(`div`,{className:`product-detail`,role:`dialog`,"aria-label":e.name,children:[(0,T.jsx)(`button`,{type:`button`,className:`product-detail-backdrop`,onClick:t,"aria-label":`Đóng`}),(0,T.jsxs)(`div`,{className:`product-detail-panel`,children:[(0,T.jsx)(`button`,{type:`button`,className:`product-detail-close`,onClick:t,"aria-label":`Đóng`,children:`✕`}),(0,T.jsxs)(`div`,{className:`product-detail-media`,children:[l&&!i[l]?(0,T.jsx)(`img`,{src:l,alt:e.name,onError:()=>a(e=>({...e,[l]:!0}))}):(0,T.jsx)(`div`,{className:`product-detail-noimage`,children:`Không có ảnh sản phẩm`}),c.length>1&&(0,T.jsx)(`div`,{className:`product-thumbs`,children:c.map((e,t)=>(0,T.jsx)(`button`,{type:`button`,className:t===n?`active`:``,onClick:()=>r(t),"aria-label":`Ảnh ${t+1}`,children:(0,T.jsx)(`img`,{src:e,alt:``,loading:`lazy`,onError:()=>a(t=>({...t,[e]:!0}))})},e+t))})]}),(0,T.jsxs)(`div`,{className:`product-detail-info`,children:[e.brand&&(0,T.jsx)(`span`,{className:`product-detail-brand`,children:e.brand}),(0,T.jsx)(`h3`,{children:e.name}),(0,T.jsxs)(`div`,{className:`product-detail-meta`,children:[e.price&&(0,T.jsx)(`span`,{className:`product-detail-price`,children:e.price}),e.sku&&(0,T.jsxs)(`span`,{className:`product-detail-sku`,children:[`Mã: `,e.sku]})]}),e.link&&(0,T.jsx)(`a`,{className:`product-detail-link`,href:e.link,target:`_blank`,rel:`noreferrer`,children:`Xem trên website →`}),d&&(0,T.jsx)(`p`,{className:`product-detail-summary`,children:d}),f.length>0&&(0,T.jsx)(`div`,{className:`product-detail-feats`,children:f.map(e=>(0,T.jsx)(`span`,{children:e},e))}),u.length>0&&(0,T.jsxs)(`table`,{className:`product-detail-specs`,children:[(0,T.jsx)(`caption`,{children:`Thông số kỹ thuật`}),(0,T.jsx)(`tbody`,{children:u.map(([e,t],n)=>(0,T.jsxs)(`tr`,{children:[(0,T.jsx)(`th`,{scope:`row`,children:e}),(0,T.jsx)(`td`,{children:t})]},e+n))})]})]})]})]})}function ze(){return(0,T.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,T.jsx)(`path`,{d:`m7 7 10 10M7 17 17 7`})})}function Be(){let[e,t]=(0,_.useState)(``),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)({phase:`idle`,label:``}),[o,s]=(0,_.useState)(!1),[c,l]=(0,_.useState)(null),[u,d]=(0,_.useState)(!1),[f,p]=(0,_.useState)(null),[m,h]=(0,_.useState)(1222),g=(0,_.useRef)(null),v=(0,_.useRef)(null),y=(0,_.useRef)(0),b=(0,_.useRef)(!1),x=(0,_.useRef)(null);(0,_.useEffect)(()=>{let e=new Worker(new URL(new URL(`worker-DHCTNpZY.js`,import.meta.url).href,``+import.meta.url),{type:`module`});g.current=e,e.onmessage=({data:e})=>{e.status===`loading`&&a({phase:`loading`,label:e.label,progress:e.progress}),e.status===`ready`&&(b.current=!0,a({phase:`ready`,label:``}),h(e.count)),e.status===`complete`&&e.id===y.current&&(r(e.output),s(!1),a({phase:`ready`,label:``,elapsed:e.elapsed}),x.current?.resolve({query:e.text,matches:e.output.slice(0,12).map(({id:e,score:t})=>({id:e,score:t})),elapsedMs:Math.round(e.elapsed)}),x.current=null),e.status===`error`&&(e.id==null||e.id===y.current)&&(a({phase:`error`,label:e.message}),s(!1),x.current?.reject(Error(e.message)),x.current=null)},e.onerror=e=>{a({phase:`error`,label:e.message||`Search could not start. Please reload and try again.`}),s(!1),x.current?.reject(Error(`Search worker failed.`)),x.current=null};let t=setTimeout(()=>e.postMessage({type:`init`}),900);return()=>{clearTimeout(t),e.terminate()}},[]);let S=(0,_.useCallback)(e=>{x.current?.reject(Error(`Search superseded by a newer query.`)),x.current=null,t(e),l(null);let n=++y.current,i=e.trim();if(!i){g.current?.postMessage({type:`clear`}),r([]),s(!1);return}s(!0),g.current?.postMessage({type:`search`,text:i,id:n})},[]);(0,_.useEffect)(()=>{let e=e=>{if(!f&&!(c||e.metaKey||e.ctrlKey||e.altKey)){if(e.key===`Escape`&&u){d(!1);return}e.key===`/`&&e.target.tagName!==`INPUT`&&(e.preventDefault(),v.current?.focus()),e.key===`p`&&e.target.tagName!==`INPUT`&&d(e=>!e),e.key===`Escape`&&(S(``),v.current?.blur())}};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[c,S,u,f]),(0,_.useEffect)(()=>{let e=document.modelContext;if(!e?.registerTool)return;let t=new AbortController,n={name:`search_images`,title:`Tìm ảnh nội thất`,description:`Tìm ảnh nội thất theo ý nghĩa và sắp xếp lại trường ảnh đang hiển thị. Truy vấn rỗng sẽ khôi phục bộ sưu tập.`,inputSchema:{type:`object`,properties:{query:{type:`string`,maxLength:300}},required:[`query`],additionalProperties:!1},annotations:{readOnlyHint:!1,untrustedContentHint:!1},execute:async({query:e})=>{if(typeof e!=`string`||e.length>300)throw Error(`Query must be a string of at most 300 characters.`);return S(e),e.trim()?new Promise((e,t)=>{x.current={resolve:e,reject:t}}):(await new Promise(e=>requestAnimationFrame(e)),{query:``,reset:!0})}};try{Promise.resolve(e.registerTool(n,{signal:t.signal})).catch(console.warn)}catch{}return()=>t.abort()},[S]);let ee=i.phase===`loading`,te=i.phase===`error`;return(0,T.jsxs)(`main`,{className:`app relative isolate h-dvh w-full overflow-hidden`,children:[(0,T.jsx)(ve,{results:n,paused:!!c,onSelect:(e,t)=>l({...e,origin:t})}),(0,T.jsx)(`div`,{className:`vignette`,"aria-hidden":`true`}),(0,T.jsx)(`div`,{className:`grain`,"aria-hidden":`true`}),(0,T.jsxs)(`section`,{className:`search-center`,"aria-label":`Tìm kiếm ảnh ngữ nghĩa`,children:[(0,T.jsxs)(`form`,{className:`search-pill`,role:`search`,onSubmit:t=>{t.preventDefault(),S(e)},children:[(0,T.jsx)(`input`,{ref:v,type:`text`,value:e,placeholder:`Tìm ảnh nội thất…`,"aria-label":`Tìm ảnh nội thất theo ý nghĩa`,"aria-describedby":`search-status`,autoComplete:`off`,spellCheck:`false`,maxLength:300,onChange:e=>S(e.target.value)}),e&&(0,T.jsx)(`button`,{type:`button`,className:`clear-button`,"aria-label":`Xoá tìm kiếm`,onClick:()=>{S(``),v.current?.focus()},children:(0,T.jsx)(ze,{})}),(0,T.jsx)(`div`,{className:`search-progress ${ee||o?`visible`:``}`,"aria-hidden":`true`,children:(0,T.jsx)(`span`,{style:{width:ee&&i.progress?`${i.progress}%`:`35%`}})})]}),(0,T.jsx)(`div`,{id:`search-status`,className:`search-status ${te?`has-error`:``}`,role:`status`,"aria-live":`polite`,children:te?(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`span`,{children:`Không tải được bộ tìm kiếm.`}),(0,T.jsx)(`button`,{onClick:()=>{a({phase:`loading`,label:`Retrying`}),g.current?.postMessage({type:`init`}),e.trim()&&S(e)},children:`Thử lại`}),(0,T.jsx)(`span`,{className:`error-detail`,children:i.label})]}):ee?(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`span`,{className:`status-dot`}),i.label,i.progress==null?``:` · ${Math.round(i.progress)}%`]}):o?(0,T.jsx)(`span`,{className:`sr-only`,children:`Searching`}):null})]}),(0,T.jsxs)(`footer`,{className:`footer pointer-events-none absolute inset-x-0 bottom-0 flex items-center justify-between`,children:[(0,T.jsxs)(`a`,{className:`pointer-events-auto`,href:`https://github.com/huggingface/transformers.js-examples/tree/main/semantic-image-search-web`,target:`_blank`,rel:`noreferrer`,children:[`Transformers.js `,(0,T.jsx)(`span`,{className:`version`,children:`4.3.0`})]}),(0,T.jsxs)(`button`,{type:`button`,className:`footer-catalog pointer-events-auto`,onClick:()=>d(e=>!e),"aria-expanded":u,children:[u?`Đóng danh sách`:`Tư vấn nhanh`,` `,(0,T.jsx)(`kbd`,{children:`P`})]}),(0,T.jsxs)(`span`,{children:[m.toLocaleString(),` images `,(0,T.jsx)(`span`,{className:`footer-divider`,children:`/`}),` `,b.current?`On-device search`:`Semantic search`]})]}),u&&(0,T.jsx)(Le,{open:!0,onClose:()=>d(!1),onOpenDetail:p}),f&&(0,T.jsx)(Re,{product:f,onClose:()=>p(null)}),c&&(0,T.jsx)(ye,{photo:c,onClose:()=>l(null)})]})}(0,v.createRoot)(document.getElementById(`root`)).render((0,T.jsx)(Be,{})); \ No newline at end of file diff --git a/dist/assets/index-DGvjonwp.js b/dist/assets/index-DGvjonwp.js new file mode 100644 index 0000000000000000000000000000000000000000..8ed2402eac513ed0704a6c30b797dae97e2c2506 --- /dev/null +++ b/dist/assets/index-DGvjonwp.js @@ -0,0 +1,9 @@ +var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.for(`react.view_transition`),m=Symbol.iterator;function h(e){return typeof e!=`object`||!e?null:(e=m&&e[m]||e[`@@iterator`],typeof e==`function`?e:null)}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function y(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function b(){}b.prototype=y.prototype;function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}var S=x.prototype=new b;S.constructor=x,_(S,y.prototype),S.isPureReactComponent=!0;var ee=Array.isArray;function te(){}var C={H:null,A:null,T:null,S:null},ne=Object.prototype.hasOwnProperty;function w(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return w(e.type,t,e.props)}function ie(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ae(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var oe=/\/+/g;function se(e,t){return typeof e==`object`&&e&&e.key!=null?ae(``+e.key):t.toString(36)}function ce(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(te,te):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function le(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,le(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+se(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(oe,`$&/`)+`/`),le(o,r,i,``,function(e){return e})):o!=null&&(ie(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(oe,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,S||(S=!0,re());else{var t=n(l);t!==null&&oe(x,t.startTime-e)}}}var S=!1,ee=-1,te=5,C=-1;function ne(){return g?!0:!(e.unstable_now()-Ct&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&oe(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?re():S=!1}}}var re;if(typeof y==`function`)re=function(){y(w)};else if(typeof MessageChannel<`u`){var ie=new MessageChannel,ae=ie.port2;ie.port1.onmessage=w,re=function(){ae.postMessage(null)}}else re=function(){_(w,0)};function oe(t,n){ee=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(ee),ee=-1):h=!0,oe(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,re()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1De||(e.current=Ee[De],Ee[De]=null,De--)}function k(e,t){De++,Ee[De]=e.current,e.current=t}var ke=Oe(null),Ae=Oe(null),je=Oe(null),Me=Oe(null);function Ne(e,t){switch(k(je,t),k(Ae,e),k(ke,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?up(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=up(t),e=dp(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}O(ke),k(ke,e)}function Pe(){O(ke),O(Ae),O(je)}function Fe(e){var t=e.memoizedState;t!==null&&(sh._currentValue=t.memoizedState,k(Me,e)),t=ke.current;var n=dp(t,e.type);t!==n&&(k(Ae,e),k(ke,n))}function Ie(e){Ae.current===e&&(O(ke),O(Ae)),Me.current===e&&(O(Me),sh._currentValue=Te)}var Le,Re;function ze(e){if(Le===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Le=t&&t[1]||``,Re=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Be=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?ze(n):``}function He(e,t){switch(e.tag){case 26:case 27:case 5:return ze(e.type);case 16:return ze(`Lazy`);case 13:return e.child!==t&&t!==null?ze(`Suspense Fallback`):ze(`Suspense`);case 19:return ze(`SuspenseList`);case 0:case 15:return Ve(e.type,!1);case 11:return Ve(e.type.render,!1);case 1:return Ve(e.type,!0);case 31:return ze(`Activity`);case 30:return ze(`ViewTransition`);default:return``}}function Ue(e){try{var t=``,n=null;do t+=He(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var We=Object.prototype.hasOwnProperty,Ge=t.unstable_scheduleCallback,Ke=t.unstable_cancelCallback,qe=t.unstable_shouldYield,Je=t.unstable_requestPaint,Ye=t.unstable_now,Xe=t.unstable_getCurrentPriorityLevel,Ze=t.unstable_ImmediatePriority,Qe=t.unstable_UserBlockingPriority,$e=t.unstable_NormalPriority,et=t.unstable_LowPriority,tt=t.unstable_IdlePriority,nt=t.log,rt=t.unstable_setDisableYieldValue,it=null,at=null;function ot(e){if(typeof nt==`function`&&rt(e),at&&typeof at.setStrictMode==`function`)try{at.setStrictMode(it,e)}catch{}}var st=Math.clz32?Math.clz32:ut,ct=Math.log,lt=Math.LN2;function ut(e){return e>>>=0,e===0?32:31-(ct(e)/lt|0)|0}var dt=256,ft=262144,pt=4194304;function mt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ht(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=mt(n))):i=mt(o):i=mt(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=mt(n))):i=mt(o)):i=mt(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function gt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function _t(e,t){t&8&&(t|=t&32);var n=e.entangledLanes;if(n!==0)for(e=e.entanglements,n&=t;0n;n++)t.push(e);return t}function xt(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function St(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0=xr),wr=` `,Tr=!1;function Er(e,t){switch(e){case`keyup`:return yr.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function Dr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var Or=!1;function kr(e,t){switch(e){case`compositionend`:return Dr(t);case`keypress`:return t.which===32?(Tr=!0,wr):null;case`textInput`:return e=t.data,e===wr&&Tr?null:e;default:return null}}function Ar(e,t){if(Or)return e===`compositionend`||!br&&Er(e,t)?(e=Hn(),Vn=Bn=zn=null,Or=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=$r(n)}}function ti(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ti(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ni(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Qr(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Qr(e.document)}return t}function ri(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var ii=In&&`documentMode`in document&&11>=document.documentMode,ai=null,oi=null,si=null,ci=!1;function li(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ci||ai==null||ai!==Qr(r)||(r=ai,`selectionStart`in r&&ri(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),si&&Zr(si,r)||(si=r,r=Jf(oi,`onSelect`),0>=o,i-=o,aa=1<<32-st(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),M&&sa(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),M&&sa(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return M&&sa(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&(_=v.alternate,_!==null&&h.delete(_.key===null?g:_.key)),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),M&&sa(a,g),u}function _(e,r,o,c){if(typeof o==`object`&&o&&o.type===oe&&o.key===null&&o.props.ref===void 0&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case ie:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===oe){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),go(c,o),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===he&&co(l)===r.type){n(e,r.sibling),c=a(r,o.props),go(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===oe?(c=Ki(o.props.children,e.mode,c,o.key),go(c,o),c.return=e,e=c):(c=Gi(o.type,o.key,o.props,null,e.mode,c),go(c,o),c.return=e,e=c)}return s(e);case ae:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=Yi(o,e.mode,c),c.return=e,e=c}return s(e);case he:return o=co(o),_(e,r,o,c)}if(we(o))return h(e,r,o,c);if(xe(o)){if(l=xe(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return _(e,r,ho(o),c);if(o.$$typeof===ue)return _(e,r,Pa(e,o),c);_o(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=qi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{mo=0;var i=_(e,t,n,r);return po=null,i}catch(t){if(t===no||t===io)throw t;var a=Vi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var yo=vo(!0),bo=vo(!1),xo=!1;function So(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Co(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function wo(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function To(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,W&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=Ri(e),Li(e,null,n),t}return Pi(e,r,t,n),Ri(e)}function Eo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,wt(e,n)}}function Do(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Oo=!1;function ko(){if(Oo){var e=qa;if(e!==null)throw e}}function Ao(e,t,n,r){Oo=!1;var i=e.updateQueue;xo=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(q&f)===f:(r&f)===f){f!==0&&f===Ka&&(Oo=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,h=s;f=t;var g=n;switch(h.tag){case 1:if(m=h.payload,typeof m==`function`){d=m.call(g,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=h.payload,f=typeof m==`function`?m.call(g,d,f):m,f==null)break a;d=w({},d,f);break a;case 2:xo=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),sd|=o,e.lanes=o,e.memoizedState=d}}function jo(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Mo(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=E.T,s={};s.types=o===null?null:o.types,E.T=s,hc(e,!1,t,n);try{var c=i(),l=E.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?mc(e,t,Xa(c,r),jd(e)):mc(e,t,r,jd(e))}catch(n){mc(e,t,{then:function(){},status:`rejected`,reason:n},jd())}finally{D.p=a,o!==null&&s.types!==null&&(o.types=s.types),E.T=o}}function ic(){}function ac(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=oc(e).queue;rc(e,a,t,Te,n===null?ic:function(){return sc(e),n(r)})}function oc(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:Te,baseState:Te,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:gs,lastRenderedState:Te},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:gs,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function sc(e){var t=oc(e);t.next===null&&(t=e.alternate.memoizedState),mc(e,t.next.queue,{},jd())}function cc(){return Na(sh)}function lc(){return R().memoizedState}function uc(){return R().memoizedState}function dc(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=jd();e=wo(n);var r=To(t,e,n);r!==null&&(Pd(r,t,n),Eo(r,t,n)),t={cache:za()},e.payload=t;return}t=t.return}}function fc(e,t,n){var r=jd();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},gc(e)?_c(t,n):(n=Fi(e,t,n,r),n!==null&&(Pd(n,e,r),vc(n,t,r)))}function pc(e,t,n){mc(e,t,n,jd())}function mc(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(gc(e))_c(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Xr(s,o))return Pi(e,t,i,0),G===null&&Ni(),!1}catch{}if(n=Fi(e,t,i,r),n!==null)return Pd(n,e,r),vc(n,t,r),!0}return!1}function hc(e,t,n,r){if(r={lane:2,revertLane:Pf(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},gc(e)){if(t)throw Error(i(479))}else t=Fi(e,n,r,2),t!==null&&Pd(t,e,2)}function gc(e){var t=e.alternate;return e===P||t!==null&&t===P}function _c(e,t){Zo=Xo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function vc(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,wt(e,n)}}var yc={readContext:Na,use:ms,useCallback:L,useContext:L,useEffect:L,useImperativeHandle:L,useLayoutEffect:L,useInsertionEffect:L,useMemo:L,useReducer:L,useRef:L,useState:L,useDebugValue:L,useDeferredValue:L,useTransition:L,useSyncExternalStore:L,useId:L,useHostTransitionStatus:L,useFormState:L,useActionState:L,useOptimistic:L,useMemoCache:L,useCacheRefresh:L,useEffectEvent:L},bc={readContext:Na,use:ms,useCallback:function(e,t){return ds().memoizedState=[e,t===void 0?null:t],e},useContext:Na,useEffect:Ws,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),Hs(4194308,4,Xs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Hs(4194308,4,e,t)},useInsertionEffect:function(e,t){Hs(4,2,e,t)},useMemo:function(e,t){var n=ds();t=t===void 0?null:t;var r=e();if(Qo){ot(!0);try{e()}finally{ot(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=ds();if(n!==void 0){var i=n(t);if(Qo){ot(!0);try{n(t)}finally{ot(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=fc.bind(null,P,e),[r.memoizedState,e]},useRef:function(e){var t=ds();return e={current:e},t.memoizedState=e},useState:function(e){e=Es(e);var t=e.queue,n=pc.bind(null,P,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Qs,useDeferredValue:function(e,t){return tc(ds(),e,t)},useTransition:function(){var e=Es(!1);return e=rc.bind(null,P,e.queue,!0,!1),ds().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=P,a=ds();if(M){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),G===null)throw Error(i(349));q&127||xs(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,Ws(Cs.bind(null,r,o,e),[e]),r.flags|=2048,Bs(9,{destroy:void 0},Ss.bind(null,r,o,n,t),null),n},useId:function(){var e=ds(),t=G.identifierPrefix;if(M){var n=oa,r=aa;n=(r&~(1<<32-st(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=$o++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[jt]=t,o[Mt]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(np(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&gl(t)}}return V(t),t.subtreeFlags&=-33554433,_l(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&gl(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=je.current,ya(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=fa,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[jt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||ep(e.nodeValue,n)),e||ga(t,!0)}else e=lp(e).createTextNode(r),e[jt]=t,t.stateNode=e}return V(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=ya(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[jt]=t}else ba(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),e=!1}else n=xa(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(Wo(t),t):(Wo(t),null);if(t.flags&128)throw Error(i(558))}return V(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=ya(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[jt]=t}else ba(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),a=!1}else a=xa(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(Wo(t),t):(Wo(t),null)}return Wo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),yl(t,t.updateQueue),V(t),null);case 4:return Pe(),e===null&&Wf(t.stateNode.containerInfo),t.flags|=67108864,V(t),null;case 10:return Da(t.type),V(t),null;case 19:if(qo(t),r=t.memoizedState,r===null)return V(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)bl(r,!1);else{if(Y!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=Jo(e),o!==null){for(t.flags|=128,bl(r,!1),e=o.updateQueue,t.updateQueue=e,yl(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)Wi(n,e),n=n.sibling;return Ko(t,Go.current&1|2),M&&sa(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ye()>_d&&(t.flags|=128,a=!0,bl(r,!1),t.lanes=4194304)}}else{if(!a){if(e=Jo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,yl(t,e),bl(r,!0),r.tail===null&&r.tailMode!==`collapsed`&&r.tailMode!==`visible`&&!o.alternate&&!M)return V(t),null}else 2*Ye()-r.renderingStartTime>_d&&n!==536870912&&(t.flags|=128,a=!0,bl(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}if(r.tail!==null){e=r.tail;a:{for(n=e;n!==null;){if(n.alternate!==null){n=!1;break a}n=n.sibling}n=!0}return r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ye(),e.sibling=null,o=Go.current,o=a?o&1|2:o&1,r.tailMode===`visible`||r.tailMode===`collapsed`||!n||M?Ko(t,o):(n=o,k(Ro,t),k(Go,n),zo===null&&(zo=t)),M&&sa(t,r.treeForkCount),e}return V(t),null;case 22:case 23:return Wo(t),Lo(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(V(t),t.subtreeFlags&6&&(t.flags|=8192)):V(t),n=t.updateQueue,n!==null&&yl(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&O(Qa),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Da(N),V(t),null;case 25:return null;case 30:return t.flags|=33554432,V(t),null}throw Error(i(156,t.tag))}function Sl(e,t){switch(ua(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Da(N),Pe(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ie(t),null;case 31:if(t.memoizedState!==null){if(Wo(t),t.alternate===null)throw Error(i(340));ba()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Wo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));ba()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return qo(t),e=t.flags,e&65536?(t.flags=e&-65537|128,e=t.memoizedState,e!==null&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return Pe(),null;case 10:return Da(t.type),null;case 22:case 23:return Wo(t),Lo(),e!==null&&O(Qa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Da(N),null;case 25:return null;default:return null}}function Cl(e,t){switch(ua(t),t.tag){case 3:Da(N),Pe();break;case 26:case 27:case 5:Ie(t);break;case 4:Pe();break;case 31:t.memoizedState!==null&&Wo(t);break;case 13:Wo(t);break;case 19:qo(t);break;case 10:Da(t.type);break;case 22:case 23:Wo(t),Lo(),e!==null&&O(Qa);break;case 24:Da(N)}}function wl(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Tl(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function El(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Mo(t,n)}catch(t){Z(e,e.return,t)}}}function Dl(e,t,n){n.props=Dc(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Ol(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:var i=e.stateNode,a=Ei(e.memoizedProps,i);(i.ref===null||i.ref.name!==a)&&(i.ref=Pp(a)),r=i.ref;break;case 7:if(e.stateNode===null){var o=new Fp(e);h(e.child,!1,Qp,o,void 0,void 0),e.stateNode=o}r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function kl(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Al(e,t){if((e.tag===5||e.tag===27||e.tag===6)&&e.alternate===null&&t!==null)for(var n=0;n title`))),np(r,t,n),r[jt]=e,Gt(r),t=r;break a;case`link`:if(o=Gm(`link`,`href`,a).get(t+(n.href||``))){for(s=0;sg&&(o=g,g=h,h=o);var _=ei(s,h),v=ei(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,E.T=null,n=wd,wd=null;var o=bd,s=Sd;if(X=0,xd=bd=null,Sd=0,W&6)throw Error(i(331));var c=W;if(W|=4,Zu(o.current),Uu(o,o.current,s,n),W=c,Df(0,!1),at&&typeof at.onPostCommitFiberRoot==`function`)try{at.onPostCommitFiberRoot(it,o)}catch{}return!0}finally{D.p=a,E.T=r,uf(e,t)}}function pf(e,t,n){t=Zi(n,t),t=Nc(e.stateNode,t,2),e=To(e,t,2),e!==null&&(xt(e,2),Ef(e))}function Z(e,t,n){if(e.tag===3)pf(e,e,n);else for(;t!==null;){if(t.tag===3){pf(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(yd===null||!yd.has(r))){e=Zi(n,e),n=Pc(2),r=To(t,n,2),r!==null&&(Fc(n,r,t,e),xt(r,2),Ef(r));break}}t=t.return}}function mf(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new td;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(ad=!0,i.add(n),e=hf.bind(null,e,t,n),t.then(e,e))}function hf(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Y===4||Y===3&&(q&62914560)===q&&300>Ye()-hd?W&2?ld|=n:Vd(e,0):ld|=n,dd===q&&(dd=0)),Ef(e)}function gf(e,t){t===0&&(t=yt()),e=Ii(e,t),e!==null&&(xt(e,t),Ef(e))}function _f(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),gf(e,n)}function vf(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),gf(e,n)}function yf(e,t){return Ge(e,t)}var bf=null,xf=null,Sf=!1,Cf=!1,wf=!1,Tf=0;function Ef(e){e!==xf&&e.next===null&&(xf===null?bf=xf=e:xf=xf.next=e),Cf=!0,Sf||(Sf=!0,Nf())}function Df(e,t){if(!wf&&Cf){wf=!0;do for(var n=!1,r=bf;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-st(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,Mf(r,a))}else a=q,a=ht(r,r===G?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||gt(r,a)||(n=!0,Mf(r,a))}r=r.next}while(n);wf=!1}}function Of(){kf()}function kf(){Cf=Sf=!1;var e=0;Tf!==0&&hp()&&(e=Tf);for(var t=Ye(),n=null,r=bf;r!==null;){var i=r.next,a=Af(r,t);a===0?(r.next=null,n===null?bf=i:n.next=i,i===null&&(xf=n)):(n=r,(e!==0||a&3)&&(Cf=!0)),r=i}X!==0&&X!==5||Df(e,!1),Tf!==0&&(Tf=0)}function Af(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&ap(d)&&(c=c.responseEnd,o+=u*(c$m){s.length=o;break}f=new Promise(jp.bind(f)),s.push(f)}}}if(0`u`?null:document;function Tm(e,t,n){var r=wm;if(r&&typeof t==`string`&&t){var i=fn(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),ym.has(i)||(ym.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),np(t,`link`,e),Gt(t),r.head.appendChild(t)))}}function Em(e){xm.D(e),Tm(`dns-prefetch`,e,null)}function Dm(e,t){xm.C(e,t),Tm(`preconnect`,e,t)}function Om(e,t,n){xm.L(e,t,n);var r=wm;if(r&&e&&t){var i=`link[rel="preload"][as="`+fn(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+fn(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+fn(n.imageSizes)+`"]`)):i+=`[href="`+fn(e)+`"]`;var a=i;switch(t){case`style`:a=Pm(e);break;case`script`:a=Rm(e)}if(!(vm.has(a)||(e=w({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),vm.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Fm(a))||t===`script`&&r.querySelector(zm(a))))){var o=r.createElement(`link`);np(o,`link`,e),t===`style`&&(o[zt]=!0,o.onload=o.onerror=function(){Kt(o)}),Gt(o),r.head.appendChild(o)}}}function km(e,t){xm.m(e,t);var n=wm;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+fn(r)+`"][href="`+fn(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Rm(e)}if(!vm.has(a)&&(e=w({rel:`modulepreload`,href:e},t),vm.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(zm(a)))return}r=n.createElement(`link`),np(r,`link`,e),Gt(r),n.head.appendChild(r)}}}function Am(e,t,n){xm.S(e,t,n);var r=wm;if(r&&e){var i=Wt(r).hoistableStyles,a=Pm(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Fm(a)))s.loading=5;else{e=w({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=vm.get(a))&&Hm(e,n);var c=o=r.createElement(`link`);Gt(c),np(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Vm(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function jm(e,t){xm.X(e,t);var n=wm;if(n&&e){var r=Wt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=w({src:e,async:!0},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),Gt(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mm(e,t){xm.M(e,t);var n=wm;if(n&&e){var r=Wt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=w({src:e,async:!0,type:`module`},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),Gt(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Nm(e,t,n,r){var a=(a=je.current)?bm(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(n=Pm(n.href),t=Wt(a).hoistableStyles,r=t.get(n),r||(r={type:`style`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Pm(n.href);var o=Wt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Fm(e)))?o._p||(s.instance=o,s.state.loading=5):(o=vm.get(e),o||(o={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},vm.set(e,o)),Lm(a,e,o,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(n=Rm(n),t=Wt(a).hoistableScripts,r=t.get(n),r||(r={type:`script`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Pm(e){return`href="`+fn(e)+`"`}function Fm(e){return`link[rel="stylesheet"][`+e+`]`}function Im(e){return w({},e,{"data-precedence":e.precedence,precedence:null})}function Lm(e,t,n,r){if(t=e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)){if(!0!==t[zt]){r.loading=1;return}}else t=e.createElement(`link`),t[zt]=!0,t.onload=t.onerror=Kt.bind(null,t),np(t,`link`,n),Gt(t),e.head.appendChild(t);r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2})}function Rm(e){return`[src="`+fn(e)+`"]`}function zm(e){return`script[async]`+e}function Bm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+fn(n.href)+`"]`);if(r)return t.instance=r,Gt(r),r;var a=w({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),Gt(r),np(r,`style`,a),Vm(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Pm(n.href);var o=e.querySelector(Fm(a));if(o)return t.state.loading|=4,t.instance=o,Gt(o),o;r=Im(n),(a=vm.get(a))&&Hm(r,a),o=(e.ownerDocument||e).createElement(`link`),Gt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),np(o,`link`,r),t.state.loading|=4,Vm(o,n.precedence,e),t.instance=o;case`script`:return o=Rm(n.src),(a=e.querySelector(zm(o)))?(t.instance=a,Gt(a),a):(r=n,(a=vm.get(o))&&(r=w({},n),Um(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),Gt(a),np(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Vm(r,n.precedence,e));return t.instance}function Vm(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function qm(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Jm(e,t){return e===`img`&&t.src!=null&&t.src!==``&&t.onLoad==null&&t.loading!==`lazy`}function Ym(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Xm(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio==`number`?devicePixelRatio:1)*.25}function Zm(e,t){typeof t.decode==`function`&&(e.imgCount++,t.complete||(e.imgBytes+=Xm(t),e.suspenseyImages.push(t)),e=rh.bind(e),t.decode().then(e,e))}function Qm(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Pm(r.href),a=t.querySelector(Fm(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=nh.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,Gt(a);return}a=t.ownerDocument||t,r=Im(r),(i=vm.get(i))&&Hm(r,i),a=a.createElement(`link`),Gt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=nh.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var $m=0;function eh(e,t){return e.stylesheets&&e.count===0&&ah(e,e.stylesheets),0$m?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function th(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)ah(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function nh(){this.count--,th(this)}function rh(){this.imgCount--,th(this)}var ih=null;function ah(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ih=new Map,t.forEach(oh,e),ih=null,nh.call(e))}function oh(e,t){if(!(t.state.loading&4)){var n=ih.get(e);if(n)var r=n.get(null);else{n=new Map,ih.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y=JSON.parse(`[{"id":"0004d4b651","url":"0004d4b651.jpg","ar":0.8594,"blur":"LaKUp4WBRkn$?vxuxuoM~pxuR+j["},{"id":"001160216e","url":"001160216e.jpg","ar":1.4566,"blur":"LlJ8IjMwtRoe~qRikDs:oJt7WXoJ"},{"id":"001b9c7a22","url":"001b9c7a22.jpg","ar":1.3989,"blur":"LIJHp;~q4n?bNcM_RkofM_9Z-:WB"},{"id":"00243920f3","url":"00243920f3.jpg","ar":1.4993,"blur":"LDI#li0MRPa{?v9ai^-o~qI9M_xu"},{"id":"002b1f6f2c134b5de8dc52737e774ba5b93e1055","url":"002b1f6f2c134b5de8dc52737e774ba5b93e1055.jpg","ar":1.3333,"blur":"LbC@KyRjRiWBlCWCacj[RjozRiof"},{"id":"00413fa633054264","url":"00413fa633054264.jpg","ar":0.7568,"blur":"L8Gm3[56MKI:.8DijZof4T.S.8.8"},{"id":"0059044946","url":"0059044946.jpg","ar":1.4993,"blur":"LWKnPI-;00ad-:WBazt74nWAxuWq"},{"id":"005ec5c9032f4531488ec6116ed22d937abb0270","url":"005ec5c9032f4531488ec6116ed22d937abb0270.jpg","ar":1.0,"blur":"LbNTar-mRkV[_MSjjEaJx^t3jYkC"},{"id":"00a272ab96","url":"00a272ab96.jpg","ar":1.7778,"blur":"LIJQir%hit?E~p%MRjRkMvM{tT%L"},{"id":"00c3f2ef50a572aa","url":"00c3f2ef50a572aa.jpg","ar":1.0,"blur":"LqKK~DkDbIt7.TRlxaoet8V@jXjY"},{"id":"014056ab879ee13d2f97f329aa0ce7c0b8f98381","url":"014056ab879ee13d2f97f329aa0ce7c0b8f98381.jpg","ar":1.158,"blur":"LaPGpmxuf6kC~qxutRjZIUMxRjof"},{"id":"0144ebe50c","url":"0144ebe50c.jpg","ar":1.7778,"blur":"L#H-V?0z$*nixtRjofj[V@V[oft7"},{"id":"0180811bf586a7e966145eb9a9a68f1d4bec9a9b","url":"0180811bf586a7e966145eb9a9a68f1d4bec9a9b.jpg","ar":1.4376,"blur":"LbL|lgozIooy~VE1IUkCIBafV@V@"},{"id":"01af8f7ae1de1fac20e05d4391d3a8912be1ca03","url":"01af8f7ae1de1fac20e05d4391d3a8912be1ca03.jpg","ar":1.7058,"blur":"LBGuag-:Iq?b_3t7n~j]IU00%M%1"},{"id":"01b0637bbe","url":"01b0637bbe.jpg","ar":1.4085,"blur":"LPL}T.?Hx^n$_Nxaj?oe-p%LWAbH"},{"id":"01da965e05","url":"01da965e05.jpg","ar":1.6516,"blur":"LMKn6kxvtjtQ~VIpx[kCtR?Hnkxt"},{"id":"01f554a00c698daeebb10d764d9ad0fa30217137","url":"01f554a00c698daeebb10d764d9ad0fa30217137.jpg","ar":1.7786,"blur":"LDNKCpxUbc_4?a.8M|Mx~qn$%Lx]"},{"id":"01fa1b4c91a4c4becc390c7d2d202aeed55fb3ac","url":"01fa1b4c91a4c4becc390c7d2d202aeed55fb3ac.jpg","ar":1.0,"blur":"LILW#4r;McMx_NIWD%M{x^SiIpt8"},{"id":"02076f4467","url":"02076f4467.jpg","ar":0.71,"blur":"LmK-k3NG-pkB~qbHxuoft8ogofof"},{"id":"0234975b64","url":"0234975b64.jpg","ar":0.71,"blur":"L]F$-RoftRof?woLt7j[t9fkWAay"},{"id":"0281cfa48ea78f36da950a523152ca4cc2c40a1e","url":"0281cfa48ea78f36da950a523152ca4cc2c40a1e.jpg","ar":1.7786,"blur":"LHKA[?8^~qxs~V-:%1%2-;M{IVog"},{"id":"02e07648862aa4e73fa2c902c693047bc84f44d3","url":"02e07648862aa4e73fa2c902c693047bc84f44d3.jpg","ar":1.7786,"blur":"LAL4vmR24UxZ?vo~SQR+%fkWM_W="},{"id":"030081ed6ef344462edad525ddb9705c539d328d","url":"030081ed6ef344462edad525ddb9705c539d328d.jpg","ar":1.0,"blur":"LXI=3{_4X9s,Oa%0RjE2%gxtoJR-"},{"id":"030d59eaf3","url":"030d59eaf3.jpg","ar":1.7778,"blur":"LJG+2NNGD*of%M-:D%xv~qWBs.WE"},{"id":"0411e60c40c7ed40a2efc0391af7982947cc4595","url":"0411e60c40c7ed40a2efc0391af7982947cc4595.jpg","ar":1.5009,"blur":"LRI#iR?ID%%M~q-;V@t5%ix[M{o#"},{"id":"04312d898f5527e8f1166449a4235fca08094a21","url":"04312d898f5527e8f1166449a4235fca08094a21.jpg","ar":1.0,"blur":"L,I#cLjFjZof~qoLjtj[%NbIWXay"},{"id":"04361069885f01c20b6614a127dc142646143044","url":"04361069885f01c20b6614a127dc142646143044.jpg","ar":1.7786,"blur":"LFJ[Cn57D%%1pJI9xuoz~px]RkR*"},{"id":"043f4d6c61e80b519bf5a48c2804ab8b5070922c","url":"043f4d6c61e80b519bf5a48c2804ab8b5070922c.jpg","ar":1.0,"blur":"LpOgTm%M?baeR*NGtRof_NWCE1t7"},{"id":"0450bc3d37a5380795d7f949f6e620ef8441e11a","url":"0450bc3d37a5380795d7f949f6e620ef8441e11a.jpg","ar":1.641,"blur":"LSJu1G_3j[xu8^x]xaof_4%MV@of"},{"id":"046419145602bbae04804b9dce8231bddaaf8074","url":"046419145602bbae04804b9dce8231bddaaf8074.jpg","ar":1.658,"blur":"LYIF6^~9a%bcx_-:j]afxC%hWUIo"},{"id":"04cb52c8c668f7ac6bbee7accaa311134aaafc27","url":"04cb52c8c668f7ac6bbee7accaa311134aaafc27.jpg","ar":0.6667,"blur":"LJMaO$M{ozoL.ToJWBt7~WD%RPj["},{"id":"04d41cf78e","url":"04d41cf78e.jpg","ar":1.3333,"blur":"LFLzpraJM|01?cD*M{%N_3-:Rj-:"},{"id":"05900ee7819a9680034af84b299ea88563a33a6e","url":"05900ee7819a9680034af84b299ea88563a33a6e.jpg","ar":0.962,"blur":"LYNw4gxZt6R*_4IUR+xaD%xutRof"},{"id":"05a0d26810","url":"05a0d26810.jpg","ar":0.8762,"blur":"LIK-2ma}%M-;_NoLxtV@xabHM{t6"},{"id":"05a7ff308b8914f238b0cb69941d50b59cde8141","url":"05a7ff308b8914f238b0cb69941d50b59cde8141.jpg","ar":1.0,"blur":"LDD]bk9s_N%pRZIBo#IDS+Di%L9G"},{"id":"05c9aaad4ef0c11e5ec7be9f11a63bb685d844bf","url":"05c9aaad4ef0c11e5ec7be9f11a63bb685d844bf.jpg","ar":1.0,"blur":"LeO|IOMa?Fo$^*xtIWWAEVI^M{n#"},{"id":"05e1b0ea98","url":"05e1b0ea98.jpg","ar":1.665,"blur":"LaJRXEs-M{xt~qxut8WBR.xaRkWB"},{"id":"05e2441942fefc07f27f3cd8341ff416018c0dc8","url":"05e2441942fefc07f27f3cd8341ff416018c0dc8.jpg","ar":1.6606,"blur":"LoHfL|%LM{of.TRlkCofD%V@ogWB"},{"id":"063779d7f4fb3508b906e1b1ab809d81ddb23ff6","url":"063779d7f4fb3508b906e1b1ab809d81ddb23ff6.jpg","ar":1.7778,"blur":"LMJ*eo^+NGxus*i^t6of_NM|s.WA"},{"id":"0665a6f40b","url":"0665a6f40b.jpg","ar":1.3333,"blur":"LWJRKt?w9aNGMxIVjZkC%1RjRPRP"},{"id":"06ab82854261e4ad4791ba6e66af868c5aeaa9ba","url":"06ab82854261e4ad4791ba6e66af868c5aeaa9ba.jpg","ar":1.499,"blur":"L997qfMQJ5-o?k8yXl-.%yDkIp%L"},{"id":"06ae040031","url":"06ae040031.jpg","ar":1.7778,"blur":"L7DSg[n20LXTA2%MWBIo4:kr%MRO"},{"id":"06c4afd97e80347ef53527289bb5bbc620a64930","url":"06c4afd97e80347ef53527289bb5bbc620a64930.jpg","ar":1.7778,"blur":"L4DJYa?w4mR*?cWAxuRjohWBfRRi"},{"id":"071b4e4c6d","url":"071b4e4c6d.jpg","ar":0.8018,"blur":"L98z+8x]9bNM?dofM|bIo%RiIToH"},{"id":"07b49375ff","url":"07b49375ff.jpg","ar":1.4124,"blur":"LNGvn#M_ImxZT#oyRORjESxv%3X9"},{"id":"07b7636d4b","url":"07b7636d4b.jpg","ar":1.4993,"blur":"LOJkJ,4TS4R5RPxukDsn~WaeM{WC"},{"id":"07b82ac74aaae9738baad9a0d33e8ba2a76ecec1","url":"07b82ac74aaae9738baad9a0d33e8ba2a76ecec1.jpg","ar":1.0,"blur":"LMQRzX_NF}?bMHMIrpof.8NHnhWA"},{"id":"07b8871c4b","url":"07b8871c4b.jpg","ar":1.5,"blur":"LFGuXaEM9aDh?wRks:xus,x]WXS5"},{"id":"08038d4053","url":"08038d4053.jpg","ar":1.1929,"blur":"LCF$IkIUIAM{~q-;Di?H0KE1x]IV"},{"id":"0810fad184febfa0e9add5e0a2ee43638eb659bc","url":"0810fad184febfa0e9add5e0a2ee43638eb659bc.jpg","ar":1.9827,"blur":"LkJ*elr@8_Ri~qIVITogxvM{bbt7"},{"id":"087e5129518f6cbd547f50c3e5ace0d91f924787","url":"087e5129518f6cbd547f50c3e5ace0d91f924787.jpg","ar":1.2528,"blur":"LGH.A[ITJ:_3~pxZt8%MNHM{t7V?"},{"id":"0887c4fa251a3482d82304ab303099c87f3eb3fa","url":"0887c4fa251a3482d82304ab303099c87f3eb3fa.jpg","ar":1.3722,"blur":"LGK1q84m.89F~qxuIU%MtT-;D$%L"},{"id":"08a40caf9f","url":"08a40caf9f.jpg","ar":1.6,"blur":"LNHxW;_4Mw?c~qxvxto#e-V@ofn$"},{"id":"08e7c6c0ce5ac8fbdb7461a4c75712cd0d3a7e8c","url":"08e7c6c0ce5ac8fbdb7461a4c75712cd0d3a7e8c.jpg","ar":0.8,"blur":"LDE_~$8^x]%N=^.8WARi8_%MjuWB"},{"id":"094191a64dee02e5644e472e51111bbf5f4663db","url":"094191a64dee02e5644e472e51111bbf5f4663db.jpg","ar":1.5717,"blur":"LaIq[h-:4n%M~p%LWAofj@WBaxRj"},{"id":"096c71e7b9","url":"096c71e7b9.jpg","ar":1.4993,"blur":"LMJ[Cp_3r;Ri~qoIxtxa?bM{MxjY"},{"id":"098287d9263d4540aad6b1ca0533942eecedd4b2","url":"098287d9263d4540aad6b1ca0533942eecedd4b2.jpg","ar":1.9526,"blur":"L6DcHx?vxw-4Im0LM{aKR5-oIVoy"},{"id":"09a16f36f81be708946b5d140f6c10b975c5dd62","url":"09a16f36f81be708946b5d140f6c10b975c5dd62.jpg","ar":1.498,"blur":"LHOpV.4n9FS%4nF{H?tl0L0eR5x["},{"id":"09b740d0252184e0df291a568c11f0f867b0b899","url":"09b740d0252184e0df291a568c11f0f867b0b899.jpg","ar":1.5,"blur":"LMFFTm-#9bIv~Ws+E2jvxvNHRkj="},{"id":"09e4fb21be30487ff95d14f23dd05846403d383c","url":"09e4fb21be30487ff95d14f23dd05846403d383c.jpg","ar":1.5,"blur":"LHLqLX4n?F%L?Gs,?Zt6~U-:IUD*"},{"id":"0a217058a3","url":"0a217058a3.jpg","ar":1.6678,"blur":"LOJHs_x]-p%MWVRjayof~qt7IUM{"},{"id":"0a2f5a88be9d1b3e","url":"0a2f5a88be9d1b3e.jpg","ar":1.3665,"blur":"LpL4f~Mwxut7~qM{Rka#IUWBj[WB"},{"id":"0a8c153c2b","url":"0a8c153c2b.jpg","ar":1.4981,"blur":"LjJkZLRPWBof~pjYRkt7t7axozfk"},{"id":"0a95ff4496076debdbd0c4e67486f710ff7de958","url":"0a95ff4496076debdbd0c4e67486f710ff7de958.jpg","ar":1.7786,"blur":"LKG[TQ00j^RQtn4.?a?F={NGNIM}"},{"id":"0aa1d8bdf6fe12d5","url":"0aa1d8bdf6fe12d5.jpg","ar":0.45,"blur":"LJGIWCsQIB-U~qbFRkaeE3xu-ooz"},{"id":"0ae115709800bae0a8779ffa650f698da14b5a27","url":"0ae115709800bae0a8779ffa650f698da14b5a27.jpg","ar":1.0,"blur":"LhPZ4Dx[E0slVrbwniay4TaKogjt"},{"id":"0b2ca2e0baebaf95","url":"0b2ca2e0baebaf95.jpg","ar":1.4092,"blur":"LBHU:}0K0LspW=9Ft7NG~qxt?Hjr"},{"id":"0b6bed6a9ef2b6ec2aef47cc31e87c884b986974","url":"0b6bed6a9ef2b6ec2aef47cc31e87c884b986974.jpg","ar":1.476,"blur":"LEJthz-;D%tl^+IV~p.8%29ZIVS4"},{"id":"0b8aa7492a2ae1880b2d4bc13fb8364dcac205ab","url":"0b8aa7492a2ae1880b2d4bc13fb8364dcac205ab.jpg","ar":1.7778,"blur":"LOGvIfE2vfF14To#S%#+vy-pEka$"},{"id":"0be704f472a6a87c935981b3ec47602c9bde92be","url":"0be704f472a6a87c935981b3ec47602c9bde92be.jpg","ar":1.25,"blur":"LNJ[FnOqIUjF_Nae%gRP-WxIRjoy"},{"id":"0bf7945a8cb3d2d1","url":"0bf7945a8cb3d2d1.jpg","ar":0.675,"blur":"LiGl0D%1X8t6?w%1xtayk@oes.of"},{"id":"0c174bb1b1","url":"0c174bb1b1.jpg","ar":1.5119,"blur":"L7F#p#9b9a_M~UxZ$|IC^haes+IB"},{"id":"0c234c2bed4150c52709bce6eeb0449259cb9afe","url":"0c234c2bed4150c52709bce6eeb0449259cb9afe.jpg","ar":1.3333,"blur":"LPMQ379GD%t6~VM|WCay4TxtX9s:"},{"id":"0c556d4383d64a3395fbc7394d294983aee9f634","url":"0c556d4383d64a3395fbc7394d294983aee9f634.jpg","ar":1.3344,"blur":"LEKBac?bs+kWtp-k%1o#0K~V%Lt7"},{"id":"0ca506d168","url":"0ca506d168.jpg","ar":1.2863,"blur":"LUF?FS-;b_WE%%t7o#ofE4M{ngjY"},{"id":"0cbc9d2ac8f635c3e96a84eea28580792dfce884","url":"0cbc9d2ac8f635c3e96a84eea28580792dfce884.jpg","ar":1.0,"blur":"LFIhQ#8^Mw%M%hM{NGxuE2x^xuE1"},{"id":"0d73e4dbc7","url":"0d73e4dbc7.jpg","ar":1.4144,"blur":"LFS6MZ%M?d%M-:oft7Ri?dofISRP"},{"id":"0de0a729643171c5c9fd942a7ede592f61a35bad","url":"0de0a729643171c5c9fd942a7ede592f61a35bad.jpg","ar":1.6512,"blur":"L$N11Bxu-;%M~qRiM{WB%gt7WBj]"},{"id":"0e0e1df65d2ce0a5be4baea7db4fd712023ff26b","url":"0e0e1df65d2ce0a5be4baea7db4fd712023ff26b.jpg","ar":1.5009,"blur":"LBCF|u^%-:tR9FX9WBt70LMyxvM{"},{"id":"0e62272ad930c9ac581a11dff9023c6d6d2356ea","url":"0e62272ad930c9ac581a11dff9023c6d6d2356ea.jpg","ar":0.667,"blur":"LBFYMt0K4TWB?vM{MxD*jFazNG-:"},{"id":"0e65e1ac67","url":"0e65e1ac67.jpg","ar":1.4656,"blur":"LGL4yx?v~q?G_4M_xvV@8_RjR*Io"},{"id":"0e6f868344d6f23a1fd6c9dbe46bf3d3e757870b","url":"0e6f868344d6f23a1fd6c9dbe46bf3d3e757870b.jpg","ar":1.3325,"blur":"LZFYfP~pR*IUocs:ayj[xbs:WVof"},{"id":"0e8f19b074","url":"0e8f19b074.jpg","ar":1.5306,"blur":"LUJ*hq4oM{of~pD%R*ofM|t7M{Rj"},{"id":"0ea43235685c94b98f107395f25a60cb9b011e89","url":"0ea43235685c94b98f107395f25a60cb9b011e89.jpg","ar":1.5802,"blur":"LjHL*pVXWBxu?ws8ayRktSt7ayWY"},{"id":"0ea43573788da571b4649f4621e1488137a4b7c9","url":"0ea43573788da571b4649f4621e1488137a4b7c9.jpg","ar":1.4052,"blur":"LEHxvaxDRMI:*IIpocxvIAs:xa%M"},{"id":"0ee01bd728122a1697ace2d93b2687595ccb0d41","url":"0ee01bd728122a1697ace2d93b2687595ccb0d41.jpg","ar":1.641,"blur":"LIK9}lyrD4^+%ga0WCX9KjaKS#oz"},{"id":"0f13bc9a0198fd5905cdcfb8237fbc14c8f8e256","url":"0f13bc9a0198fd5905cdcfb8237fbc14c8f8e256.jpg","ar":1.457,"blur":"LAA,qEI[8{.8~VS5M}xtMeawb;nP"},{"id":"0f1ab6e120f70c02b3ba2453b3eca3854754287f","url":"0f1ab6e120f70c02b3ba2453b3eca3854754287f.jpg","ar":1.7837,"blur":"LQFs0x?wx]IU%#tnbuV[pJtm%ft7"},{"id":"0f62efb08b","url":"0f62efb08b.jpg","ar":1.3333,"blur":"LaHBxZn34.R+%%RkROR*%Mxut7Rj"},{"id":"0f6855c9a3ec8fde3ff7ff782c7580510c9b07f4","url":"0f6855c9a3ec8fde3ff7ff782c7580510c9b07f4.jpg","ar":1.5009,"blur":"LVJkWJ%h~q%MIUaeoft8I9ofRjWB"},{"id":"0f7e16fa3de7a19c3cd70af090a899d24496ae4e","url":"0f7e16fa3de7a19c3cd70af090a899d24496ae4e.jpg","ar":1.0,"blur":"LNLgLh?aE30M0f%2jrn$?GM|%L?G"},{"id":"10451e1a838a83413ce65f273490871b2c0809c9","url":"10451e1a838a83413ce65f273490871b2c0809c9.jpg","ar":1.0,"blur":"LfI5Y-$wInt6~WWFS4WCK-NIxaRl"},{"id":"105271022eda4174d90b9aea40037ab29e802326","url":"105271022eda4174d90b9aea40037ab29e802326.jpg","ar":1.25,"blur":"LDKU4e_NRP-=?G_3.89anNt6RPxt"},{"id":"10776742fdc1fe7065295d2d3f1fe537cef1e134","url":"10776742fdc1fe7065295d2d3f1fe537cef1e134.jpg","ar":1.7773,"blur":"LFDStDI8%fM|?wIo%ft7bE%MoLs."},{"id":"10b96667fa","url":"10b96667fa.jpg","ar":1.4981,"blur":"LUJ*hu.9%Mof~q%MWEofIAIUaeR*"},{"id":"10c86fec1911d17aac66acca843f9a6ddc86c44e","url":"10c86fec1911d17aac66acca843f9a6ddc86c44e.jpg","ar":1.5054,"blur":"LRHCGtIn9E%NZ+s=bFRj4,WBxujc"},{"id":"111338df47","url":"111338df47.jpg","ar":1.9212,"blur":"LBLzy|^+_NWqu5Rj%LRjiva{Nx%2"},{"id":"113ab153ba5a3f3008cc8386a318181ad4e6fd4f","url":"113ab153ba5a3f3008cc8386a318181ad4e6fd4f.jpg","ar":1.5006,"blur":"L9F~N-aenh~qI8-o9F9ERlR+M|xu"},{"id":"115f746b04313791","url":"115f746b04313791.jpg","ar":1.0,"blur":"LJNJt9-o~p%MRjxaofay~pxtD%oJ"},{"id":"1197818c57cd32041c5dfd5385d24befba667481","url":"1197818c57cd32041c5dfd5385d24befba667481.jpg","ar":0.722,"blur":"LCC$WF^jv#Inwbe-M{sD0LNHNx%1"},{"id":"11d0bbda90080f55","url":"11d0bbda90080f55.jpg","ar":1.3571,"blur":"LID+uRIoRjWB~VR*IVWB9GxaIpaz"},{"id":"127e90aac8","url":"127e90aac8.jpg","ar":1.4993,"blur":"LSKBBuIAMwoe~U%2bIxuV[IoxZNH"},{"id":"1294ff7573e8b51e713a38cd01816215968b073e","url":"1294ff7573e8b51e713a38cd01816215968b073e.jpg","ar":1.4011,"blur":"LOH_lR_4t8jF_N%MxuaytSITRixu"},{"id":"12b1eb4e363141fa01d03040833d009676b17c91","url":"12b1eb4e363141fa01d03040833d009676b17c91.jpg","ar":1.8021,"blur":"LSEySq014:-;%fRjROt7E2xaxGWB"},{"id":"12b3821a16d99cd3025dcc2711dd2e8992acf40b","url":"12b3821a16d99cd3025dcc2711dd2e8992acf40b.jpg","ar":1.4401,"blur":"LPGb*YMeR.b_%jtnkDV?NzS*xusk"},{"id":"12ebf0d3b5","url":"12ebf0d3b5.jpg","ar":1.7668,"blur":"LTI;*O00D*IU?HRPt7xaxF%2RjM|"},{"id":"12ff65d104ad631c","url":"12ff65d104ad631c.jpg","ar":1.7778,"blur":"L%KnrNt6tRt8_4oet8t7t7t6ofRj"},{"id":"1312e94ff2","url":"1312e94ff2.jpg","ar":1.3491,"blur":"LGLNlS-n4.8__N9Gnh.8MwIT%gkC"},{"id":"1326c325cbd6f469b580076ebbc792c8488d30fc","url":"1326c325cbd6f469b580076ebbc792c8488d30fc.jpg","ar":1.7786,"blur":"LBEVse9X?IIm9YoNX6RQ4mjvk8V["},{"id":"13b205f4174fb810dc8ffe3bb830021db547f473","url":"13b205f4174fb810dc8ffe3bb830021db547f473.jpg","ar":1.3599,"blur":"LIFil4?H9YxD_Ixa-qxu~pxuD+W."},{"id":"13d72d8fe1","url":"13d72d8fe1.jpg","ar":1.3333,"blur":"LbLzppMytkx[_NWBRjaeXTMxs:t6"},{"id":"141c60ffeb","url":"141c60ffeb.jpg","ar":1.4667,"blur":"LdLW|h%2M_WC~qxZt6ay-VNaM{xZ"},{"id":"14a728c539e47070c23c87d39f571fd26703ba0f","url":"14a728c539e47070c23c87d39f571fd26703ba0f.jpg","ar":1.3344,"blur":"LJGIT3_NtS%2~W%fNIWBM_IAV?t8"},{"id":"14b817fd2e47f15194a44125a6bafb1e116250a9","url":"14b817fd2e47f15194a44125a6bafb1e116250a9.jpg","ar":1.499,"blur":"LCB3$w-=4n8_~qbIITNFM|IVxuxu"},{"id":"14bac130fa","url":"14bac130fa.jpg","ar":1.4819,"blur":"LEHU%$?utPx]-:?HRP9G00-;t7Mx"},{"id":"14c234dce46f17ac5f37853016b535cb900f9673","url":"14c234dce46f17ac5f37853016b535cb900f9673.jpg","ar":1.4376,"blur":"L8D0Jq?aI@_4I[tQ~qIV4:xu^+%M"},{"id":"150739100239c2faee914963e6a26abd01f4ff58","url":"150739100239c2faee914963e6a26abd01f4ff58.jpg","ar":1.4854,"blur":"LEGbbV.AFvAHE^^l%LEL0Kr=V@V?"},{"id":"152de8c5ae","url":"152de8c5ae.jpg","ar":1.7747,"blur":"LQKB2VIAMxoz~qRjWAxuM{xuxukC"},{"id":"1575ee00b5","url":"1575ee00b5.jpg","ar":1.2995,"blur":"LFJRHn4T-:s.?HM{9GofjbM{t8Rj"},{"id":"15df9c14cb","url":"15df9c14cb.jpg","ar":1.6,"blur":"LADI:[^,xcR-_4RiRjxb8_D%xuxa"},{"id":"16161750d314538f","url":"16161750d314538f.jpg","ar":0.6667,"blur":"LgHeRb%1Nbof_N%1xtWBXooLxZs:"},{"id":"161f9c7eef","url":"161f9c7eef.jpg","ar":1.4993,"blur":"LNJuDo0LD%Rk?baySix]W?IUxYRj"},{"id":"162b7551a0280ae84d58f0ed231b6a440b66db0a","url":"162b7551a0280ae84d58f0ed231b6a440b66db0a.jpg","ar":0.936,"blur":"LgDvvVxuW=ad.TtRt7WAk@xut7kB"},{"id":"163ecde6b8","url":"163ecde6b8.jpg","ar":1.3491,"blur":"LDRp8+j;t7tR~qogR*WC.8WEM{j?"},{"id":"163ff650396409507e0b1a6d5bc7b0012c8a9dc5","url":"163ff650396409507e0b1a6d5bc7b0012c8a9dc5.jpg","ar":1.5,"blur":"LCGS4D-:Dhd;*0MwRipI^+$yIVNH"},{"id":"16be79606a9d4610e67eb6b1f1c6e65383fb5275","url":"16be79606a9d4610e67eb6b1f1c6e65383fb5275.jpg","ar":1.0,"blur":"LAF$IqIv00%L~D%M0Kt7=r9F?bE2"},{"id":"16c718951f5bd2b194bdaed6daca339e0ea460ee","url":"16c718951f5bd2b194bdaed6daca339e0ea460ee.jpg","ar":1.5009,"blur":"LDCs1{5q-l-:NG-o%Mxa17^jxux]"},{"id":"172755c17f830d8d","url":"172755c17f830d8d.jpg","ar":0.9375,"blur":"LHEC%u9a4.n1lCM|Rj-kIwjE%MWr"},{"id":"17e09caa69388c95e1bf808a66916a5d5bf8c902","url":"17e09caa69388c95e1bf808a66916a5d5bf8c902.jpg","ar":1.7778,"blur":"LWGln$E0IAWB_4NIaxV?%$IpM_oe"},{"id":"17e9170d1ab28fe9ea5a50bfcdada87a12f61c21","url":"17e9170d1ab28fe9ea5a50bfcdada87a12f61c21.jpg","ar":1.9208,"blur":"LGGIip9F%gf5~qxuIUM|?cD*oJxt"},{"id":"17f55638b1","url":"17f55638b1.jpg","ar":1.0305,"blur":"L*EW,sROROfhyZRPaJk8RpfhjqV@"},{"id":"17fc3aa6721d8e57","url":"17fc3aa6721d8e57.jpg","ar":0.45,"blur":"LKE_%0WAE2xa~BkCNHoL^%s.xts:"},{"id":"1808b1c8d8","url":"1808b1c8d8.jpg","ar":0.75,"blur":"LYKdbyjZRP%2~qWXIVogs8s.jsRj"},{"id":"183aa5b6e79d9c8d734dc36d0256671b3ed2803a","url":"183aa5b6e79d9c8d734dc36d0256671b3ed2803a.jpg","ar":1.7897,"blur":"LPGIcmpJ4n9F0NaekEkE9xxUo#t7"},{"id":"18478a1e9b8c2e98a279546ede417ee8243dca8b","url":"18478a1e9b8c2e98a279546ede417ee8243dca8b.jpg","ar":1.0,"blur":"LCFN^z+uIpEh~o4;nOs..79aE2Sh"},{"id":"1849af8720116af4f50e5cbfa5a9a4b1d2490bea","url":"1849af8720116af4f50e5cbfa5a9a4b1d2490bea.jpg","ar":1.3333,"blur":"LDECm_0f9FM{IAE2-;xt4;-okWxu"},{"id":"184eaa723a","url":"184eaa723a.jpg","ar":1.3333,"blur":"LIIO91T0D*kX~qE2EOSOIVI;_3Nd"},{"id":"186a0e946ddaf03f5a92e92d76a537c57d48df8e","url":"186a0e946ddaf03f5a92e92d76a537c57d48df8e.jpg","ar":1.25,"blur":"L7Jt@+xR~W-;_3rA9Z%is:9FD%4."},{"id":"187564fa761923204821db8bc2438b7bc99a885b","url":"187564fa761923204821db8bc2438b7bc99a885b.jpg","ar":1.0,"blur":"LDKnlE_3f4RP%MRP%M_3M|WC_NIU"},{"id":"18958c08d8f334ce137f76905d8df4e2801bd36c","url":"18958c08d8f334ce137f76905d8df4e2801bd36c.jpg","ar":1.477,"blur":"L5S~x5~q_3_3_3of%Mof-;ayIUof"},{"id":"18ee0eb7d455f4ff878008996e8bae2852de901e","url":"18ee0eb7d455f4ff878008996e8bae2852de901e.jpg","ar":0.75,"blur":"LMHU5$0ho#tQ1RNH%MNfAv%1%2kX"},{"id":"191a686537edc4f6c1af4b29b29fac2db88afd76","url":"191a686537edc4f6c1af4b29b29fac2db88afd76.jpg","ar":1.5,"blur":"LwJ8t*jEV?og?wRms;aygPNHn$WA"},{"id":"195632a655e3b04fff339c8499d30574d87e9c95","url":"195632a655e3b04fff339c8499d30574d87e9c95.jpg","ar":1.5009,"blur":"LjL4j5o$%Lt7~qo#axofN2ngRlR*"},{"id":"19852cb1a6","url":"19852cb1a6.jpg","ar":1.4993,"blur":"LhJ86A%hxtoy~VkXxts,R+M{MxWB"},{"id":"19be1dfaab","url":"19be1dfaab.jpg","ar":0.8682,"blur":"LeCjw|MxIpWYyGRjW=azM}oft7WB"},{"id":"19d3f7dfac","url":"19d3f7dfac.jpg","ar":1.2674,"blur":"LqHCvK%L%gWY%%jYxvj[IWWBRPax"},{"id":"1a36c65d57","url":"1a36c65d57.jpg","ar":1.7297,"blur":"LED04Ssp0eo#9aWr%3r=IpNFxuj]"},{"id":"1a672ed003","url":"1a672ed003.jpg","ar":0.8652,"blur":"L~E;DyM|R.oM.TRlj]oMpJogahj["},{"id":"1ace2615d62d8862","url":"1ace2615d62d8862.jpg","ar":1.7778,"blur":"L%KnrNt6tRt8_4oet8t7t7t6ofRj"},{"id":"1adb1b7003","url":"1adb1b7003.jpg","ar":0.6667,"blur":"LlI5b*IUR*s;.Aj]s:a_?ct5M{of"},{"id":"1b69a899c2","url":"1b69a899c2.jpg","ar":1.6732,"blur":"LuH2NA~qozRjt7oLWBbHM_M{WBj["},{"id":"1bcdaa4ca5dc25a12c90de1dac6a71ca28766401","url":"1bcdaa4ca5dc25a12c90de1dac6a71ca28766401.jpg","ar":1.6598,"blur":"LHD]Yh-pRjIqnORjxuWW0LRixuxt"},{"id":"1c02f1a98fd2e39c7505066dbb24d36bef919322","url":"1c02f1a98fd2e39c7505066dbb24d36bef919322.jpg","ar":0.75,"blur":"LPLNx*%g~qt8-o-;ofRj-;xuM{V@"},{"id":"1c0a2fb619a9aae50d2cd0585436b0dc47f8e73f","url":"1c0a2fb619a9aae50d2cd0585436b0dc47f8e73f.jpg","ar":1.6667,"blur":"LSDlKRRj55S2~XRjE0bH?HR*M{of"},{"id":"1c173e621dbf0c745f883ef3b5ff37ed308e7aa7","url":"1c173e621dbf0c745f883ef3b5ff37ed308e7aa7.jpg","ar":0.6917,"blur":"LDGkn1tR~pXU58%NtRt7xrxZM{E1"},{"id":"1c4de2f922","url":"1c4de2f922.jpg","ar":1.7625,"blur":"LKD04A0Loet7%LRjWAogRkofaxog"},{"id":"1cdcca0d8dd8ce1a5d08a090c43ffe923f25917e","url":"1cdcca0d8dd8ce1a5d08a090c43ffe923f25917e.jpg","ar":1.25,"blur":"LkFZKdM|ayt7%%IVa#xux_kDj[ay"},{"id":"1d0367a3e93df452217445dbc5bf8a37d6aea978","url":"1d0367a3e93df452217445dbc5bf8a37d6aea978.jpg","ar":1.7786,"blur":"LXLqX^D%_4%NNGRj%Mt7x^WBRit7"},{"id":"1d0d3526d176d182428b84655ad015a1d5ab7fb8","url":"1d0d3526d176d182428b84655ad015a1d5ab7fb8.jpg","ar":1.0,"blur":"LQG+2D~otRxttSg3-;ofIvtSxvRk"},{"id":"1d1659341c21cb32a74a1e627f5be72f455f9109","url":"1d1659341c21cb32a74a1e627f5be72f455f9109.jpg","ar":2.0177,"blur":"LtIhjWozkXad_4xuxuWAp0t8t6bH"},{"id":"1d238de6be26fd044f39a951f5c26ce5c58b3657","url":"1d238de6be26fd044f39a951f5c26ce5c58b3657.jpg","ar":1.7786,"blur":"LBFFa7jUO@xG0M4o^*S5EL9Fw}o}"},{"id":"1d66f7f8a2","url":"1d66f7f8a2.jpg","ar":0.7363,"blur":"LiCtR}ogI[kXpMofkXbIMxj[s.ae"},{"id":"1db0f7be5c4ed774595cb1b9086c6133b319a777","url":"1db0f7be5c4ed774595cb1b9086c6133b319a777.jpg","ar":1.25,"blur":"LiKU7j9Et7%MSgx]WARj~qIAogog"},{"id":"1dfda167c5","url":"1dfda167c5.jpg","ar":1.9505,"blur":"LDR:A{.7kCxZ~qtRj[WC-=oLjut7"},{"id":"1e5b2e00e6b088a4","url":"1e5b2e00e6b088a4.jpg","ar":0.7568,"blur":"LIN,oE_N?b%N?aofR*axV@M{IUjZ"},{"id":"1ea1b5382237420c","url":"1ea1b5382237420c.jpg","ar":1.7778,"blur":"L%KeD%t5xuxu_4oet8oft7s:ofWB"},{"id":"1ef55302d7a34dcf5c11e36d008a0b69221672df","url":"1ef55302d7a34dcf5c11e36d008a0b69221672df.jpg","ar":1.5009,"blur":"LaEo}Y4nM{ay_4D%Rjt7xut7M{of"},{"id":"1f0ee9d27cdfae7745ab19815652a742d3d4a0e2","url":"1f0ee9d27cdfae7745ab19815652a742d3d4a0e2.jpg","ar":1.4988,"blur":"LkKwwh%Mb_Mx~qxt%Mt8%gRjxuX8"},{"id":"1f1a79da37","url":"1f1a79da37.jpg","ar":0.6729,"blur":"LzE:[DRnNGayyZWCofWCWtV@oKt7"},{"id":"1f4482d92f0866f2ff3887a7389d2a9f262b5fe6","url":"1f4482d92f0866f2ff3887a7389d2a9f262b5fe6.jpg","ar":1.0,"blur":"LBJkGs~CIVWU?9v|%20LxtD%V?aK"},{"id":"1f565df634","url":"1f565df634.jpg","ar":1.2234,"blur":"LJFiGWkDIUt7_N%Ms:j=^%WBM|xZ"},{"id":"1f82e601f7","url":"1f82e601f7.jpg","ar":1.4993,"blur":"LZJkis-;D%e._4M{M{t7Rjt6t7ax"},{"id":"1f8dd4779a774bcbce66821ae46295186ad86fe1","url":"1f8dd4779a774bcbce66821ae46295186ad86fe1.jpg","ar":1.0,"blur":"LNHU8;}lEmNH%%RPogoz?vR%Siog"},{"id":"1fb636c604d3bdd68ab13e4d9dbef0721d7ec664","url":"1fb636c604d3bdd68ab13e4d9dbef0721d7ec664.jpg","ar":1.25,"blur":"LJFF?K?b-=?c_3~qs+xv-;R%jcRP"},{"id":"1fbf938209","url":"1fbf938209.jpg","ar":1.4656,"blur":"LHKU1W0KyEw]ITahWDSd-;.8%Lni"},{"id":"1fc123e63e","url":"1fc123e63e.jpg","ar":1.5215,"blur":"L6RC;*tTx__1~oNLM^%Mavx_xv%N"},{"id":"1fda69d05d84b1f6e0fc9ec41ef64ce173b776d3","url":"1fda69d05d84b1f6e0fc9ec41ef64ce173b776d3.jpg","ar":1.0,"blur":"LRKw%=4Tk8NH4@%$x^9F-:?Gx]Io"},{"id":"1ff5a86b458b433f50d827e75c401fc511aa72ff","url":"1ff5a86b458b433f50d827e75c401fc511aa72ff.jpg","ar":1.2492,"blur":"LZM%}{?bIntR?wofRjxu.9ogV@oL"},{"id":"2082cb89e0c4d85d9c9880a1c522584a8d8ddd93","url":"2082cb89e0c4d85d9c9880a1c522584a8d8ddd93.jpg","ar":1.7505,"blur":"LRKnVe_NNe~q~Wx[M{V@M~Ios.Io"},{"id":"20b41f64e901bed5d61684eca322c3ca5382b50f","url":"20b41f64e901bed5d61684eca322c3ca5382b50f.jpg","ar":1.5,"blur":"LXL|}w_4W8xa~Wx]IUtRoeRkkDof"}]`);function b(e){let t=2166136261;for(let n=0;n>>0)/4294967295}function x(e){return e<650?56:96}function S(e,t){let n=Math.max(68,Math.min(168,t/10.25)),r=n*n*(.74+b(e.id+`size`)*.48),i=Math.max(.5,Math.min(2,e.ar));return{width:Math.sqrt(r*i),height:Math.sqrt(r/i)}}function ee(e,t,n,r,i){let a=Math.ceil(Math.sqrt(n*r/i)),o=Math.ceil(n/a);return{x:-35+(t%a+.5+(b(e.id+`x`)-.5)*.44)*(r+70)/a,y:-40+(Math.floor(t/a)+.5+(b(e.id+`y`)-.5)*.48)*(i+80)/o,scale:.88+b(e.id+`scale`)*.2}}function te(e,t,n,r,i){let a=t*2.399963229728653+.54,o=Math.sqrt((t+.6)/n),s=r/2+Math.cos(a)*o*r*.68,c=Math.sin(a)*o*i*.7,l=Math.max(0,1-Math.abs(s-r/2)/(r*.31));return c+=Math.sign(c||1)*l*(r<650?65:95)*(1-o*.45),{x:s,y:i/2+c,scale:.96+b(e.id+`scale`)*.18+(1-o)*.18}}function C(e,t,n,r){let i=r.x-t/2||1,a=r.y-n/2||1,o=Math.min((t/2+210)/Math.abs(i),(n/2+210)/Math.abs(a));return{x:t/2+i*o,y:n/2+a*o,scale:r.scale}}function ne(e,t){let n=Math.max(0,Math.min(1,(t-e.started)/e.duration)),r=n*n,i=r*n,a=i*n,o=a*n,s=10*i-15*a+6*o,c=n-6*i+8*a-3*o,l=64*i*(1-n)**3,u=30*r*(1-n)**2,d=1-18*r+32*i-15*a,f=192*r*(1-n)**2*(1-2*n),p=e.duration/1e3,m={},h={};for(let t of[`x`,`y`,`scale`]){let n=e.to[t]-e.from[t],r=e.velocity[t]||0,i=e.arc[t]||0;m[t]=e.from[t]+n*s+r*p*c+i*l,h[t]=n*u/p+r*d+i*f/p}return{value:m,velocity:h,done:n===1}}function w(e,t,n,r=!1){let i=e.motion?ne(e.motion,n):{value:e,velocity:{}},a={x:i.value.x,y:i.value.y,scale:i.value.scale},o=t.x-a.x,s=t.y-a.y,c=Math.hypot(o,s),l=Math.min(36,c*.055);e.motion={from:a,to:t,velocity:i.velocity,arc:{x:-s/(c||1)*l,y:o/(c||1)*l},started:n,duration:r?1:Math.min(950,600+c*.22)}}var re={opacity:1,blur:0},ie={opacity:.14,blur:2.4},ae=.02,oe=e=>1/(1+Math.exp(-14*(e-.38))),se=oe(0),ce=oe(1)-se;function le(e){if(!e.length)return()=>re;let t=e.filter(e=>Number.isFinite(e.score)),n=new Map(t.map(e=>[e.id,e.score]));if(!t.length)return()=>ie;let r=t[Math.min(5,t.length-1)].score,i=t[t.length-1].score,a=Math.max(ae,r-i);return e=>{let t=n.get(e);if(t===void 0)return ie;let i=(oe(Math.max(0,Math.min(1,1-(r-t)/a)))-se)/ce;return{opacity:.18+i*.82,blur:1.8*(1-i)**2}}}var ue=`https://huggingface.co/datasets/bep40/interior-image-field-assets/resolve/main/`;function de(e,t=360){return`${ue}images/${e.url}?w=${t}&q=80`}function fe({concurrency:e=6,cacheSize:t=64}={}){let n=[],r=[],i=new Set,a=new Map,o=!1,s=0,c=!1;function l(e){if(!e?.naturalWidth||!e.src||o)return;let n=e.src;a.delete(n),a.set(n,e),a.size>t&&a.delete(a.keys().next().value)}function u(){s=0;for(let e=0;e<2&&r.length;e++){let e=r.shift();e.cancelled?l(e.image):e.receive(e.image)}r.length&&(s=requestAnimationFrame(u))}function d(e){r.push(e),s||=requestAnimationFrame(u)}function f(){if(!o)for(n.sort((e,t)=>e.priority-t.priority);i.size{o||(e.cancelled?l(t):d(e))}).catch(()=>{}).finally(()=>{i.delete(e),f()})}}return{request(e,t,r=1e3){let i={url:e,receive:t,priority:r,cancelled:!1,image:null},o=a.get(e);return o?(a.delete(e),i.image=o,d(i)):(n.push(i),c||(c=!0,queueMicrotask(()=>{c=!1,f()}))),{cancel(){i.cancelled=!0;let e=n.indexOf(i);e>=0&&n.splice(e,1)},prioritize(e){i.priority=e}}},release:l,dispose(){o=!0,cancelAnimationFrame(s);for(let e of i)e.cancelled=!0,e.image.removeAttribute(`src`);n.length=r.length=0,a.clear()}}}var pe=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~`;function me(e){if(!e||e.length<6)return`#252823`;let t=0;for(let n of e.slice(2,6)){let e=pe.indexOf(n);if(e<0)return`#252823`;t=t*83+e}return`#${(t&16777215).toString(16).padStart(6,`0`)}`}function he(e,t=1,n=1){return Math.min(512,Math.max(256,Math.ceil(e*Math.max(t,1.25)*Math.min(n,2)/128)*128))}function ge(){let e=new Map,t=new Map,n;try{n=new Worker(new URL(new URL(`placeholder.worker-DNqHbwAK.js`,import.meta.url).href,``+import.meta.url),{type:`module`})}catch{}return n&&(n.onmessage=({data:{hash:n,url:r}})=>{e.delete(n),e.set(n,r),e.size>512&&e.delete(e.keys().next().value);for(let e of t.get(n)||[])e(r);t.delete(n)},n.onerror=()=>{n.terminate(),n=null,t.clear()}),{request(r,i){if(!r||!n)return()=>{};if(e.has(r))return i(e.get(r)),()=>{};let a=t.get(r);return a||(a=new Set,t.set(r,a),n.postMessage(r)),a.add(i),()=>a.delete(i)},dispose(){n?.terminate(),t.clear(),e.clear()}}}var _e=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),T=o(((e,t)=>{t.exports=_e()}))();function ve({results:e,onSelect:t,paused:n}){let r=(0,_.useRef)(null),i=(0,_.useRef)(null),a=(0,_.useRef)(t);return a.current=t,(0,_.useEffect)(()=>{let e=r.current,t=new Map,n=fe(),o=ge(),s=matchMedia(`(prefers-reduced-motion: reduce)`),c={width:e.clientWidth,height:e.clientHeight,results:[],pool:[],paused:!1,pointer:{x:0,y:0},x:0,y:0},l,u=performance.now(),d=0;function f(n,r,i=!1){let s=document.createElement(`button`);s.className=`image-tile`,s.type=`button`,s.dataset.imageId=n.id,s.style.backgroundColor=me(n.blur),s.style.zIndex=1+Math.floor(b(n.id)*100),e.append(s);let l=i?r:C(n,c.width,c.height,r),u={image:n,button:s,...l,target:l,motion:null,exit:!1,phase:b(n.id)*Math.PI*2};return p(u),s.style.transform=`translate3d(${l.x-u.width/2}px,${l.y-u.height/2}px,0) scale(${l.scale})`,t.set(n.id,u),u.cancelPlaceholder=o.request(n.blur,e=>{e&&t.get(n.id)===u&&!u.photo&&(s.style.backgroundImage=`url("${e}")`)}),s.onclick=()=>a.current({...n,previewURL:u.photo?.currentSrc||u.photo?.src},s.getBoundingClientRect().toJSON()),u}function p(e){let{width:t,height:n}=S(e.image,c.width);(e.width!==t||e.height!==n)&&(e.width=t,e.height=n,e.button.style.width=`${t}px`,e.button.style.height=`${n}px`)}function m(e){e.load?.cancel(),e.cancelPlaceholder?.(),e.button.remove(),e.photo&&(e.photo.remove(),n.release(e.photo)),t.delete(e.image.id)}function h(e,r){let i=de(e.image,he(e.width,e.target.scale,window.devicePixelRatio||1));e.load=n.request(i,r=>{if(e.load=null,e.exit||t.get(e.image.id)!==e){n.release(r);return}r.alt=``,r.draggable=!1,r.className=``,e.photo=r,e.button.append(r),s.matches||r.animate([{opacity:0},{opacity:1}],{duration:180,easing:`ease-out`}),r.classList.add(`loaded`)},r)}function g(e=!1){let n=performance.now(),r=new Set(c.pool.map(e=>e.id)),i=new Map(c.results.map((e,t)=>[e.id,t])),a=c.pool.map((e,t)=>c.results.length?te(e,t,c.pool.length,c.width,c.height):ee(e,t,c.pool.length,c.width,c.height)),o=le(c.results);c.pool.forEach((r,l)=>{let u=a[l],d=t.get(r.id)||f(r,u,e);d.target=u,d.exit=!1,d.button.removeAttribute(`aria-hidden`);let m=i.get(r.id);p(d),!d.photo&&!d.load&&h(d,m??200+l),d.load?.prioritize(m??200+l),d.button.setAttribute(`aria-label`,m==null?`Phóng to ảnh`:`Phóng to kết quả ${m+1}`),d.button.setAttribute(`aria-haspopup`,`dialog`);let{opacity:g,blur:_}=o(r.id);d.button.style.setProperty(`--relevance-opacity`,g),d.button.style.setProperty(`--relevance-blur`,`${_}px`),d.button.dataset.rank=m==null?``:m+1,d.button.tabIndex=c.results.length?m!=null&&m<12?0:-1:l<12?0:-1,w(d,u,n,e||s.matches)});for(let[e,i]of t)r.has(e)||i.exit||(i.exit=!0,i.load?.cancel(),i.load=null,i.button.setAttribute(`aria-hidden`,`true`),i.button.dataset.rank=``,i.button.tabIndex=-1,w(i,C(i.image,c.width,c.height,i),n,s.matches))}function _(e){let t=x(c.width),n=new Set,r=e.length?[...e,...c.pool,...y]:y,i=[];for(let e of r)if(!n.has(e.id)&&(n.add(e.id),i.push(e),i.length===t))break;c.results=e,c.pool=i,g()}function v(e){let n=e-u,r=Math.min(n/1e3,.04);if(u=e,c.paused){for(let e of t.values())e.motion&&(e.motion.started+=n);l=requestAnimationFrame(v);return}document.hidden||(d+=r);let i=1-Math.exp(-4*r);c.x+=(c.pointer.x-c.x)*i,c.y+=(c.pointer.y-c.y)*i;for(let n of t.values()){let t=!0;if(n.motion){let r=ne(n.motion,s.matches?1/0:e);Object.assign(n,r.value),t=r.done,t&&(n.motion=null)}if(n.exit&&t){m(n);continue}let r=n.phase,i=s.matches?0:Math.sin(d*.22+r)*3+c.x*7,a=s.matches?0:Math.cos(d*.18+r)*3+c.y*7;n.button.style.transform=`translate3d(${(n.x-n.width/2+i).toFixed(2)}px,${(n.y-n.height/2+a).toFixed(2)}px,0) scale(${n.scale.toFixed(4)})`,n.button.style.pointerEvents=n.exit?`none`:``}l=requestAnimationFrame(v)}c.pool=y.slice(0,x(c.width)),g(!0);let re=new ResizeObserver(([e])=>{let{width:t,height:n}=e.contentRect;(t!==c.width||n!==c.height)&&(c.width=t,c.height=n,_(c.results))});re.observe(e);let ie=e=>{e.pointerType!==`touch`&&(c.pointer.x=(e.clientX/c.width-.5)*2,c.pointer.y=(e.clientY/c.height-.5)*2)},ae=()=>{c.pointer.x=c.pointer.y=0};return e.addEventListener(`pointermove`,ie),e.addEventListener(`pointerleave`,ae),l=requestAnimationFrame(v),i.current={state:c,update:_},()=>{cancelAnimationFrame(l),re.disconnect(),e.removeEventListener(`pointermove`,ie),e.removeEventListener(`pointerleave`,ae),n.dispose(),o.dispose(),e.replaceChildren(),i.current=null}},[]),(0,_.useEffect)(()=>{i.current?.update(e)},[e]),(0,_.useEffect)(()=>{i.current&&(i.current.state.paused=n)},[n]),(0,T.jsx)(`div`,{className:`image-field`,ref:r,"aria-label":`Photograph collection`})}function ye({photo:e,onClose:t}){let n=(0,_.useRef)(null),r=(0,_.useRef)(null),i=(0,_.useRef)(!1),a=(0,_.useRef)([]),o=(0,_.useRef)(null),[s,c]=(0,_.useState)(!1),[l,u]=(0,_.useState)(!1),d=(0,_.useCallback)(()=>{let t=r.current.getBoundingClientRect(),n=e.origin;return!n||!t.width||!t.height?`scale(.96)`:`translate(${n.x+n.width/2-t.x-t.width/2}px, ${n.y+n.height/2-t.y-t.height/2}px) scale(${n.width/t.width}, ${n.height/t.height})`},[e.origin]);(0,_.useEffect)(()=>{let e=document.activeElement;return n.current.showModal(),matchMedia(`(prefers-reduced-motion: reduce)`).matches||(a.current=[r.current.animate([{transform:d(),opacity:.7},{transform:`none`,opacity:1}],{duration:560,easing:`cubic-bezier(.22,1,.36,1)`})]),()=>{a.current.forEach(e=>e.cancel()),e?.isConnected&&e.focus({preventScroll:!0})}},[d]),(0,_.useLayoutEffect)(()=>{let e=o.current;if(o.current=null,!e||matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=r.current.getBoundingClientRect();a.current=[r.current.animate([{transform:`translate(${e.x+e.width/2-t.x-t.width/2}px, ${e.y+e.height/2-t.y-t.height/2}px) scale(${e.width/t.width}, ${e.height/t.height})`},{transform:`none`}],{duration:460,easing:`cubic-bezier(.22,1,.36,1)`})]},[l]);let f=(0,_.useCallback)(async()=>{if(!i.current){if(i.current=!0,!matchMedia(`(prefers-reduced-motion: reduce)`).matches){let e=getComputedStyle(r.current).transform;a.current.forEach(e=>e.cancel());let t=r.current.animate([{transform:e===`none`?`none`:e,opacity:1},{transform:d(),opacity:0}],{duration:320,easing:`cubic-bezier(.4,0,.2,1)`,fill:`forwards`});a.current=[t],n.current.classList.add(`is-closing`),await t.finished.catch(()=>{})}t()}},[t,d]);return(0,T.jsxs)(`dialog`,{ref:n,className:`photo-viewer`,"aria-label":`Ảnh toàn màn hình`,onCancel:e=>{e.preventDefault(),f()},onClick:e=>{e.target===n.current&&f()},children:[(0,T.jsxs)(`div`,{className:`photo-toolbar`,children:[e.source?(0,T.jsx)(`a`,{href:e.source,target:`_blank`,rel:`noreferrer`,children:`View source ↗`}):(0,T.jsx)(`span`,{className:`photo-origin`,children:(e.categories||[])[0]||e.title||`Interior design`}),(0,T.jsx)(`button`,{type:`button`,"aria-label":`Đóng ảnh`,autoFocus:!0,onClick:f,children:(0,T.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,T.jsx)(`path`,{d:`m6 6 12 12M6 18 18 6`})})})]}),(0,T.jsx)(`div`,{className:`photo-viewport ${l?`is-zoomed`:``}`,onClick:e=>{e.target===e.currentTarget&&f()},children:(0,T.jsx)(`button`,{ref:r,type:`button`,className:`photo-frame`,"aria-label":l?`Thu nhỏ`:`Phóng to ảnh`,"aria-pressed":l,style:{"--photo-ar":e.ar,backgroundImage:`url("${e.previewURL||de(e,640)}")`},onClick:()=>{o.current=r.current.getBoundingClientRect(),a.current.forEach(e=>e.cancel()),u(e=>!e)},children:(0,T.jsx)(`img`,{src:de(e,2400),alt:`Ảnh nội thất đã phóng to`,className:s?`loaded`:``,onLoad:()=>c(!0)})})})]})}var be=new URL(`products-index.json`,document.baseURI).href,xe=new URL(`prodimgs/`,document.baseURI).href;function Se(e){return!e||typeof e!=`string`?``:e.startsWith(`prodimgs/`)?xe+e.slice(9):e}var Ce=`interior-image-field-products-v1`,we=216e5,E=new URL(`products-gallery.json.gz`,document.baseURI).href,D=new URL(`products-gallery.json`,document.baseURI).href,Te=null;async function Ee(e){let t=await fetch(e);if(!t.ok)return null;if(typeof DecompressionStream==`function`)try{let e=t.body.pipeThrough(new DecompressionStream(`gzip`));return await new Response(e).json()}catch{return t.json().catch(()=>null)}return t.json().catch(()=>null)}async function De(){let e=await Ee(E).catch(()=>null);if(e&&e.items)return e;let t=await fetch(D).then(e=>e.ok?e.json():null).catch(()=>null);return t&&t.items?t:null}async function Oe(e){if(!e)return null;Te||=De().catch(()=>null);let t=await Te;return!t||!t.items?null:t.items[e]||null}var O=e=>String(e??``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase().trim(),k=e=>{let t=String(e??``).replace(/[^\d]/g,``);return t?Number(t):null};function ke(e,t){let n=O(t);if(!n)return e;let r=n.split(/\s+/).filter(Boolean),i=/^\d[\d.\s]*$/.test(n.replace(/\s/g,``))?k(n):null,a=[];for(let t of e){if(i!=null){if(k(t.price)!==i)continue;a.push({product:t,score:1e3});continue}let e=t.haystack,o=O(t.sku),s=O(t.name),c=O(t.brand);if(!r.every(t=>e.includes(t)))continue;let l=0;o&&(o===n?l+=1200:o.startsWith(n)?l+=600:o.includes(n)&&(l+=300)),s.includes(n)&&(l+=250),c&&c===n?l+=200:c&&c.includes(n)&&(l+=80);for(let t of r)o.includes(t)&&(l+=60),s.includes(t)&&(l+=40),c.includes(t)&&(l+=15),e.includes(t)&&(l+=6);a.push({product:t,score:l})}return a.sort((e,t)=>t.score-e.score||e.product.name.localeCompare(t.product.name,`vi`)),a.map(e=>e.product)}var Ae=null;async function je({force:e=!1}={}){if(Ae)return Ae;Ae=(async()=>{let t=Ne();if(!e&&t&&Date.now()-t.savedAt`${e} ${t}`).join(` `),n=O([e.name,e.sku,e.brand,e.price,e.category,(e.feats||[]).join(` `),t].join(` `)),r=(e.images||[]).map(Se).filter(Boolean);return{...e,images:r,haystack:n}}function Ne(){try{let e=localStorage.getItem(Ce);if(!e)return null;let t=JSON.parse(e);return!Array.isArray(t?.products)||!t.products.length?null:t}catch{return null}}function Pe(e){try{let t=e.map(({haystack:e,...t})=>t);localStorage.setItem(Ce,JSON.stringify({savedAt:Date.now(),products:t}))}catch{try{localStorage.removeItem(Ce)}catch{}}}var Fe=48;function Ie({product:e,onOpen:t,eager:n}){let[r,i]=(0,_.useState)(!1),a=e.images?.[0];return(0,T.jsxs)(`button`,{type:`button`,className:`product-card`,onClick:()=>t(e),"aria-label":`Xem ${e.name}`,children:[a&&!r?(0,T.jsx)(`img`,{src:a,alt:``,loading:n?`eager`:`lazy`,decoding:`async`,onError:()=>i(!0)}):(0,T.jsx)(`span`,{className:`product-no-image`,"aria-hidden":`true`,children:`Chưa có ảnh`}),(0,T.jsxs)(`span`,{className:`product-card-body`,children:[e.brand&&(0,T.jsx)(`span`,{className:`product-brand`,children:e.brand}),(0,T.jsx)(`span`,{className:`product-name`,children:e.name}),e.price?(0,T.jsx)(`span`,{className:`product-price`,children:e.price}):e.sku&&(0,T.jsx)(`span`,{className:`product-sku`,children:e.sku})]})]})}function Le({open:e,onClose:t,onOpenDetail:n}){let[r,i]=(0,_.useState)(null),[a,o]=(0,_.useState)(null),[s,c]=(0,_.useState)(``),[l,u]=(0,_.useState)(``),[d,f]=(0,_.useState)(Fe),p=(0,_.useRef)(null);(0,_.useEffect)(()=>{if(!e||r)return;let t=!0;return je().then(e=>{t&&i(e)}).catch(e=>{t&&o(e.message)}),()=>{t=!1}},[e,r]),(0,_.useEffect)(()=>{if(e){f(Fe);let e=setTimeout(()=>p.current?.focus(),60);return()=>clearTimeout(e)}},[e]);let m=(0,_.useMemo)(()=>{if(!r)return[];let e=new Map;for(let t of r)t.brand&&e.set(t.brand,(e.get(t.brand)||0)+1);return[...e.entries()].sort((e,t)=>t[1]-e[1]).map(([e])=>e)},[r]),h=(0,_.useMemo)(()=>r?ke(l?r.filter(e=>e.brand===l):r,s):[],[r,s,l]);return e?(0,T.jsxs)(`div`,{className:`product-panel`,role:`dialog`,"aria-label":`Tư vấn nhanh sản phẩm`,"aria-modal":`false`,children:[(0,T.jsxs)(`header`,{className:`product-panel-head`,children:[(0,T.jsxs)(`div`,{className:`product-panel-title`,children:[(0,T.jsx)(`h2`,{children:`Tư vấn nhanh`}),r&&(0,T.jsxs)(`span`,{className:`product-count`,children:[s||l?`${h.length.toLocaleString()} / `:``,r.length.toLocaleString(),` sản phẩm`]})]}),(0,T.jsx)(`form`,{className:`product-search`,role:`search`,onSubmit:e=>e.preventDefault(),children:(0,T.jsx)(`input`,{ref:p,type:`search`,value:s,onChange:e=>{c(e.target.value),f(Fe)},placeholder:`Tìm theo tên, mã, thương hiệu…`,"aria-label":`Tìm sản phẩm`,autoComplete:`off`})}),(0,T.jsx)(`button`,{type:`button`,className:`product-close`,onClick:t,"aria-label":`Đóng danh sách sản phẩm`,children:`✕`})]}),m.length>0&&(0,T.jsxs)(`div`,{className:`product-brands`,role:`group`,"aria-label":`Lọc theo thương hiệu`,children:[(0,T.jsx)(`button`,{type:`button`,className:l?``:`active`,onClick:()=>{u(``),f(Fe)},children:`Tất cả`}),m.map(e=>(0,T.jsx)(`button`,{type:`button`,className:l===e?`active`:``,onClick:()=>{u(e),f(Fe)},children:e},e))]}),(0,T.jsxs)(`div`,{className:`product-body`,children:[a&&(0,T.jsxs)(`p`,{className:`product-empty`,children:[`Không tải được danh sách sản phẩm: `,a]}),!a&&!r&&(0,T.jsx)(`p`,{className:`product-empty`,children:`Đang tải danh sách sản phẩm…`}),r&&h.length===0&&(0,T.jsx)(`p`,{className:`product-empty`,children:`Không tìm thấy sản phẩm phù hợp.`}),r&&h.length>0&&(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`div`,{className:`product-grid`,children:h.slice(0,d).map((e,t)=>(0,T.jsx)(Ie,{product:e,onOpen:n,eager:td&&(0,T.jsxs)(`button`,{type:`button`,className:`product-more`,onClick:()=>f(e=>e+Fe),children:[`Xem thêm `,Math.min(Fe,h.length-d).toLocaleString(),` sản phẩm`,(0,T.jsxs)(`span`,{className:`product-more-total`,children:[`(`,(h.length-d).toLocaleString(),` còn lại)`]})]})]})]})]}):null}function Re({product:e,onClose:t}){let[n,r]=(0,_.useState)(0),[i,a]=(0,_.useState)({}),[o,s]=(0,_.useState)(null);if((0,_.useEffect)(()=>{r(0),a({})},[e]),(0,_.useEffect)(()=>{if(!e)return;let t=!0;return s(null),Oe(e.key).then(e=>{t&&s(e)}),()=>{t=!1}},[e]),(0,_.useEffect)(()=>{if(!e)return;let n=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,n),()=>window.removeEventListener(`keydown`,n)},[e,t]),!e)return null;let c=[...e.images||[],...(o?.images||[]).map(Se)].filter((e,t,n)=>e&&n.indexOf(e)===t),l=c[n],u=o?.specs||e.specs||[],d=o?.summary||e.summary||``,f=o?.feats||e.feats||[];return(0,T.jsxs)(`div`,{className:`product-detail`,role:`dialog`,"aria-label":e.name,children:[(0,T.jsx)(`button`,{type:`button`,className:`product-detail-backdrop`,onClick:t,"aria-label":`Đóng`}),(0,T.jsxs)(`div`,{className:`product-detail-panel`,children:[(0,T.jsx)(`button`,{type:`button`,className:`product-detail-close`,onClick:t,"aria-label":`Đóng`,children:`✕`}),(0,T.jsxs)(`div`,{className:`product-detail-media`,children:[l&&!i[l]?(0,T.jsx)(`img`,{src:l,alt:e.name,onError:()=>a(e=>({...e,[l]:!0}))}):(0,T.jsx)(`div`,{className:`product-detail-noimage`,children:`Không có ảnh sản phẩm`}),c.length>1&&(0,T.jsx)(`div`,{className:`product-thumbs`,children:c.map((e,t)=>(0,T.jsx)(`button`,{type:`button`,className:t===n?`active`:``,onClick:()=>r(t),"aria-label":`Ảnh ${t+1}`,children:(0,T.jsx)(`img`,{src:e,alt:``,loading:`lazy`,onError:()=>a(t=>({...t,[e]:!0}))})},e+t))})]}),(0,T.jsxs)(`div`,{className:`product-detail-info`,children:[e.brand&&(0,T.jsx)(`span`,{className:`product-detail-brand`,children:e.brand}),(0,T.jsx)(`h3`,{children:e.name}),(0,T.jsxs)(`div`,{className:`product-detail-meta`,children:[e.price&&(0,T.jsx)(`span`,{className:`product-detail-price`,children:e.price}),e.sku&&(0,T.jsxs)(`span`,{className:`product-detail-sku`,children:[`Mã: `,e.sku]})]}),e.link&&(0,T.jsx)(`a`,{className:`product-detail-link`,href:e.link,target:`_blank`,rel:`noreferrer`,children:`Xem trên website →`}),d&&(0,T.jsx)(`p`,{className:`product-detail-summary`,children:d}),f.length>0&&(0,T.jsx)(`div`,{className:`product-detail-feats`,children:f.map(e=>(0,T.jsx)(`span`,{children:e},e))}),u.length>0&&(0,T.jsxs)(`table`,{className:`product-detail-specs`,children:[(0,T.jsx)(`caption`,{children:`Thông số kỹ thuật`}),(0,T.jsx)(`tbody`,{children:u.map(([e,t],n)=>(0,T.jsxs)(`tr`,{children:[(0,T.jsx)(`th`,{scope:`row`,children:e}),(0,T.jsx)(`td`,{children:t})]},e+n))})]})]})]})]})}function ze(){return(0,T.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,T.jsx)(`path`,{d:`m7 7 10 10M7 17 17 7`})})}function Be(){let[e,t]=(0,_.useState)(``),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)({phase:`idle`,label:``}),[o,s]=(0,_.useState)(!1),[c,l]=(0,_.useState)(null),[u,d]=(0,_.useState)(!1),[f,p]=(0,_.useState)(null),[m,h]=(0,_.useState)(1222),g=(0,_.useRef)(null),v=(0,_.useRef)(null),y=(0,_.useRef)(0),b=(0,_.useRef)(!1),x=(0,_.useRef)(null);(0,_.useEffect)(()=>{let e=new Worker(new URL(new URL(`worker-DHCTNpZY.js`,import.meta.url).href,``+import.meta.url),{type:`module`});g.current=e,e.onmessage=({data:e})=>{e.status===`loading`&&a({phase:`loading`,label:e.label,progress:e.progress}),e.status===`ready`&&(b.current=!0,a({phase:`ready`,label:``}),h(e.count)),e.status===`complete`&&e.id===y.current&&(r(e.output),s(!1),a({phase:`ready`,label:``,elapsed:e.elapsed}),x.current?.resolve({query:e.text,matches:e.output.slice(0,12).map(({id:e,score:t})=>({id:e,score:t})),elapsedMs:Math.round(e.elapsed)}),x.current=null),e.status===`error`&&(e.id==null||e.id===y.current)&&(a({phase:`error`,label:e.message}),s(!1),x.current?.reject(Error(e.message)),x.current=null)},e.onerror=e=>{a({phase:`error`,label:e.message||`Search could not start. Please reload and try again.`}),s(!1),x.current?.reject(Error(`Search worker failed.`)),x.current=null};let t=setTimeout(()=>e.postMessage({type:`init`}),900);return()=>{clearTimeout(t),e.terminate()}},[]);let S=(0,_.useCallback)(e=>{x.current?.reject(Error(`Search superseded by a newer query.`)),x.current=null,t(e),l(null);let n=++y.current,i=e.trim();if(!i){g.current?.postMessage({type:`clear`}),r([]),s(!1);return}s(!0),g.current?.postMessage({type:`search`,text:i,id:n})},[]);(0,_.useEffect)(()=>{let e=e=>{if(!f&&!(c||e.metaKey||e.ctrlKey||e.altKey)){if(e.key===`Escape`&&u){d(!1);return}e.key===`/`&&e.target.tagName!==`INPUT`&&(e.preventDefault(),v.current?.focus()),e.key===`p`&&e.target.tagName!==`INPUT`&&d(e=>!e),e.key===`Escape`&&(S(``),v.current?.blur())}};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[c,S,u,f]),(0,_.useEffect)(()=>{let e=document.modelContext;if(!e?.registerTool)return;let t=new AbortController,n={name:`search_images`,title:`Tìm ảnh nội thất`,description:`Tìm ảnh nội thất theo ý nghĩa và sắp xếp lại trường ảnh đang hiển thị. Truy vấn rỗng sẽ khôi phục bộ sưu tập.`,inputSchema:{type:`object`,properties:{query:{type:`string`,maxLength:300}},required:[`query`],additionalProperties:!1},annotations:{readOnlyHint:!1,untrustedContentHint:!1},execute:async({query:e})=>{if(typeof e!=`string`||e.length>300)throw Error(`Query must be a string of at most 300 characters.`);return S(e),e.trim()?new Promise((e,t)=>{x.current={resolve:e,reject:t}}):(await new Promise(e=>requestAnimationFrame(e)),{query:``,reset:!0})}};try{Promise.resolve(e.registerTool(n,{signal:t.signal})).catch(console.warn)}catch{}return()=>t.abort()},[S]);let ee=i.phase===`loading`,te=i.phase===`error`;return(0,T.jsxs)(`main`,{className:`app relative isolate h-dvh w-full overflow-hidden`,children:[(0,T.jsx)(ve,{results:n,paused:!!c,onSelect:(e,t)=>l({...e,origin:t})}),(0,T.jsx)(`div`,{className:`vignette`,"aria-hidden":`true`}),(0,T.jsx)(`div`,{className:`grain`,"aria-hidden":`true`}),(0,T.jsxs)(`section`,{className:`search-center`,"aria-label":`Tìm kiếm ảnh ngữ nghĩa`,children:[(0,T.jsxs)(`form`,{className:`search-pill`,role:`search`,onSubmit:t=>{t.preventDefault(),S(e)},children:[(0,T.jsx)(`input`,{ref:v,type:`text`,value:e,placeholder:`Tìm ảnh nội thất…`,"aria-label":`Tìm ảnh nội thất theo ý nghĩa`,"aria-describedby":`search-status`,autoComplete:`off`,spellCheck:`false`,maxLength:300,onChange:e=>S(e.target.value)}),e&&(0,T.jsx)(`button`,{type:`button`,className:`clear-button`,"aria-label":`Xoá tìm kiếm`,onClick:()=>{S(``),v.current?.focus()},children:(0,T.jsx)(ze,{})}),(0,T.jsx)(`div`,{className:`search-progress ${ee||o?`visible`:``}`,"aria-hidden":`true`,children:(0,T.jsx)(`span`,{style:{width:ee&&i.progress?`${i.progress}%`:`35%`}})})]}),(0,T.jsx)(`div`,{id:`search-status`,className:`search-status ${te?`has-error`:``}`,role:`status`,"aria-live":`polite`,children:te?(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`span`,{children:`Không tải được bộ tìm kiếm.`}),(0,T.jsx)(`button`,{onClick:()=>{a({phase:`loading`,label:`Retrying`}),g.current?.postMessage({type:`init`}),e.trim()&&S(e)},children:`Thử lại`}),(0,T.jsx)(`span`,{className:`error-detail`,children:i.label})]}):ee?(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(`span`,{className:`status-dot`}),i.label,i.progress==null?``:` · ${Math.round(i.progress)}%`]}):o?(0,T.jsx)(`span`,{className:`sr-only`,children:`Searching`}):null})]}),(0,T.jsxs)(`footer`,{className:`footer pointer-events-none absolute inset-x-0 bottom-0 flex items-center justify-between`,children:[(0,T.jsxs)(`a`,{className:`pointer-events-auto`,href:`https://github.com/huggingface/transformers.js-examples/tree/main/semantic-image-search-web`,target:`_blank`,rel:`noreferrer`,children:[`Transformers.js `,(0,T.jsx)(`span`,{className:`version`,children:`4.3.0`})]}),(0,T.jsxs)(`button`,{type:`button`,className:`footer-catalog pointer-events-auto`,onClick:()=>d(e=>!e),"aria-expanded":u,children:[u?`Đóng danh sách`:`Tư vấn nhanh`,` `,(0,T.jsx)(`kbd`,{children:`P`})]}),(0,T.jsxs)(`span`,{children:[m.toLocaleString(),` images `,(0,T.jsx)(`span`,{className:`footer-divider`,children:`/`}),` `,b.current?`On-device search`:`Semantic search`]})]}),u&&(0,T.jsx)(Le,{open:!0,onClose:()=>d(!1),onOpenDetail:p}),f&&(0,T.jsx)(Re,{product:f,onClose:()=>p(null)}),c&&(0,T.jsx)(ye,{photo:c,onClose:()=>l(null)})]})}(0,v.createRoot)(document.getElementById(`root`)).render((0,T.jsx)(Be,{})); \ No newline at end of file diff --git a/dist/assets/index-DcLscXnL.css b/dist/assets/index-DcLscXnL.css new file mode 100644 index 0000000000000000000000000000000000000000..c7b44b72ba94ae7dd70bd862e8d329ebcd0117ef --- /dev/null +++ b/dist/assets/index-DcLscXnL.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--ease-out:cubic-bezier(0, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-x-0{inset-inline:0}.bottom-0{bottom:0}.isolate{isolation:isolate}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-dvh{height:100dvh}.w-full{width:100%}.shrink{flex-shrink:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.items-center{align-items:center}.justify-between{justify-content:space-between}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.capitalize{text-transform:capitalize}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter\!{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}}:root{color:#deded7;font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;background:#10110f;font-family:Arial,Helvetica,sans-serif}*{box-sizing:border-box}body{margin:0}button,input,a{-webkit-tap-highlight-color:transparent}button,input{font:inherit}button{cursor:pointer}button:focus-visible,a:focus-visible{outline-offset:5px;outline:2px solid #d7e1d1}.app{background:#11120f;min-height:320px;overflow:clip}.image-field{contain:strict;position:absolute;inset:0;overflow:clip}.image-tile{will-change:transform;transform-origin:50%;background-color:#252823;background-size:cover;border:0;border-radius:2px;padding:0;display:block;position:absolute;top:0;left:0;overflow:hidden;box-shadow:0 1px 5px #0002}.image-tile img{object-fit:cover;opacity:0;filter:brightness(.92);width:100%;height:100%;transition:opacity .12s,filter .12s}.image-tile img.loaded{opacity:1}.image-tile:hover{box-shadow:0 10px 35px #0005}.image-tile:hover img{filter:brightness()}.image-tile{opacity:var(--relevance-opacity,1);filter:blur(var(--relevance-blur,0px));transition:opacity .65s,filter .65s}.image-tile:hover,.image-tile:focus-visible{opacity:1;filter:blur()}.vignette{pointer-events:none;z-index:300;background:radial-gradient(#0000 42%,#0c0d0b30 100%),linear-gradient(0deg,#10110f99,#0000 70px);position:absolute;inset:0}.grain{z-index:301;pointer-events:none;opacity:.045;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.92' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Cpath fill='%23fff' filter='url(%23n)' opacity='.7' d='M0 0h180v180H0z'/%3E%3C/svg%3E");position:absolute;inset:0}.search-center{z-index:400;width:clamp(350px,36vw,640px);max-width:calc(100% - 44px);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.search-pill{-webkit-backdrop-filter:blur(26px)saturate(.7);backdrop-filter:blur(26px)saturate(.7);background:#e4e8ddbb;border-radius:999px;height:clamp(62px,4.8vw,84px);transition:background .25s,box-shadow .25s;position:relative;overflow:hidden;box-shadow:inset 0 1px #ffffff3d,0 6px 36px #00000018}.search-pill:focus-within{background:#e6eaddd4;box-shadow:inset 0 1px #ffffff52,0 5px 40px #0002}.search-pill input{color:#20251f;letter-spacing:-.035em;caret-color:#323b2d;background:0 0;border:0;outline:none;width:100%;height:100%;padding:0 58px 0 27px;font-size:clamp(22px,1.8vw,30px)}.search-pill input::placeholder{color:#565d54;opacity:1}.search-pill input::selection{background:#80957070}.clear-button{color:#4c5449;background:0 0;border:0;border-radius:50%;place-items:center;width:34px;height:34px;padding:7px;transition:background .15s;display:grid;position:absolute;top:50%;right:13px;transform:translateY(-50%)}.clear-button:hover{background:#0000000d}.clear-button svg{width:18px;height:18px}.search-progress{opacity:0;height:1px;transition:opacity .3s;position:absolute;bottom:0;left:24px;right:24px;overflow:hidden}.search-progress.visible{opacity:.5}.search-progress span{background:#47513f;height:100%;transition:width .3s;animation:1.6s ease-in-out infinite progress-glow;display:block}.search-status{letter-spacing:.01em;color:#d2d6ccc9;text-shadow:0 1px 5px #000,0 1px 12px #000;pointer-events:none;justify-content:center;align-items:center;gap:7px;min-height:20px;font-size:12px;display:flex;position:absolute;top:calc(100% + 13px);left:-28px;right:-28px}.status-dot{background:#d2d8c9;border-radius:50%;width:4px;height:4px;animation:1.6s ease-in-out infinite progress-glow}.has-error{pointer-events:auto;text-shadow:none;background:#171b16ee;border-radius:10px;flex-wrap:wrap;padding:12px;font-size:14px}.has-error button{color:#eee;background:0 0;border:0;border-bottom:1px solid #ccc;padding:0}.error-detail{text-align:center;opacity:.7;overflow-wrap:anywhere;width:100%;font-size:12px}.footer{z-index:401;color:#bac0b395;letter-spacing:.015em;padding:20px 24px;font-size:12px}.footer a{color:inherit;text-decoration:none;transition:color .2s}.footer a:hover{color:#f5f6ef}.version{opacity:.55;margin-left:5px}.footer-divider{opacity:.5;padding:0 8px}@keyframes progress-glow{0%,to{opacity:.4}50%{opacity:1}}@media (width<=650px){.search-center{width:min(82vw,400px)}.search-pill{height:60px}.search-pill input{padding-left:23px;font-size:22px}.footer{padding:16px;font-size:12px}.footer .version,.footer-divider{display:none}.footer>span{font-size:0}.footer>span:after{content:"On-device search";font-size:12px}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}.photo-viewer{color:#e8eae3;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);background:#0c0e0bdc;border:0;width:100vw;max-width:none;height:100dvh;max-height:none;margin:0;padding:0;position:fixed;inset:0;overflow:hidden}.photo-viewer[open]{animation:.42s both viewer-reveal;display:block}.photo-viewer::backdrop{background:#0005}.photo-viewer.is-closing{opacity:0;transition:opacity .32s;animation:none}.photo-toolbar{z-index:2;pointer-events:none;justify-content:space-between;align-items:center;display:flex;position:absolute;inset:18px 24px auto}.photo-toolbar a,.photo-toolbar button{pointer-events:auto;color:#e0e5d9;background:#12160fe6;border:1px solid #ffffff18;border-radius:999px}.photo-toolbar a{padding:12px 17px;font-size:14px;text-decoration:none}.photo-toolbar button{place-items:center;width:44px;height:44px;display:grid}.photo-toolbar svg{width:22px;height:22px}.photo-origin{pointer-events:none;color:#e0e5d9;text-overflow:ellipsis;white-space:nowrap;background:#12160fe6;border:1px solid #ffffff18;border-radius:999px;max-width:60vw;padding:12px 17px;font-size:14px;overflow:hidden}.photo-viewport{place-items:center;padding:72px 24px 40px;display:grid;position:absolute;inset:0;overflow:auto}.photo-frame{width:min(1800px, calc(100vw - 48px), calc((100dvh - 128px) * var(--photo-ar)));aspect-ratio:var(--photo-ar);cursor:zoom-in;transform-origin:50%;background-color:#161912;background-size:100% 100%;border:0;border-radius:3px;flex:none;padding:0;display:block;box-shadow:0 12px 70px #0005}.photo-frame img{object-fit:contain;opacity:0;width:100%;height:100%;transition:opacity .3s;display:block}.photo-frame img.loaded{opacity:1}.photo-viewport.is-zoomed{display:block}.photo-viewport.is-zoomed .photo-frame{width:max(calc(100vw - 48px), calc((100dvh - 128px) * var(--photo-ar)));cursor:zoom-out;margin:0 auto}@keyframes viewer-reveal{0%{opacity:0}to{opacity:1}}.product-panel{z-index:500;-webkit-backdrop-filter:blur(22px);backdrop-filter:blur(22px);color:#e6e9e0;background:#0f120eea;flex-direction:column;display:flex;position:fixed;inset:0}.product-panel-head{border-bottom:1px solid #ffffff14;align-items:center;gap:18px;padding:20px 26px 14px;display:flex}.product-panel-title{flex:none;align-items:baseline;gap:11px;display:flex}.product-panel-title h2{letter-spacing:-.02em;margin:0;font-size:19px;font-weight:600}.product-count{color:#a8b09e;white-space:nowrap;font-size:12px}.product-search{flex:1;min-width:0}.product-search input{color:#eef1e8;background:#ffffff0f;border:1px solid #ffffff1f;border-radius:999px;outline:none;width:100%;height:42px;padding:0 18px;font-size:15px;transition:border-color .2s,background .2s}.product-search input:focus{background:#ffffff17;border-color:#ffffff45}.product-search input::placeholder{color:#8b9382}.product-search input::-webkit-search-cancel-button{filter:invert(.7)}.product-close{color:#dfe3d8;cursor:pointer;background:#ffffff0d;border:1px solid #ffffff1f;border-radius:50%;flex:none;width:40px;height:40px;font-size:15px;transition:background .18s}.product-close:hover{background:#ffffff1c}.product-brands{border-bottom:1px solid #ffffff10;flex-wrap:wrap;gap:8px;padding:13px 26px;display:flex}.product-brands button{color:#c3c9ba;cursor:pointer;background:0 0;border:1px solid #ffffff1a;border-radius:999px;padding:7px 15px;font-size:13px;transition:background .18s,color .18s,border-color .18s}.product-brands button:hover{color:#eef1e8;background:#ffffff12}.product-brands button.active{color:#1d231b;background:#e4e8dd;border-color:#e4e8dd}.product-body{overscroll-behavior:contain;flex:1;padding:20px 26px 40px;overflow-y:auto}.product-grid{grid-template-columns:repeat(auto-fill,minmax(178px,1fr));gap:15px;display:grid}.product-card{color:inherit;text-align:left;cursor:pointer;background:#1a1e17;border:1px solid #ffffff14;border-radius:11px;flex-direction:column;padding:0;transition:transform .22s cubic-bezier(.2,.7,.3,1),border-color .22s,box-shadow .22s;display:flex;overflow:hidden}.product-card:hover,.product-card:focus-visible{border-color:#fff3;transform:translateY(-3px);box-shadow:0 12px 34px #00000059}.product-card img{aspect-ratio:4/3;object-fit:cover;background:#12160f;width:100%;display:block}.product-no-image{aspect-ratio:4/3;color:#6f7767;background:#171b14;place-items:center;width:100%;font-size:12px;display:grid}.product-card-body{flex-direction:column;gap:3px;padding:10px 12px 12px;display:flex}.product-brand{letter-spacing:.07em;text-transform:uppercase;color:#8b9a7c;font-size:10.5px}.product-name{-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:13.5px;line-height:1.34;display:-webkit-box;overflow:hidden}.product-price{color:#dfe6d2;margin-top:2px;font-size:13px;font-weight:600}.product-sku{color:#8b9382;margin-top:2px;font-size:11.5px}.product-more{color:#e8ece1;cursor:pointer;background:#ffffff0f;border:1px solid #ffffff26;border-radius:999px;margin:24px auto 0;padding:13px 30px;font-size:14px;transition:background .2s;display:block}.product-more:hover{background:#ffffff1c}.product-more-total{color:#8b9382;margin-left:5px;font-size:12.5px}.product-empty{text-align:center;color:#99a08f;padding:60px 0;font-size:14px}.footer-catalog{color:#dfe3d8;cursor:pointer;background:#ffffff0f;border:1px solid #ffffff1f;border-radius:999px;padding:9px 17px;font-size:13px;transition:background .2s,border-color .2s}.footer-catalog:hover{background:#ffffff1c;border-color:#ffffff38}.footer-catalog kbd{background:#ffffff1a;border-radius:4px;margin-left:6px;padding:1px 6px;font-family:inherit;font-size:11px}.product-detail{z-index:600;place-items:center;padding:26px;display:grid;position:fixed;inset:0}.product-detail-backdrop{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);cursor:zoom-out;background:#050705d9;border:0;position:absolute;inset:0}.product-detail-panel{background:#161a13;border-radius:15px;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:0;width:min(1080px,100%);max-height:min(88dvh,900px);animation:.32s both viewer-reveal;display:grid;position:relative;overflow:hidden;box-shadow:0 30px 90px #000000a6}.product-detail-close{z-index:2;color:#e2e6db;cursor:pointer;background:#0d100ae0;border:1px solid #ffffff24;border-radius:50%;width:38px;height:38px;font-size:14px;position:absolute;top:13px;right:13px}.product-detail-close:hover{background:#0d100a}.product-detail-media{background:#0e110c;flex-direction:column;display:flex}.product-detail-media>img{object-fit:contain;width:100%;height:auto;max-height:60dvh;display:block}.product-detail-noimage{color:#6f7767;place-items:center;min-height:260px;font-size:13px;display:grid}.product-thumbs{gap:8px;padding:12px;display:flex;overflow-x:auto}.product-thumbs button{cursor:pointer;opacity:.55;background:#171b14;border:2px solid #0000;border-radius:8px;flex:none;width:60px;height:60px;padding:0;transition:opacity .18s,border-color .18s;overflow:hidden}.product-thumbs button:hover{opacity:.85}.product-thumbs button.active{opacity:1;border-color:#e4e8dd}.product-thumbs img{object-fit:cover;width:100%;height:100%;display:block}.product-detail-info{padding:26px 30px 30px;overflow-y:auto}.product-detail-brand{letter-spacing:.09em;text-transform:uppercase;color:#8b9a7c;font-size:11px}.product-detail-info h3{letter-spacing:-.02em;margin:7px 0 12px;font-size:23px;font-weight:600;line-height:1.26}.product-detail-meta{flex-wrap:wrap;align-items:baseline;gap:14px;display:flex}.product-detail-price{color:#dfe6d2;font-size:21px;font-weight:600}.product-detail-sku{color:#8b9382;font-size:13px}.product-detail-link{color:#b9c9a4;border-bottom:1px solid #b9c9a45c;margin-top:14px;padding-bottom:1px;font-size:13.5px;text-decoration:none;display:inline-block}.product-detail-link:hover{color:#d5e3c1;border-color:#d5e3c1}.product-detail-summary{color:#c3c9ba;margin:18px 0 0;font-size:14px;line-height:1.62}.product-detail-feats{flex-wrap:wrap;gap:7px;margin-top:18px;display:flex}.product-detail-feats span{color:#c8cebd;background:#ffffff10;border:1px solid #ffffff14;border-radius:999px;padding:5px 11px;font-size:12px}.product-detail-specs{border-collapse:collapse;width:100%;margin-top:22px;font-size:13px}.product-detail-specs caption{text-align:left;letter-spacing:.08em;text-transform:uppercase;color:#8b9a7c;padding-bottom:9px;font-size:11.5px}.product-detail-specs th,.product-detail-specs td{text-align:left;vertical-align:top;border-top:1px solid #ffffff12;padding:9px 0;line-height:1.5}.product-detail-specs th{color:#929a89;width:40%;padding-right:14px;font-weight:500}.product-detail-specs td{color:#d3d8cb}@media (width<=860px){.product-detail-panel{grid-template-columns:1fr;max-height:92dvh;overflow-y:auto}.product-detail-media>img{max-height:42dvh}.product-detail-info{padding:20px}.product-panel-head{flex-wrap:wrap;padding:16px 18px 12px}.product-brands,.product-body{padding-left:18px;padding-right:18px}.product-grid{grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:11px}.footer-catalog{padding:7px 13px;font-size:12px}.footer-catalog kbd{display:none}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false} diff --git a/dist/assets/index.js b/dist/assets/index.js deleted file mode 100644 index 9a3d0db178cb5e128df5fa536755dc8b9019ad79..0000000000000000000000000000000000000000 --- a/dist/assets/index.js +++ /dev/null @@ -1,9 +0,0 @@ -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.for(`react.view_transition`),m=Symbol.iterator;function h(e){return typeof e!=`object`||!e?null:(e=m&&e[m]||e[`@@iterator`],typeof e==`function`?e:null)}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function y(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function b(){}b.prototype=y.prototype;function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}var S=x.prototype=new b;S.constructor=x,_(S,y.prototype),S.isPureReactComponent=!0;var ee=Array.isArray;function te(){}var C={H:null,A:null,T:null,S:null},ne=Object.prototype.hasOwnProperty;function w(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function T(e,t){return w(e.type,t,e.props)}function E(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function re(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ie=/\/+/g;function D(e,t){return typeof e==`object`&&e&&e.key!=null?re(``+e.key):t.toString(36)}function ae(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(te,te):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function oe(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,oe(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+D(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(ie,`$&/`)+`/`),oe(o,r,i,``,function(e){return e})):o!=null&&(E(o)&&(o=T(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ie,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,S||(S=!0,T());else{var t=n(l);t!==null&&ie(x,t.startTime-e)}}}var S=!1,ee=-1,te=5,C=-1;function ne(){return g?!0:!(e.unstable_now()-Ct&&ne());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&ie(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?T():S=!1}}}var T;if(typeof y==`function`)T=function(){y(w)};else if(typeof MessageChannel<`u`){var E=new MessageChannel,re=E.port2;E.port1.onmessage=w,T=function(){re.postMessage(null)}}else T=function(){_(w,0)};function ie(t,n){ee=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(ee),ee=-1):h=!0,ie(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,T()))),r},e.unstable_shouldYield=ne,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1we||(e.current=Ce[we],Ce[we]=null,we--)}function j(e,t){we++,Ce[we]=e.current,e.current=t}var De=Te(null),Oe=Te(null),M=Te(null),ke=Te(null);function Ae(e,t){switch(j(M,t),j(Oe,e),j(De,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?up(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=up(t),e=dp(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}Ee(De),j(De,e)}function je(){Ee(De),Ee(Oe),Ee(M)}function Me(e){var t=e.memoizedState;t!==null&&(sh._currentValue=t.memoizedState,j(ke,e)),t=De.current;var n=dp(t,e.type);t!==n&&(j(Oe,e),j(De,n))}function Ne(e){Oe.current===e&&(Ee(De),Ee(Oe)),ke.current===e&&(Ee(ke),sh._currentValue=Se)}var Pe,Fe;function Ie(e){if(Pe===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Pe=t&&t[1]||``,Fe=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Le=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Ie(n):``}function ze(e,t){switch(e.tag){case 26:case 27:case 5:return Ie(e.type);case 16:return Ie(`Lazy`);case 13:return e.child!==t&&t!==null?Ie(`Suspense Fallback`):Ie(`Suspense`);case 19:return Ie(`SuspenseList`);case 0:case 15:return Re(e.type,!1);case 11:return Re(e.type.render,!1);case 1:return Re(e.type,!0);case 31:return Ie(`Activity`);case 30:return Ie(`ViewTransition`);default:return``}}function Be(e){try{var t=``,n=null;do t+=ze(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var Ve=Object.prototype.hasOwnProperty,He=t.unstable_scheduleCallback,Ue=t.unstable_cancelCallback,We=t.unstable_shouldYield,Ge=t.unstable_requestPaint,Ke=t.unstable_now,qe=t.unstable_getCurrentPriorityLevel,Je=t.unstable_ImmediatePriority,Ye=t.unstable_UserBlockingPriority,Xe=t.unstable_NormalPriority,Ze=t.unstable_LowPriority,Qe=t.unstable_IdlePriority,$e=t.log,et=t.unstable_setDisableYieldValue,tt=null,nt=null;function rt(e){if(typeof $e==`function`&&et(e),nt&&typeof nt.setStrictMode==`function`)try{nt.setStrictMode(tt,e)}catch{}}var it=Math.clz32?Math.clz32:st,at=Math.log,ot=Math.LN2;function st(e){return e>>>=0,e===0?32:31-(at(e)/ot|0)|0}var ct=256,lt=262144,ut=4194304;function dt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ft(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=dt(n))):i=dt(o):i=dt(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=dt(n))):i=dt(o)):i=dt(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function pt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function mt(e,t){t&8&&(t|=t&32);var n=e.entangledLanes;if(n!==0)for(e=e.entanglements,n&=t;0n;n++)t.push(e);return t}function vt(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function yt(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0=vr),xr=` `,Sr=!1;function Cr(e,t){switch(e){case`keyup`:return gr.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function wr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var Tr=!1;function Er(e,t){switch(e){case`compositionend`:return wr(t);case`keypress`:return t.which===32?(Sr=!0,xr):null;case`textInput`:return e=t.data,e===xr&&Sr?null:e;default:return null}}function Dr(e,t){if(Tr)return e===`compositionend`||!_r&&Cr(e,t)?(e=zn(),Rn=Ln=In=null,Tr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Xr(n)}}function Qr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Qr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function $r(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Yr(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Yr(e.document)}return t}function ei(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var ti=Nn&&`documentMode`in document&&11>=document.documentMode,ni=null,ri=null,ii=null,ai=!1;function oi(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ai||ni==null||ni!==Yr(r)||(r=ni,`selectionStart`in r&&ei(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),ii&&Jr(ii,r)||(ii=r,r=Jf(ri,`onSelect`),0>=o,i-=o,na=1<<32-it(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),F&&ia(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),F&&ia(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return F&&ia(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&(_=v.alternate,_!==null&&h.delete(_.key===null?g:_.key)),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),F&&ia(a,g),u}function _(e,r,o,c){if(typeof o==`object`&&o&&o.type===ie&&o.key===null&&o.props.ref===void 0&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case E:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===ie){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),po(c,o),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===de&&ao(l)===r.type){n(e,r.sibling),c=a(r,o.props),po(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===ie?(c=Ui(o.props.children,e.mode,c,o.key),po(c,o),c.return=e,e=c):(c=Hi(o.type,o.key,o.props,null,e.mode,c),po(c,o),c.return=e,e=c)}return s(e);case re:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=Ki(o,e.mode,c),c.return=e,e=c}return s(e);case de:return o=ao(o),_(e,r,o,c)}if(xe(o))return h(e,r,o,c);if(ve(o)){if(l=ve(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return _(e,r,fo(o),c);if(o.$$typeof===O)return _(e,r,ja(e,o),c);mo(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=Wi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{uo=0;var i=_(e,t,n,r);return lo=null,i}catch(t){if(t===$a||t===to)throw t;var a=Ri(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var go=ho(!0),_o=ho(!1),vo=!1;function yo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function bo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function xo(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function So(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,W&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=Fi(e),Pi(e,null,n),t}return ji(e,r,t,n),Fi(e)}function Co(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,xt(e,n)}}function wo(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var To=!1;function Eo(){if(To){var e=Wa;if(e!==null)throw e}}function Do(e,t,n,r){To=!1;var i=e.updateQueue;vo=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(q&f)===f:(r&f)===f){f!==0&&f===Ua&&(To=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,h=s;f=t;var g=n;switch(h.tag){case 1:if(m=h.payload,typeof m==`function`){d=m.call(g,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=h.payload,f=typeof m==`function`?m.call(g,d,f):m,f==null)break a;d=w({},d,f);break a;case 2:vo=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),sd|=o,e.lanes=o,e.memoizedState=d}}function Oo(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function ko(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=k.T,s={};s.types=o===null?null:o.types,k.T=s,pc(e,!1,t,n);try{var c=i(),l=k.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?fc(e,t,qa(c,r),jd(e)):fc(e,t,r,jd(e))}catch(n){fc(e,t,{then:function(){},status:`rejected`,reason:n},jd())}finally{A.p=a,o!==null&&s.types!==null&&(o.types=s.types),k.T=o}}function nc(){}function rc(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=ic(e).queue;tc(e,a,t,Se,n===null?nc:function(){return ac(e),n(r)})}function ic(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:Se,baseState:Se,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ms,lastRenderedState:Se},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ms,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ac(e){var t=ic(e);t.next===null&&(t=e.alternate.memoizedState),fc(e,t.next.queue,{},jd())}function oc(){return Aa(sh)}function sc(){return B().memoizedState}function cc(){return B().memoizedState}function lc(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=jd();e=xo(n);var r=So(t,e,n);r!==null&&(Pd(r,t,n),Co(r,t,n)),t={cache:Ia()},e.payload=t;return}t=t.return}}function uc(e,t,n){var r=jd();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},mc(e)?hc(t,n):(n=Mi(e,t,n,r),n!==null&&(Pd(n,e,r),gc(n,t,r)))}function dc(e,t,n){fc(e,t,n,jd())}function fc(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(mc(e))hc(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,qr(s,o))return ji(e,t,i,0),G===null&&Ai(),!1}catch{}if(n=Mi(e,t,i,r),n!==null)return Pd(n,e,r),gc(n,t,r),!0}return!1}function pc(e,t,n,r){if(r={lane:2,revertLane:Pf(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},mc(e)){if(t)throw Error(i(479))}else t=Mi(e,n,r,2),t!==null&&Pd(t,e,2)}function mc(e){var t=e.alternate;return e===L||t!==null&&t===L}function hc(e,t){Yo=Jo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function gc(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,xt(e,n)}}var _c={readContext:Aa,use:fs,useCallback:z,useContext:z,useEffect:z,useImperativeHandle:z,useLayoutEffect:z,useInsertionEffect:z,useMemo:z,useReducer:z,useRef:z,useState:z,useDebugValue:z,useDeferredValue:z,useTransition:z,useSyncExternalStore:z,useId:z,useHostTransitionStatus:z,useFormState:z,useActionState:z,useOptimistic:z,useMemoCache:z,useCacheRefresh:z,useEffectEvent:z},vc={readContext:Aa,use:fs,useCallback:function(e,t){return ls().memoizedState=[e,t===void 0?null:t],e},useContext:Aa,useEffect:Hs,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),Bs(4194308,4,Js.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Bs(4194308,4,e,t)},useInsertionEffect:function(e,t){Bs(4,2,e,t)},useMemo:function(e,t){var n=ls();t=t===void 0?null:t;var r=e();if(Xo){rt(!0);try{e()}finally{rt(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=ls();if(n!==void 0){var i=n(t);if(Xo){rt(!0);try{n(t)}finally{rt(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=uc.bind(null,L,e),[r.memoizedState,e]},useRef:function(e){var t=ls();return e={current:e},t.memoizedState=e},useState:function(e){e=ws(e);var t=e.queue,n=dc.bind(null,L,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Xs,useDeferredValue:function(e,t){return $s(ls(),e,t)},useTransition:function(){var e=ws(!1);return e=tc.bind(null,L,e.queue,!0,!1),ls().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=L,a=ls();if(F){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),G===null)throw Error(i(349));q&127||ys(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,Hs(xs.bind(null,r,o,e),[e]),r.flags|=2048,Rs(9,{destroy:void 0},bs.bind(null,r,o,n,t),null),n},useId:function(){var e=ls(),t=G.identifierPrefix;if(F){var n=ra,r=na;n=(r&~(1<<32-it(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=Zo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[Ot]=t,o[kt]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(np(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&gl(t)}}return V(t),t.subtreeFlags&=-33554433,_l(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&gl(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=M.current,ga(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=la,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[Ot]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||ep(e.nodeValue,n)),e||pa(t,!0)}else e=lp(e).createTextNode(r),e[Ot]=t,t.stateNode=e}return V(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=ga(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[Ot]=t}else _a(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),e=!1}else n=va(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(Vo(t),t):(Vo(t),null);if(t.flags&128)throw Error(i(558))}return V(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=ga(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[Ot]=t}else _a(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;V(t),a=!1}else a=va(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(Vo(t),t):(Vo(t),null)}return Vo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),yl(t,t.updateQueue),V(t),null);case 4:return je(),e===null&&Wf(t.stateNode.containerInfo),t.flags|=67108864,V(t),null;case 10:return wa(t.type),V(t),null;case 19:if(Wo(t),r=t.memoizedState,r===null)return V(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)bl(r,!1);else{if(Y!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=Go(e),o!==null){for(t.flags|=128,bl(r,!1),e=o.updateQueue,t.updateQueue=e,yl(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)Vi(n,e),n=n.sibling;return Uo(t,Ho.current&1|2),F&&ia(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ke()>_d&&(t.flags|=128,a=!0,bl(r,!1),t.lanes=4194304)}}else{if(!a){if(e=Go(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,yl(t,e),bl(r,!0),r.tail===null&&r.tailMode!==`collapsed`&&r.tailMode!==`visible`&&!o.alternate&&!F)return V(t),null}else 2*Ke()-r.renderingStartTime>_d&&n!==536870912&&(t.flags|=128,a=!0,bl(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}if(r.tail!==null){e=r.tail;a:{for(n=e;n!==null;){if(n.alternate!==null){n=!1;break a}n=n.sibling}n=!0}return r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ke(),e.sibling=null,o=Ho.current,o=a?o&1|2:o&1,r.tailMode===`visible`||r.tailMode===`collapsed`||!n||F?Uo(t,o):(n=o,j(Fo,t),j(Ho,n),Io===null&&(Io=t)),F&&ia(t,r.treeForkCount),e}return V(t),null;case 22:case 23:return Vo(t),Po(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(V(t),t.subtreeFlags&6&&(t.flags|=8192)):V(t),n=t.updateQueue,n!==null&&yl(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&Ee(Ya),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),wa(I),V(t),null;case 25:return null;case 30:return t.flags|=33554432,V(t),null}throw Error(i(156,t.tag))}function Sl(e,t){switch(sa(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return wa(I),je(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Ne(t),null;case 31:if(t.memoizedState!==null){if(Vo(t),t.alternate===null)throw Error(i(340));_a()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Vo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));_a()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Wo(t),e=t.flags,e&65536?(t.flags=e&-65537|128,e=t.memoizedState,e!==null&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return je(),null;case 10:return wa(t.type),null;case 22:case 23:return Vo(t),Po(),e!==null&&Ee(Ya),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return wa(I),null;case 25:return null;default:return null}}function Cl(e,t){switch(sa(t),t.tag){case 3:wa(I),je();break;case 26:case 27:case 5:Ne(t);break;case 4:je();break;case 31:t.memoizedState!==null&&Vo(t);break;case 13:Vo(t);break;case 19:Wo(t);break;case 10:wa(t.type);break;case 22:case 23:Vo(t),Po(),e!==null&&Ee(Ya);break;case 24:wa(I)}}function wl(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Tl(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function El(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{ko(t,n)}catch(t){Z(e,e.return,t)}}}function Dl(e,t,n){n.props=Tc(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Ol(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:var i=e.stateNode,a=Ci(e.memoizedProps,i);(i.ref===null||i.ref.name!==a)&&(i.ref=Pp(a)),r=i.ref;break;case 7:if(e.stateNode===null){var o=new Fp(e);h(e.child,!1,Qp,o,void 0,void 0),e.stateNode=o}r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function kl(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Al(e,t){if((e.tag===5||e.tag===27||e.tag===6)&&e.alternate===null&&t!==null)for(var n=0;n title`))),np(r,t,n),r[Ot]=e,Ht(r),t=r;break a;case`link`:if(o=Gm(`link`,`href`,a).get(t+(n.href||``))){for(s=0;sg&&(o=g,g=h,h=o);var _=Zr(s,h),v=Zr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,k.T=null,n=wd,wd=null;var o=bd,s=Sd;if(X=0,xd=bd=null,Sd=0,W&6)throw Error(i(331));var c=W;if(W|=4,Zu(o.current),Uu(o,o.current,s,n),W=c,Df(0,!1),nt&&typeof nt.onPostCommitFiberRoot==`function`)try{nt.onPostCommitFiberRoot(tt,o)}catch{}return!0}finally{A.p=a,k.T=r,uf(e,t)}}function pf(e,t,n){t=Ji(n,t),t=jc(e.stateNode,t,2),e=So(e,t,2),e!==null&&(vt(e,2),Ef(e))}function Z(e,t,n){if(e.tag===3)pf(e,e,n);else for(;t!==null;){if(t.tag===3){pf(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(yd===null||!yd.has(r))){e=Ji(n,e),n=Mc(2),r=So(t,n,2),r!==null&&(Nc(n,r,t,e),vt(r,2),Ef(r));break}}t=t.return}}function mf(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new td;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(ad=!0,i.add(n),e=hf.bind(null,e,t,n),t.then(e,e))}function hf(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Y===4||Y===3&&(q&62914560)===q&&300>Ke()-hd?W&2?ld|=n:Vd(e,0):ld|=n,dd===q&&(dd=0)),Ef(e)}function gf(e,t){t===0&&(t=gt()),e=Ni(e,t),e!==null&&(vt(e,t),Ef(e))}function _f(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),gf(e,n)}function vf(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),gf(e,n)}function yf(e,t){return He(e,t)}var bf=null,xf=null,Sf=!1,Cf=!1,wf=!1,Tf=0;function Ef(e){e!==xf&&e.next===null&&(xf===null?bf=xf=e:xf=xf.next=e),Cf=!0,Sf||(Sf=!0,Nf())}function Df(e,t){if(!wf&&Cf){wf=!0;do for(var n=!1,r=bf;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-it(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,Mf(r,a))}else a=q,a=ft(r,r===G?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||pt(r,a)||(n=!0,Mf(r,a))}r=r.next}while(n);wf=!1}}function Of(){kf()}function kf(){Cf=Sf=!1;var e=0;Tf!==0&&hp()&&(e=Tf);for(var t=Ke(),n=null,r=bf;r!==null;){var i=r.next,a=Af(r,t);a===0?(r.next=null,n===null?bf=i:n.next=i,i===null&&(xf=n)):(n=r,(e!==0||a&3)&&(Cf=!0)),r=i}X!==0&&X!==5||Df(e,!1),Tf!==0&&(Tf=0)}function Af(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&ap(d)&&(c=c.responseEnd,o+=u*(c$m){s.length=o;break}f=new Promise(jp.bind(f)),s.push(f)}}}if(0`u`?null:document;function Tm(e,t,n){var r=wm;if(r&&typeof t==`string`&&t){var i=ln(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),ym.has(i)||(ym.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),np(t,`link`,e),Ht(t),r.head.appendChild(t)))}}function Em(e){xm.D(e),Tm(`dns-prefetch`,e,null)}function Dm(e,t){xm.C(e,t),Tm(`preconnect`,e,t)}function Om(e,t,n){xm.L(e,t,n);var r=wm;if(r&&e&&t){var i=`link[rel="preload"][as="`+ln(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+ln(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+ln(n.imageSizes)+`"]`)):i+=`[href="`+ln(e)+`"]`;var a=i;switch(t){case`style`:a=Pm(e);break;case`script`:a=Rm(e)}if(!(vm.has(a)||(e=w({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),vm.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Fm(a))||t===`script`&&r.querySelector(zm(a))))){var o=r.createElement(`link`);np(o,`link`,e),t===`style`&&(o[It]=!0,o.onload=o.onerror=function(){Ut(o)}),Ht(o),r.head.appendChild(o)}}}function km(e,t){xm.m(e,t);var n=wm;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+ln(r)+`"][href="`+ln(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Rm(e)}if(!vm.has(a)&&(e=w({rel:`modulepreload`,href:e},t),vm.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(zm(a)))return}r=n.createElement(`link`),np(r,`link`,e),Ht(r),n.head.appendChild(r)}}}function Am(e,t,n){xm.S(e,t,n);var r=wm;if(r&&e){var i=Vt(r).hoistableStyles,a=Pm(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Fm(a)))s.loading=5;else{e=w({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=vm.get(a))&&Hm(e,n);var c=o=r.createElement(`link`);Ht(c),np(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Vm(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function jm(e,t){xm.X(e,t);var n=wm;if(n&&e){var r=Vt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=w({src:e,async:!0},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),Ht(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mm(e,t){xm.M(e,t);var n=wm;if(n&&e){var r=Vt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=w({src:e,async:!0,type:`module`},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),Ht(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Nm(e,t,n,r){var a=(a=M.current)?bm(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(n=Pm(n.href),t=Vt(a).hoistableStyles,r=t.get(n),r||(r={type:`style`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Pm(n.href);var o=Vt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Fm(e)))?o._p||(s.instance=o,s.state.loading=5):(o=vm.get(e),o||(o={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},vm.set(e,o)),Lm(a,e,o,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(n=Rm(n),t=Vt(a).hoistableScripts,r=t.get(n),r||(r={type:`script`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Pm(e){return`href="`+ln(e)+`"`}function Fm(e){return`link[rel="stylesheet"][`+e+`]`}function Im(e){return w({},e,{"data-precedence":e.precedence,precedence:null})}function Lm(e,t,n,r){if(t=e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)){if(!0!==t[It]){r.loading=1;return}}else t=e.createElement(`link`),t[It]=!0,t.onload=t.onerror=Ut.bind(null,t),np(t,`link`,n),Ht(t),e.head.appendChild(t);r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2})}function Rm(e){return`[src="`+ln(e)+`"]`}function zm(e){return`script[async]`+e}function Bm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+ln(n.href)+`"]`);if(r)return t.instance=r,Ht(r),r;var a=w({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),Ht(r),np(r,`style`,a),Vm(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Pm(n.href);var o=e.querySelector(Fm(a));if(o)return t.state.loading|=4,t.instance=o,Ht(o),o;r=Im(n),(a=vm.get(a))&&Hm(r,a),o=(e.ownerDocument||e).createElement(`link`),Ht(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),np(o,`link`,r),t.state.loading|=4,Vm(o,n.precedence,e),t.instance=o;case`script`:return o=Rm(n.src),(a=e.querySelector(zm(o)))?(t.instance=a,Ht(a),a):(r=n,(a=vm.get(o))&&(r=w({},n),Um(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),Ht(a),np(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Vm(r,n.precedence,e));return t.instance}function Vm(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function qm(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Jm(e,t){return e===`img`&&t.src!=null&&t.src!==``&&t.onLoad==null&&t.loading!==`lazy`}function Ym(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Xm(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio==`number`?devicePixelRatio:1)*.25}function Zm(e,t){typeof t.decode==`function`&&(e.imgCount++,t.complete||(e.imgBytes+=Xm(t),e.suspenseyImages.push(t)),e=rh.bind(e),t.decode().then(e,e))}function Qm(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Pm(r.href),a=t.querySelector(Fm(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=nh.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,Ht(a);return}a=t.ownerDocument||t,r=Im(r),(i=vm.get(i))&&Hm(r,i),a=a.createElement(`link`),Ht(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=nh.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var $m=0;function eh(e,t){return e.stylesheets&&e.count===0&&ah(e,e.stylesheets),0$m?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function th(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)ah(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function nh(){this.count--,th(this)}function rh(){this.imgCount--,th(this)}var ih=null;function ah(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ih=new Map,t.forEach(oh,e),ih=null,nh.call(e))}function oh(e,t){if(!(t.state.loading&4)){var n=ih.get(e);if(n)var r=n.get(null);else{n=new Map,ih.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y=JSON.parse(`[{"id":"0004d4b651","url":"0004d4b651.jpg","ar":0.8594,"blur":"LaKUp4WBRkn$?vxuxuoM~pxuR+j["},{"id":"001160216e","url":"001160216e.jpg","ar":1.4566,"blur":"LlJ8IjMwtRoe~qRikDs:oJt7WXoJ"},{"id":"001b9c7a22","url":"001b9c7a22.jpg","ar":1.3989,"blur":"LIJHp;~q4n?bNcM_RkofM_9Z-:WB"},{"id":"00243920f3","url":"00243920f3.jpg","ar":1.4993,"blur":"LDI#li0MRPa{?v9ai^-o~qI9M_xu"},{"id":"002b1f6f2c134b5de8dc52737e774ba5b93e1055","url":"002b1f6f2c134b5de8dc52737e774ba5b93e1055.jpg","ar":1.3333,"blur":"LbC@KyRjRiWBlCWCacj[RjozRiof"},{"id":"00413fa633054264","url":"00413fa633054264.jpg","ar":0.7568,"blur":"L8Gm3[56MKI:.8DijZof4T.S.8.8"},{"id":"0059044946","url":"0059044946.jpg","ar":1.4993,"blur":"LWKnPI-;00ad-:WBazt74nWAxuWq"},{"id":"005ec5c9032f4531488ec6116ed22d937abb0270","url":"005ec5c9032f4531488ec6116ed22d937abb0270.jpg","ar":1.0,"blur":"LbNTar-mRkV[_MSjjEaJx^t3jYkC"},{"id":"00a272ab96","url":"00a272ab96.jpg","ar":1.7778,"blur":"LIJQir%hit?E~p%MRjRkMvM{tT%L"},{"id":"00c3f2ef50a572aa","url":"00c3f2ef50a572aa.jpg","ar":1.0,"blur":"LqKK~DkDbIt7.TRlxaoet8V@jXjY"},{"id":"014056ab879ee13d2f97f329aa0ce7c0b8f98381","url":"014056ab879ee13d2f97f329aa0ce7c0b8f98381.jpg","ar":1.158,"blur":"LaPGpmxuf6kC~qxutRjZIUMxRjof"},{"id":"0144ebe50c","url":"0144ebe50c.jpg","ar":1.7778,"blur":"L#H-V?0z$*nixtRjofj[V@V[oft7"},{"id":"0180811bf586a7e966145eb9a9a68f1d4bec9a9b","url":"0180811bf586a7e966145eb9a9a68f1d4bec9a9b.jpg","ar":1.4376,"blur":"LbL|lgozIooy~VE1IUkCIBafV@V@"},{"id":"01af8f7ae1de1fac20e05d4391d3a8912be1ca03","url":"01af8f7ae1de1fac20e05d4391d3a8912be1ca03.jpg","ar":1.7058,"blur":"LBGuag-:Iq?b_3t7n~j]IU00%M%1"},{"id":"01b0637bbe","url":"01b0637bbe.jpg","ar":1.4085,"blur":"LPL}T.?Hx^n$_Nxaj?oe-p%LWAbH"},{"id":"01da965e05","url":"01da965e05.jpg","ar":1.6516,"blur":"LMKn6kxvtjtQ~VIpx[kCtR?Hnkxt"},{"id":"01f554a00c698daeebb10d764d9ad0fa30217137","url":"01f554a00c698daeebb10d764d9ad0fa30217137.jpg","ar":1.7786,"blur":"LDNKCpxUbc_4?a.8M|Mx~qn$%Lx]"},{"id":"01fa1b4c91a4c4becc390c7d2d202aeed55fb3ac","url":"01fa1b4c91a4c4becc390c7d2d202aeed55fb3ac.jpg","ar":1.0,"blur":"LILW#4r;McMx_NIWD%M{x^SiIpt8"},{"id":"02076f4467","url":"02076f4467.jpg","ar":0.71,"blur":"LmK-k3NG-pkB~qbHxuoft8ogofof"},{"id":"0234975b64","url":"0234975b64.jpg","ar":0.71,"blur":"L]F$-RoftRof?woLt7j[t9fkWAay"},{"id":"0281cfa48ea78f36da950a523152ca4cc2c40a1e","url":"0281cfa48ea78f36da950a523152ca4cc2c40a1e.jpg","ar":1.7786,"blur":"LHKA[?8^~qxs~V-:%1%2-;M{IVog"},{"id":"02e07648862aa4e73fa2c902c693047bc84f44d3","url":"02e07648862aa4e73fa2c902c693047bc84f44d3.jpg","ar":1.7786,"blur":"LAL4vmR24UxZ?vo~SQR+%fkWM_W="},{"id":"030081ed6ef344462edad525ddb9705c539d328d","url":"030081ed6ef344462edad525ddb9705c539d328d.jpg","ar":1.0,"blur":"LXI=3{_4X9s,Oa%0RjE2%gxtoJR-"},{"id":"030d59eaf3","url":"030d59eaf3.jpg","ar":1.7778,"blur":"LJG+2NNGD*of%M-:D%xv~qWBs.WE"},{"id":"0411e60c40c7ed40a2efc0391af7982947cc4595","url":"0411e60c40c7ed40a2efc0391af7982947cc4595.jpg","ar":1.5009,"blur":"LRI#iR?ID%%M~q-;V@t5%ix[M{o#"},{"id":"04312d898f5527e8f1166449a4235fca08094a21","url":"04312d898f5527e8f1166449a4235fca08094a21.jpg","ar":1.0,"blur":"L,I#cLjFjZof~qoLjtj[%NbIWXay"},{"id":"04361069885f01c20b6614a127dc142646143044","url":"04361069885f01c20b6614a127dc142646143044.jpg","ar":1.7786,"blur":"LFJ[Cn57D%%1pJI9xuoz~px]RkR*"},{"id":"043f4d6c61e80b519bf5a48c2804ab8b5070922c","url":"043f4d6c61e80b519bf5a48c2804ab8b5070922c.jpg","ar":1.0,"blur":"LpOgTm%M?baeR*NGtRof_NWCE1t7"},{"id":"0450bc3d37a5380795d7f949f6e620ef8441e11a","url":"0450bc3d37a5380795d7f949f6e620ef8441e11a.jpg","ar":1.641,"blur":"LSJu1G_3j[xu8^x]xaof_4%MV@of"},{"id":"046419145602bbae04804b9dce8231bddaaf8074","url":"046419145602bbae04804b9dce8231bddaaf8074.jpg","ar":1.658,"blur":"LYIF6^~9a%bcx_-:j]afxC%hWUIo"},{"id":"04cb52c8c668f7ac6bbee7accaa311134aaafc27","url":"04cb52c8c668f7ac6bbee7accaa311134aaafc27.jpg","ar":0.6667,"blur":"LJMaO$M{ozoL.ToJWBt7~WD%RPj["},{"id":"04d41cf78e","url":"04d41cf78e.jpg","ar":1.3333,"blur":"LFLzpraJM|01?cD*M{%N_3-:Rj-:"},{"id":"05900ee7819a9680034af84b299ea88563a33a6e","url":"05900ee7819a9680034af84b299ea88563a33a6e.jpg","ar":0.962,"blur":"LYNw4gxZt6R*_4IUR+xaD%xutRof"},{"id":"05a0d26810","url":"05a0d26810.jpg","ar":0.8762,"blur":"LIK-2ma}%M-;_NoLxtV@xabHM{t6"},{"id":"05a7ff308b8914f238b0cb69941d50b59cde8141","url":"05a7ff308b8914f238b0cb69941d50b59cde8141.jpg","ar":1.0,"blur":"LDD]bk9s_N%pRZIBo#IDS+Di%L9G"},{"id":"05c9aaad4ef0c11e5ec7be9f11a63bb685d844bf","url":"05c9aaad4ef0c11e5ec7be9f11a63bb685d844bf.jpg","ar":1.0,"blur":"LeO|IOMa?Fo$^*xtIWWAEVI^M{n#"},{"id":"05e1b0ea98","url":"05e1b0ea98.jpg","ar":1.665,"blur":"LaJRXEs-M{xt~qxut8WBR.xaRkWB"},{"id":"05e2441942fefc07f27f3cd8341ff416018c0dc8","url":"05e2441942fefc07f27f3cd8341ff416018c0dc8.jpg","ar":1.6606,"blur":"LoHfL|%LM{of.TRlkCofD%V@ogWB"},{"id":"063779d7f4fb3508b906e1b1ab809d81ddb23ff6","url":"063779d7f4fb3508b906e1b1ab809d81ddb23ff6.jpg","ar":1.7778,"blur":"LMJ*eo^+NGxus*i^t6of_NM|s.WA"},{"id":"0665a6f40b","url":"0665a6f40b.jpg","ar":1.3333,"blur":"LWJRKt?w9aNGMxIVjZkC%1RjRPRP"},{"id":"06ab82854261e4ad4791ba6e66af868c5aeaa9ba","url":"06ab82854261e4ad4791ba6e66af868c5aeaa9ba.jpg","ar":1.499,"blur":"L997qfMQJ5-o?k8yXl-.%yDkIp%L"},{"id":"06ae040031","url":"06ae040031.jpg","ar":1.7778,"blur":"L7DSg[n20LXTA2%MWBIo4:kr%MRO"},{"id":"06c4afd97e80347ef53527289bb5bbc620a64930","url":"06c4afd97e80347ef53527289bb5bbc620a64930.jpg","ar":1.7778,"blur":"L4DJYa?w4mR*?cWAxuRjohWBfRRi"},{"id":"071b4e4c6d","url":"071b4e4c6d.jpg","ar":0.8018,"blur":"L98z+8x]9bNM?dofM|bIo%RiIToH"},{"id":"07b49375ff","url":"07b49375ff.jpg","ar":1.4124,"blur":"LNGvn#M_ImxZT#oyRORjESxv%3X9"},{"id":"07b7636d4b","url":"07b7636d4b.jpg","ar":1.4993,"blur":"LOJkJ,4TS4R5RPxukDsn~WaeM{WC"},{"id":"07b82ac74aaae9738baad9a0d33e8ba2a76ecec1","url":"07b82ac74aaae9738baad9a0d33e8ba2a76ecec1.jpg","ar":1.0,"blur":"LMQRzX_NF}?bMHMIrpof.8NHnhWA"},{"id":"07b8871c4b","url":"07b8871c4b.jpg","ar":1.5,"blur":"LFGuXaEM9aDh?wRks:xus,x]WXS5"},{"id":"08038d4053","url":"08038d4053.jpg","ar":1.1929,"blur":"LCF$IkIUIAM{~q-;Di?H0KE1x]IV"},{"id":"0810fad184febfa0e9add5e0a2ee43638eb659bc","url":"0810fad184febfa0e9add5e0a2ee43638eb659bc.jpg","ar":1.9827,"blur":"LkJ*elr@8_Ri~qIVITogxvM{bbt7"},{"id":"087e5129518f6cbd547f50c3e5ace0d91f924787","url":"087e5129518f6cbd547f50c3e5ace0d91f924787.jpg","ar":1.2528,"blur":"LGH.A[ITJ:_3~pxZt8%MNHM{t7V?"},{"id":"0887c4fa251a3482d82304ab303099c87f3eb3fa","url":"0887c4fa251a3482d82304ab303099c87f3eb3fa.jpg","ar":1.3722,"blur":"LGK1q84m.89F~qxuIU%MtT-;D$%L"},{"id":"08a40caf9f","url":"08a40caf9f.jpg","ar":1.6,"blur":"LNHxW;_4Mw?c~qxvxto#e-V@ofn$"},{"id":"08e7c6c0ce5ac8fbdb7461a4c75712cd0d3a7e8c","url":"08e7c6c0ce5ac8fbdb7461a4c75712cd0d3a7e8c.jpg","ar":0.8,"blur":"LDE_~$8^x]%N=^.8WARi8_%MjuWB"},{"id":"094191a64dee02e5644e472e51111bbf5f4663db","url":"094191a64dee02e5644e472e51111bbf5f4663db.jpg","ar":1.5717,"blur":"LaIq[h-:4n%M~p%LWAofj@WBaxRj"},{"id":"096c71e7b9","url":"096c71e7b9.jpg","ar":1.4993,"blur":"LMJ[Cp_3r;Ri~qoIxtxa?bM{MxjY"},{"id":"098287d9263d4540aad6b1ca0533942eecedd4b2","url":"098287d9263d4540aad6b1ca0533942eecedd4b2.jpg","ar":1.9526,"blur":"L6DcHx?vxw-4Im0LM{aKR5-oIVoy"},{"id":"09a16f36f81be708946b5d140f6c10b975c5dd62","url":"09a16f36f81be708946b5d140f6c10b975c5dd62.jpg","ar":1.498,"blur":"LHOpV.4n9FS%4nF{H?tl0L0eR5x["},{"id":"09b740d0252184e0df291a568c11f0f867b0b899","url":"09b740d0252184e0df291a568c11f0f867b0b899.jpg","ar":1.5,"blur":"LMFFTm-#9bIv~Ws+E2jvxvNHRkj="},{"id":"09e4fb21be30487ff95d14f23dd05846403d383c","url":"09e4fb21be30487ff95d14f23dd05846403d383c.jpg","ar":1.5,"blur":"LHLqLX4n?F%L?Gs,?Zt6~U-:IUD*"},{"id":"0a217058a3","url":"0a217058a3.jpg","ar":1.6678,"blur":"LOJHs_x]-p%MWVRjayof~qt7IUM{"},{"id":"0a2f5a88be9d1b3e","url":"0a2f5a88be9d1b3e.jpg","ar":1.3665,"blur":"LpL4f~Mwxut7~qM{Rka#IUWBj[WB"},{"id":"0a8c153c2b","url":"0a8c153c2b.jpg","ar":1.4981,"blur":"LjJkZLRPWBof~pjYRkt7t7axozfk"},{"id":"0a95ff4496076debdbd0c4e67486f710ff7de958","url":"0a95ff4496076debdbd0c4e67486f710ff7de958.jpg","ar":1.7786,"blur":"LKG[TQ00j^RQtn4.?a?F={NGNIM}"},{"id":"0aa1d8bdf6fe12d5","url":"0aa1d8bdf6fe12d5.jpg","ar":0.45,"blur":"LJGIWCsQIB-U~qbFRkaeE3xu-ooz"},{"id":"0ae115709800bae0a8779ffa650f698da14b5a27","url":"0ae115709800bae0a8779ffa650f698da14b5a27.jpg","ar":1.0,"blur":"LhPZ4Dx[E0slVrbwniay4TaKogjt"},{"id":"0b2ca2e0baebaf95","url":"0b2ca2e0baebaf95.jpg","ar":1.4092,"blur":"LBHU:}0K0LspW=9Ft7NG~qxt?Hjr"},{"id":"0b6bed6a9ef2b6ec2aef47cc31e87c884b986974","url":"0b6bed6a9ef2b6ec2aef47cc31e87c884b986974.jpg","ar":1.476,"blur":"LEJthz-;D%tl^+IV~p.8%29ZIVS4"},{"id":"0b8aa7492a2ae1880b2d4bc13fb8364dcac205ab","url":"0b8aa7492a2ae1880b2d4bc13fb8364dcac205ab.jpg","ar":1.7778,"blur":"LOGvIfE2vfF14To#S%#+vy-pEka$"},{"id":"0be704f472a6a87c935981b3ec47602c9bde92be","url":"0be704f472a6a87c935981b3ec47602c9bde92be.jpg","ar":1.25,"blur":"LNJ[FnOqIUjF_Nae%gRP-WxIRjoy"},{"id":"0bf7945a8cb3d2d1","url":"0bf7945a8cb3d2d1.jpg","ar":0.675,"blur":"LiGl0D%1X8t6?w%1xtayk@oes.of"},{"id":"0c174bb1b1","url":"0c174bb1b1.jpg","ar":1.5119,"blur":"L7F#p#9b9a_M~UxZ$|IC^haes+IB"},{"id":"0c234c2bed4150c52709bce6eeb0449259cb9afe","url":"0c234c2bed4150c52709bce6eeb0449259cb9afe.jpg","ar":1.3333,"blur":"LPMQ379GD%t6~VM|WCay4TxtX9s:"},{"id":"0c556d4383d64a3395fbc7394d294983aee9f634","url":"0c556d4383d64a3395fbc7394d294983aee9f634.jpg","ar":1.3344,"blur":"LEKBac?bs+kWtp-k%1o#0K~V%Lt7"},{"id":"0ca506d168","url":"0ca506d168.jpg","ar":1.2863,"blur":"LUF?FS-;b_WE%%t7o#ofE4M{ngjY"},{"id":"0cbc9d2ac8f635c3e96a84eea28580792dfce884","url":"0cbc9d2ac8f635c3e96a84eea28580792dfce884.jpg","ar":1.0,"blur":"LFIhQ#8^Mw%M%hM{NGxuE2x^xuE1"},{"id":"0d73e4dbc7","url":"0d73e4dbc7.jpg","ar":1.4144,"blur":"LFS6MZ%M?d%M-:oft7Ri?dofISRP"},{"id":"0de0a729643171c5c9fd942a7ede592f61a35bad","url":"0de0a729643171c5c9fd942a7ede592f61a35bad.jpg","ar":1.6512,"blur":"L$N11Bxu-;%M~qRiM{WB%gt7WBj]"},{"id":"0e0e1df65d2ce0a5be4baea7db4fd712023ff26b","url":"0e0e1df65d2ce0a5be4baea7db4fd712023ff26b.jpg","ar":1.5009,"blur":"LBCF|u^%-:tR9FX9WBt70LMyxvM{"},{"id":"0e62272ad930c9ac581a11dff9023c6d6d2356ea","url":"0e62272ad930c9ac581a11dff9023c6d6d2356ea.jpg","ar":0.667,"blur":"LBFYMt0K4TWB?vM{MxD*jFazNG-:"},{"id":"0e65e1ac67","url":"0e65e1ac67.jpg","ar":1.4656,"blur":"LGL4yx?v~q?G_4M_xvV@8_RjR*Io"},{"id":"0e6f868344d6f23a1fd6c9dbe46bf3d3e757870b","url":"0e6f868344d6f23a1fd6c9dbe46bf3d3e757870b.jpg","ar":1.3325,"blur":"LZFYfP~pR*IUocs:ayj[xbs:WVof"},{"id":"0e8f19b074","url":"0e8f19b074.jpg","ar":1.5306,"blur":"LUJ*hq4oM{of~pD%R*ofM|t7M{Rj"},{"id":"0ea43235685c94b98f107395f25a60cb9b011e89","url":"0ea43235685c94b98f107395f25a60cb9b011e89.jpg","ar":1.5802,"blur":"LjHL*pVXWBxu?ws8ayRktSt7ayWY"},{"id":"0ea43573788da571b4649f4621e1488137a4b7c9","url":"0ea43573788da571b4649f4621e1488137a4b7c9.jpg","ar":1.4052,"blur":"LEHxvaxDRMI:*IIpocxvIAs:xa%M"},{"id":"0ee01bd728122a1697ace2d93b2687595ccb0d41","url":"0ee01bd728122a1697ace2d93b2687595ccb0d41.jpg","ar":1.641,"blur":"LIK9}lyrD4^+%ga0WCX9KjaKS#oz"},{"id":"0f13bc9a0198fd5905cdcfb8237fbc14c8f8e256","url":"0f13bc9a0198fd5905cdcfb8237fbc14c8f8e256.jpg","ar":1.457,"blur":"LAA,qEI[8{.8~VS5M}xtMeawb;nP"},{"id":"0f1ab6e120f70c02b3ba2453b3eca3854754287f","url":"0f1ab6e120f70c02b3ba2453b3eca3854754287f.jpg","ar":1.7837,"blur":"LQFs0x?wx]IU%#tnbuV[pJtm%ft7"},{"id":"0f62efb08b","url":"0f62efb08b.jpg","ar":1.3333,"blur":"LaHBxZn34.R+%%RkROR*%Mxut7Rj"},{"id":"0f6855c9a3ec8fde3ff7ff782c7580510c9b07f4","url":"0f6855c9a3ec8fde3ff7ff782c7580510c9b07f4.jpg","ar":1.5009,"blur":"LVJkWJ%h~q%MIUaeoft8I9ofRjWB"},{"id":"0f7e16fa3de7a19c3cd70af090a899d24496ae4e","url":"0f7e16fa3de7a19c3cd70af090a899d24496ae4e.jpg","ar":1.0,"blur":"LNLgLh?aE30M0f%2jrn$?GM|%L?G"},{"id":"10451e1a838a83413ce65f273490871b2c0809c9","url":"10451e1a838a83413ce65f273490871b2c0809c9.jpg","ar":1.0,"blur":"LfI5Y-$wInt6~WWFS4WCK-NIxaRl"},{"id":"105271022eda4174d90b9aea40037ab29e802326","url":"105271022eda4174d90b9aea40037ab29e802326.jpg","ar":1.25,"blur":"LDKU4e_NRP-=?G_3.89anNt6RPxt"},{"id":"10776742fdc1fe7065295d2d3f1fe537cef1e134","url":"10776742fdc1fe7065295d2d3f1fe537cef1e134.jpg","ar":1.7773,"blur":"LFDStDI8%fM|?wIo%ft7bE%MoLs."},{"id":"10b96667fa","url":"10b96667fa.jpg","ar":1.4981,"blur":"LUJ*hu.9%Mof~q%MWEofIAIUaeR*"},{"id":"10c86fec1911d17aac66acca843f9a6ddc86c44e","url":"10c86fec1911d17aac66acca843f9a6ddc86c44e.jpg","ar":1.5054,"blur":"LRHCGtIn9E%NZ+s=bFRj4,WBxujc"},{"id":"111338df47","url":"111338df47.jpg","ar":1.9212,"blur":"LBLzy|^+_NWqu5Rj%LRjiva{Nx%2"},{"id":"113ab153ba5a3f3008cc8386a318181ad4e6fd4f","url":"113ab153ba5a3f3008cc8386a318181ad4e6fd4f.jpg","ar":1.5006,"blur":"L9F~N-aenh~qI8-o9F9ERlR+M|xu"},{"id":"115f746b04313791","url":"115f746b04313791.jpg","ar":1.0,"blur":"LJNJt9-o~p%MRjxaofay~pxtD%oJ"},{"id":"1197818c57cd32041c5dfd5385d24befba667481","url":"1197818c57cd32041c5dfd5385d24befba667481.jpg","ar":0.722,"blur":"LCC$WF^jv#Inwbe-M{sD0LNHNx%1"},{"id":"11d0bbda90080f55","url":"11d0bbda90080f55.jpg","ar":1.3571,"blur":"LID+uRIoRjWB~VR*IVWB9GxaIpaz"},{"id":"127e90aac8","url":"127e90aac8.jpg","ar":1.4993,"blur":"LSKBBuIAMwoe~U%2bIxuV[IoxZNH"},{"id":"1294ff7573e8b51e713a38cd01816215968b073e","url":"1294ff7573e8b51e713a38cd01816215968b073e.jpg","ar":1.4011,"blur":"LOH_lR_4t8jF_N%MxuaytSITRixu"},{"id":"12b1eb4e363141fa01d03040833d009676b17c91","url":"12b1eb4e363141fa01d03040833d009676b17c91.jpg","ar":1.8021,"blur":"LSEySq014:-;%fRjROt7E2xaxGWB"},{"id":"12b3821a16d99cd3025dcc2711dd2e8992acf40b","url":"12b3821a16d99cd3025dcc2711dd2e8992acf40b.jpg","ar":1.4401,"blur":"LPGb*YMeR.b_%jtnkDV?NzS*xusk"},{"id":"12ebf0d3b5","url":"12ebf0d3b5.jpg","ar":1.7668,"blur":"LTI;*O00D*IU?HRPt7xaxF%2RjM|"},{"id":"12ff65d104ad631c","url":"12ff65d104ad631c.jpg","ar":1.7778,"blur":"L%KnrNt6tRt8_4oet8t7t7t6ofRj"},{"id":"1312e94ff2","url":"1312e94ff2.jpg","ar":1.3491,"blur":"LGLNlS-n4.8__N9Gnh.8MwIT%gkC"},{"id":"1326c325cbd6f469b580076ebbc792c8488d30fc","url":"1326c325cbd6f469b580076ebbc792c8488d30fc.jpg","ar":1.7786,"blur":"LBEVse9X?IIm9YoNX6RQ4mjvk8V["},{"id":"13b205f4174fb810dc8ffe3bb830021db547f473","url":"13b205f4174fb810dc8ffe3bb830021db547f473.jpg","ar":1.3599,"blur":"LIFil4?H9YxD_Ixa-qxu~pxuD+W."},{"id":"13d72d8fe1","url":"13d72d8fe1.jpg","ar":1.3333,"blur":"LbLzppMytkx[_NWBRjaeXTMxs:t6"},{"id":"141c60ffeb","url":"141c60ffeb.jpg","ar":1.4667,"blur":"LdLW|h%2M_WC~qxZt6ay-VNaM{xZ"},{"id":"14a728c539e47070c23c87d39f571fd26703ba0f","url":"14a728c539e47070c23c87d39f571fd26703ba0f.jpg","ar":1.3344,"blur":"LJGIT3_NtS%2~W%fNIWBM_IAV?t8"},{"id":"14b817fd2e47f15194a44125a6bafb1e116250a9","url":"14b817fd2e47f15194a44125a6bafb1e116250a9.jpg","ar":1.499,"blur":"LCB3$w-=4n8_~qbIITNFM|IVxuxu"},{"id":"14bac130fa","url":"14bac130fa.jpg","ar":1.4819,"blur":"LEHU%$?utPx]-:?HRP9G00-;t7Mx"},{"id":"14c234dce46f17ac5f37853016b535cb900f9673","url":"14c234dce46f17ac5f37853016b535cb900f9673.jpg","ar":1.4376,"blur":"L8D0Jq?aI@_4I[tQ~qIV4:xu^+%M"},{"id":"150739100239c2faee914963e6a26abd01f4ff58","url":"150739100239c2faee914963e6a26abd01f4ff58.jpg","ar":1.4854,"blur":"LEGbbV.AFvAHE^^l%LEL0Kr=V@V?"},{"id":"152de8c5ae","url":"152de8c5ae.jpg","ar":1.7747,"blur":"LQKB2VIAMxoz~qRjWAxuM{xuxukC"},{"id":"1575ee00b5","url":"1575ee00b5.jpg","ar":1.2995,"blur":"LFJRHn4T-:s.?HM{9GofjbM{t8Rj"},{"id":"15df9c14cb","url":"15df9c14cb.jpg","ar":1.6,"blur":"LADI:[^,xcR-_4RiRjxb8_D%xuxa"},{"id":"16161750d314538f","url":"16161750d314538f.jpg","ar":0.6667,"blur":"LgHeRb%1Nbof_N%1xtWBXooLxZs:"},{"id":"161f9c7eef","url":"161f9c7eef.jpg","ar":1.4993,"blur":"LNJuDo0LD%Rk?baySix]W?IUxYRj"},{"id":"162b7551a0280ae84d58f0ed231b6a440b66db0a","url":"162b7551a0280ae84d58f0ed231b6a440b66db0a.jpg","ar":0.936,"blur":"LgDvvVxuW=ad.TtRt7WAk@xut7kB"},{"id":"163ecde6b8","url":"163ecde6b8.jpg","ar":1.3491,"blur":"LDRp8+j;t7tR~qogR*WC.8WEM{j?"},{"id":"163ff650396409507e0b1a6d5bc7b0012c8a9dc5","url":"163ff650396409507e0b1a6d5bc7b0012c8a9dc5.jpg","ar":1.5,"blur":"LCGS4D-:Dhd;*0MwRipI^+$yIVNH"},{"id":"16be79606a9d4610e67eb6b1f1c6e65383fb5275","url":"16be79606a9d4610e67eb6b1f1c6e65383fb5275.jpg","ar":1.0,"blur":"LAF$IqIv00%L~D%M0Kt7=r9F?bE2"},{"id":"16c718951f5bd2b194bdaed6daca339e0ea460ee","url":"16c718951f5bd2b194bdaed6daca339e0ea460ee.jpg","ar":1.5009,"blur":"LDCs1{5q-l-:NG-o%Mxa17^jxux]"},{"id":"172755c17f830d8d","url":"172755c17f830d8d.jpg","ar":0.9375,"blur":"LHEC%u9a4.n1lCM|Rj-kIwjE%MWr"},{"id":"17e09caa69388c95e1bf808a66916a5d5bf8c902","url":"17e09caa69388c95e1bf808a66916a5d5bf8c902.jpg","ar":1.7778,"blur":"LWGln$E0IAWB_4NIaxV?%$IpM_oe"},{"id":"17e9170d1ab28fe9ea5a50bfcdada87a12f61c21","url":"17e9170d1ab28fe9ea5a50bfcdada87a12f61c21.jpg","ar":1.9208,"blur":"LGGIip9F%gf5~qxuIUM|?cD*oJxt"},{"id":"17f55638b1","url":"17f55638b1.jpg","ar":1.0305,"blur":"L*EW,sROROfhyZRPaJk8RpfhjqV@"},{"id":"17fc3aa6721d8e57","url":"17fc3aa6721d8e57.jpg","ar":0.45,"blur":"LKE_%0WAE2xa~BkCNHoL^%s.xts:"},{"id":"1808b1c8d8","url":"1808b1c8d8.jpg","ar":0.75,"blur":"LYKdbyjZRP%2~qWXIVogs8s.jsRj"},{"id":"183aa5b6e79d9c8d734dc36d0256671b3ed2803a","url":"183aa5b6e79d9c8d734dc36d0256671b3ed2803a.jpg","ar":1.7897,"blur":"LPGIcmpJ4n9F0NaekEkE9xxUo#t7"},{"id":"18478a1e9b8c2e98a279546ede417ee8243dca8b","url":"18478a1e9b8c2e98a279546ede417ee8243dca8b.jpg","ar":1.0,"blur":"LCFN^z+uIpEh~o4;nOs..79aE2Sh"},{"id":"1849af8720116af4f50e5cbfa5a9a4b1d2490bea","url":"1849af8720116af4f50e5cbfa5a9a4b1d2490bea.jpg","ar":1.3333,"blur":"LDECm_0f9FM{IAE2-;xt4;-okWxu"},{"id":"184eaa723a","url":"184eaa723a.jpg","ar":1.3333,"blur":"LIIO91T0D*kX~qE2EOSOIVI;_3Nd"},{"id":"186a0e946ddaf03f5a92e92d76a537c57d48df8e","url":"186a0e946ddaf03f5a92e92d76a537c57d48df8e.jpg","ar":1.25,"blur":"L7Jt@+xR~W-;_3rA9Z%is:9FD%4."},{"id":"187564fa761923204821db8bc2438b7bc99a885b","url":"187564fa761923204821db8bc2438b7bc99a885b.jpg","ar":1.0,"blur":"LDKnlE_3f4RP%MRP%M_3M|WC_NIU"},{"id":"18958c08d8f334ce137f76905d8df4e2801bd36c","url":"18958c08d8f334ce137f76905d8df4e2801bd36c.jpg","ar":1.477,"blur":"L5S~x5~q_3_3_3of%Mof-;ayIUof"},{"id":"18ee0eb7d455f4ff878008996e8bae2852de901e","url":"18ee0eb7d455f4ff878008996e8bae2852de901e.jpg","ar":0.75,"blur":"LMHU5$0ho#tQ1RNH%MNfAv%1%2kX"},{"id":"191a686537edc4f6c1af4b29b29fac2db88afd76","url":"191a686537edc4f6c1af4b29b29fac2db88afd76.jpg","ar":1.5,"blur":"LwJ8t*jEV?og?wRms;aygPNHn$WA"},{"id":"195632a655e3b04fff339c8499d30574d87e9c95","url":"195632a655e3b04fff339c8499d30574d87e9c95.jpg","ar":1.5009,"blur":"LjL4j5o$%Lt7~qo#axofN2ngRlR*"},{"id":"19852cb1a6","url":"19852cb1a6.jpg","ar":1.4993,"blur":"LhJ86A%hxtoy~VkXxts,R+M{MxWB"},{"id":"19be1dfaab","url":"19be1dfaab.jpg","ar":0.8682,"blur":"LeCjw|MxIpWYyGRjW=azM}oft7WB"},{"id":"19d3f7dfac","url":"19d3f7dfac.jpg","ar":1.2674,"blur":"LqHCvK%L%gWY%%jYxvj[IWWBRPax"},{"id":"1a36c65d57","url":"1a36c65d57.jpg","ar":1.7297,"blur":"LED04Ssp0eo#9aWr%3r=IpNFxuj]"},{"id":"1a672ed003","url":"1a672ed003.jpg","ar":0.8652,"blur":"L~E;DyM|R.oM.TRlj]oMpJogahj["},{"id":"1ace2615d62d8862","url":"1ace2615d62d8862.jpg","ar":1.7778,"blur":"L%KnrNt6tRt8_4oet8t7t7t6ofRj"},{"id":"1adb1b7003","url":"1adb1b7003.jpg","ar":0.6667,"blur":"LlI5b*IUR*s;.Aj]s:a_?ct5M{of"},{"id":"1b69a899c2","url":"1b69a899c2.jpg","ar":1.6732,"blur":"LuH2NA~qozRjt7oLWBbHM_M{WBj["},{"id":"1bcdaa4ca5dc25a12c90de1dac6a71ca28766401","url":"1bcdaa4ca5dc25a12c90de1dac6a71ca28766401.jpg","ar":1.6598,"blur":"LHD]Yh-pRjIqnORjxuWW0LRixuxt"},{"id":"1c02f1a98fd2e39c7505066dbb24d36bef919322","url":"1c02f1a98fd2e39c7505066dbb24d36bef919322.jpg","ar":0.75,"blur":"LPLNx*%g~qt8-o-;ofRj-;xuM{V@"},{"id":"1c0a2fb619a9aae50d2cd0585436b0dc47f8e73f","url":"1c0a2fb619a9aae50d2cd0585436b0dc47f8e73f.jpg","ar":1.6667,"blur":"LSDlKRRj55S2~XRjE0bH?HR*M{of"},{"id":"1c173e621dbf0c745f883ef3b5ff37ed308e7aa7","url":"1c173e621dbf0c745f883ef3b5ff37ed308e7aa7.jpg","ar":0.6917,"blur":"LDGkn1tR~pXU58%NtRt7xrxZM{E1"},{"id":"1c4de2f922","url":"1c4de2f922.jpg","ar":1.7625,"blur":"LKD04A0Loet7%LRjWAogRkofaxog"},{"id":"1cdcca0d8dd8ce1a5d08a090c43ffe923f25917e","url":"1cdcca0d8dd8ce1a5d08a090c43ffe923f25917e.jpg","ar":1.25,"blur":"LkFZKdM|ayt7%%IVa#xux_kDj[ay"},{"id":"1d0367a3e93df452217445dbc5bf8a37d6aea978","url":"1d0367a3e93df452217445dbc5bf8a37d6aea978.jpg","ar":1.7786,"blur":"LXLqX^D%_4%NNGRj%Mt7x^WBRit7"},{"id":"1d0d3526d176d182428b84655ad015a1d5ab7fb8","url":"1d0d3526d176d182428b84655ad015a1d5ab7fb8.jpg","ar":1.0,"blur":"LQG+2D~otRxttSg3-;ofIvtSxvRk"},{"id":"1d1659341c21cb32a74a1e627f5be72f455f9109","url":"1d1659341c21cb32a74a1e627f5be72f455f9109.jpg","ar":2.0177,"blur":"LtIhjWozkXad_4xuxuWAp0t8t6bH"},{"id":"1d238de6be26fd044f39a951f5c26ce5c58b3657","url":"1d238de6be26fd044f39a951f5c26ce5c58b3657.jpg","ar":1.7786,"blur":"LBFFa7jUO@xG0M4o^*S5EL9Fw}o}"},{"id":"1d66f7f8a2","url":"1d66f7f8a2.jpg","ar":0.7363,"blur":"LiCtR}ogI[kXpMofkXbIMxj[s.ae"},{"id":"1db0f7be5c4ed774595cb1b9086c6133b319a777","url":"1db0f7be5c4ed774595cb1b9086c6133b319a777.jpg","ar":1.25,"blur":"LiKU7j9Et7%MSgx]WARj~qIAogog"},{"id":"1dfda167c5","url":"1dfda167c5.jpg","ar":1.9505,"blur":"LDR:A{.7kCxZ~qtRj[WC-=oLjut7"},{"id":"1e5b2e00e6b088a4","url":"1e5b2e00e6b088a4.jpg","ar":0.7568,"blur":"LIN,oE_N?b%N?aofR*axV@M{IUjZ"},{"id":"1ea1b5382237420c","url":"1ea1b5382237420c.jpg","ar":1.7778,"blur":"L%KeD%t5xuxu_4oet8oft7s:ofWB"},{"id":"1ef55302d7a34dcf5c11e36d008a0b69221672df","url":"1ef55302d7a34dcf5c11e36d008a0b69221672df.jpg","ar":1.5009,"blur":"LaEo}Y4nM{ay_4D%Rjt7xut7M{of"},{"id":"1f0ee9d27cdfae7745ab19815652a742d3d4a0e2","url":"1f0ee9d27cdfae7745ab19815652a742d3d4a0e2.jpg","ar":1.4988,"blur":"LkKwwh%Mb_Mx~qxt%Mt8%gRjxuX8"},{"id":"1f1a79da37","url":"1f1a79da37.jpg","ar":0.6729,"blur":"LzE:[DRnNGayyZWCofWCWtV@oKt7"},{"id":"1f4482d92f0866f2ff3887a7389d2a9f262b5fe6","url":"1f4482d92f0866f2ff3887a7389d2a9f262b5fe6.jpg","ar":1.0,"blur":"LBJkGs~CIVWU?9v|%20LxtD%V?aK"},{"id":"1f565df634","url":"1f565df634.jpg","ar":1.2234,"blur":"LJFiGWkDIUt7_N%Ms:j=^%WBM|xZ"},{"id":"1f82e601f7","url":"1f82e601f7.jpg","ar":1.4993,"blur":"LZJkis-;D%e._4M{M{t7Rjt6t7ax"},{"id":"1f8dd4779a774bcbce66821ae46295186ad86fe1","url":"1f8dd4779a774bcbce66821ae46295186ad86fe1.jpg","ar":1.0,"blur":"LNHU8;}lEmNH%%RPogoz?vR%Siog"},{"id":"1fb636c604d3bdd68ab13e4d9dbef0721d7ec664","url":"1fb636c604d3bdd68ab13e4d9dbef0721d7ec664.jpg","ar":1.25,"blur":"LJFF?K?b-=?c_3~qs+xv-;R%jcRP"},{"id":"1fbf938209","url":"1fbf938209.jpg","ar":1.4656,"blur":"LHKU1W0KyEw]ITahWDSd-;.8%Lni"},{"id":"1fc123e63e","url":"1fc123e63e.jpg","ar":1.5215,"blur":"L6RC;*tTx__1~oNLM^%Mavx_xv%N"},{"id":"1fda69d05d84b1f6e0fc9ec41ef64ce173b776d3","url":"1fda69d05d84b1f6e0fc9ec41ef64ce173b776d3.jpg","ar":1.0,"blur":"LRKw%=4Tk8NH4@%$x^9F-:?Gx]Io"},{"id":"1ff5a86b458b433f50d827e75c401fc511aa72ff","url":"1ff5a86b458b433f50d827e75c401fc511aa72ff.jpg","ar":1.2492,"blur":"LZM%}{?bIntR?wofRjxu.9ogV@oL"},{"id":"2082cb89e0c4d85d9c9880a1c522584a8d8ddd93","url":"2082cb89e0c4d85d9c9880a1c522584a8d8ddd93.jpg","ar":1.7505,"blur":"LRKnVe_NNe~q~Wx[M{V@M~Ios.Io"},{"id":"20b41f64e901bed5d61684eca322c3ca5382b50f","url":"20b41f64e901bed5d61684eca322c3ca5382b50f.jpg","ar":1.5,"blur":"LXL|}w_4W8xa~Wx]IUtRoeRkkDof"}]`);function b(e){let t=2166136261;for(let n=0;n>>0)/4294967295}function x(e){return e<650?96:150}function S(e,t,n=1){let r=Math.max(68,Math.min(168,t/10.25))*n,i=r*r*(.74+b(e.id+`size`)*.48),a=Math.max(.5,Math.min(2,e.ar));return{width:Math.sqrt(i*a),height:Math.sqrt(i/a)}}function ee(e,t,n,r,i,a=0,o=0){let s=Math.ceil(Math.sqrt(n*r/i)),c=Math.ceil(n/s);return{x:-35+(t%s+.5+(b(e.id+`x`)-.5)*.44)*(r+70)/s+a,y:-40+(Math.floor(t/s)+.5+(b(e.id+`y`)-.5)*.48)*(i+80)/c+o,scale:.88+b(e.id+`scale`)*.2}}function te(e,t,n,r,i,a=0,o=0){let s=t*2.399963229728653+.54,c=Math.sqrt((t+.6)/n),l=r/2+Math.cos(s)*c*r*.62,u=Math.sin(s)*c*i*.66,d=Math.max(0,1-Math.abs(l-r/2)/(r*.31)),f=.96+b(e.id+`scale`)*.18+(1-c)*.18,p=S(e,r,e?.featuredScale||1),m=Math.max(p.width,p.height)/2*f,h=(r<650?165:235)+22;return u+=Math.sign(u||1)*d*(r<650?60:92)*(1-c*.45),d>0&&Math.abs(u)e.length>1);if(!t.length)return!1;let n=t.filter(e=>E.has(e)),r=t.filter(e=>T.has(e));return n.length>0&&(r.length>=1||n.length>=2)}function ae(e){return e.filter(e=>!ie(e))}function oe(e){let t=new Set(e);for(let n of e)for(let e of re[n]??[])t.add(e);return[...t]}var O={opacity:1,blur:0,exact:!1},se={opacity:.14,blur:2.4,exact:!1},ce=.02,le=e=>1/(1+Math.exp(-14*(e-.38))),ue=le(0),de=le(1)-ue,fe=700;function pe(e){if(!e||e.length<1)return!1;let t=e[0],n=e.length>1?e[1]:0;return Number.isFinite(t)&&t>=fe&&t>=Math.max(fe,n*2)}function me(e){return he([e.title,e.name,e.category,e.categories,e.description].flatMap(e=>Array.isArray(e)?e:[e]).filter(e=>typeof e==`string`).join(` `))}function he(e){return String(e??``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}function ge(e,t,n=[]){let r=new Set,i=he(String(t||``).trim());if(!i)return r;pe(n.map(e=>e?.score))&&r.add(`malloca:${n[0].sku}`);let a=e.filter(e=>Number.isFinite(e.score));if(D(i)){let e=a[0]?.score??0,t=Math.max(.2,e*.85);for(let e of a.slice(0,6))e.score>=t&&r.add(e.id);return r}let o=a.slice(0,6);for(let e of o){if(i.length<3)break;me(e).includes(i)&&r.add(e.id)}return r}function _e(e,t=``,n=[]){let r=ge(e,t,n),i=(e,t)=>r.has(e)?{...t,exact:!0}:t;if(!e.length)return()=>i(``,O);let a=e.filter(e=>Number.isFinite(e.score)),o=new Map(a.map(e=>[e.id,e.score]));if(!a.length)return e=>i(e,se);let s=a[Math.min(5,a.length-1)].score,c=a[a.length-1].score,l=Math.max(ce,s-c);return e=>{let t=o.get(e);if(t===void 0)return i(e,se);let n=(le(Math.max(0,Math.min(1,1-(s-t)/l)))-ue)/de;return i(e,{opacity:.18+n*.82,blur:1.8*(1-n)**2})}}var ve=`https://huggingface.co/datasets/bep40/interior-image-field-assets/resolve/main/`;function ye(e,t=360){return`${ve}images/${e.url}?w=${t}&q=80`}function be(e,t){return e?.src?e.src:ye(e,t)}var xe=`https://bep40-vai-avatar.hf.space`,k=`avatarimg:`;function A(e){return!!e.avatarImageId||String(e.sku??``).startsWith(k)}function Se(e){let t=String(e.avatarImageId??``).trim();if(t)return t;let n=String(e.sku??``).trim();return n.startsWith(k)?n.slice(10).trim():``}function Ce(e){if(!e||typeof e!=`object`)return null;let t=Se(e);if(t)return`${xe}/share/i/${encodeURIComponent(t)}`;if(A(e))return null;if(e.sku||e.slug){let t=String(e.slug||e.sku||e.mod||``).trim();return t?`${xe}/share/p/${encodeURIComponent(t)}`:null}let n=String(e.id??``).trim();return n?`${xe}/share/i/${encodeURIComponent(n)}`:null}function we({concurrency:e=12,cacheSize:t=128}={}){let n=[],r=[],i=new Set,a=new Map,o=!1,s=0,c=!1;function l(e){if(!e?.naturalWidth||!e.src||o)return;let n=e.src;a.delete(n),a.set(n,e),a.size>t&&a.delete(a.keys().next().value)}function u(){s=0;for(let e=0;e<4&&r.length;e++){let e=r.shift();e.cancelled?l(e.image):e.receive(e.image)}r.length&&(s=requestAnimationFrame(u))}function d(e){r.push(e),s||=requestAnimationFrame(u)}function f(){if(!o)for(n.sort((e,t)=>e.priority-t.priority);i.size{o||(e.cancelled?l(t):d(e))}).catch(()=>{}).finally(()=>{i.delete(e),f()})}}return{request(e,t,r=1e3){let i={url:e,receive:t,priority:r,cancelled:!1,image:null},o=a.get(e);return o?(a.delete(e),i.image=o,d(i)):(n.push(i),c||(c=!0,queueMicrotask(()=>{c=!1,f()}))),{cancel(){i.cancelled=!0;let e=n.indexOf(i);e>=0&&n.splice(e,1)},prioritize(e){i.priority=e}}},release:l,dispose(){o=!0,cancelAnimationFrame(s);for(let e of i)e.cancelled=!0,e.image.removeAttribute(`src`);n.length=r.length=0,a.clear()}}}var Te=`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~`;function Ee(e){if(!e||e.length<6)return`#252823`;let t=0;for(let n of e.slice(2,6)){let e=Te.indexOf(n);if(e<0)return`#252823`;t=t*83+e}return`#${(t&16777215).toString(16).padStart(6,`0`)}`}function j(e,t=1,n=1){return Math.min(512,Math.max(256,Math.ceil(e*Math.max(t,1.25)*Math.min(n,2)/128)*128))}function De(){let e=new Map,t=new Map,n;try{n=new Worker(new URL(new URL(`placeholder.worker-DNqHbwAK.js`,import.meta.url).href,``+import.meta.url),{type:`module`})}catch{}return n&&(n.onmessage=({data:{hash:n,url:r}})=>{e.delete(n),e.set(n,r),e.size>512&&e.delete(e.keys().next().value);for(let e of t.get(n)||[])e(r);t.delete(n)},n.onerror=()=>{n.terminate(),n=null,t.clear()}),{request(r,i){if(!r||!n)return()=>{};if(e.has(r))return i(e.get(r)),()=>{};let a=t.get(r);return a||(a=new Set,t.set(r,a),n.postMessage(r)),a.add(i),()=>a.delete(i)},dispose(){n?.terminate(),t.clear(),e.clear()}}}var Oe=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),M=o(((e,t)=>{t.exports=Oe()}))(),ke=200;function Ae({results:e,onSelect:t,paused:n,query:r=``,products:i=[]}){let a=(0,_.useRef)(null),o=(0,_.useRef)(null),s=(0,_.useRef)(t);s.current=t;let c=(0,_.useRef)({query:r,products:i});return c.current={query:r,products:i},(0,_.useEffect)(()=>{let e=a.current,t=new Map,n=we(),r=De(),i=matchMedia(`(prefers-reduced-motion: reduce)`),l={width:e.clientWidth,height:e.clientHeight,results:[],pool:[],paused:!1,pointer:{x:0,y:0},x:0,y:0},u,d=performance.now(),f=0;function p(n,i,a=!1){let o=document.createElement(`button`);o.className=n.featured?`image-tile featured`:`image-tile`,o.type=`button`,o.dataset.imageId=n.id,o.style.backgroundColor=Ee(n.blur);let c=document.createElement(`a`);c.className=`image-share`,c.tabIndex=-1,c.setAttribute(`aria-hidden`,`true`),c.target=`_blank`,c.rel=`noopener noreferrer`,c.innerHTML=``,c.addEventListener(`click`,e=>e.stopPropagation()),o.append(c),o._share=c;let u=n.featured?300+Math.floor(b(n.id)*40):1+Math.floor(b(n.id)*100);o.style.zIndex=u,e.append(o);let d=a?i:C(n,l.width,l.height,i),f={image:n,button:o,baseZ:u,lifted:!1,...d,target:d,motion:null,exit:!1,phase:b(n.id)*Math.PI*2};return m(f),o.style.transform=`translate3d(${d.x-f.width/2}px,${d.y-f.height/2}px,0) scale(${d.scale})`,t.set(n.id,f),f.cancelPlaceholder=r.request(n.blur,e=>{e&&t.get(n.id)===f&&!f.photo&&(o.style.backgroundImage=`url("${e}")`)}),o.onclick=e=>{(e.composedPath?e.composedPath():[e.target]).includes(c)||s.current({...f.image,previewURL:f.photo?.currentSrc||f.photo?.src},o.getBoundingClientRect().toJSON())},f}function m(e){let t=e.image?.featuredScale||1,{width:n,height:r}=S(e.image,l.width,t);(e.width!==n||e.height!==r)&&(e.width=n,e.height=r,e.button.style.width=`${n}px`,e.button.style.height=`${r}px`)}function h(e){e.load?.cancel(),e.cancelPlaceholder?.(),e.button.remove(),e.photo&&(e.photo.remove(),n.release(e.photo)),t.delete(e.image.id)}function g(e,r){let a=be(e.image,j(e.width,e.target.scale,window.devicePixelRatio||1));e.load=n.request(a,r=>{if(e.load=null,e.exit||t.get(e.image.id)!==e){n.release(r);return}r.alt=``,r.draggable=!1,r.className=``,e.photo=r,e.button.insertBefore(r,e.button._share),i.matches||r.animate([{opacity:0},{opacity:1}],{duration:180,easing:`ease-out`}),r.classList.add(`loaded`)},r)}function _(e=!1){let n=performance.now(),r=new Set(l.pool.map(e=>e.id)),a=new Map(l.results.map((e,t)=>[e.id,t])),{offsetX:o,offsetY:s}=c.current,u=l.results.length||l.pool.some(e=>e.featured),d=l.pool.map((e,t)=>u?te(e,t,l.pool.length,l.width,l.height,o,s):ee(e,t,l.pool.length,l.width,l.height,o,s)),f=_e(l.results,c.current.query,c.current.products);l.pool.forEach((r,o)=>{let s=d[o],c=t.get(r.id)||p(r,s,e);c.image=r;let u=c.button._share;if(u){let e=Ce(r);e?(u.href=e,u.dataset.shareFor=String(r.id),u.removeAttribute(`hidden`)):(u.removeAttribute(`href`),u.removeAttribute(`data-share-for`),u.hidden=!0)}c.target=s,c.exit=!1,c.button.removeAttribute(`aria-hidden`);let h=a.get(r.id);m(c),!c.photo&&!c.load&&g(c,h??200+o),c.load?.prioritize(h??200+o),c.button.setAttribute(`aria-label`,h==null?`Phóng to ảnh`:`Phóng to kết quả ${h+1}`),c.button.setAttribute(`aria-haspopup`,`dialog`);let{opacity:_,blur:v,exact:y}=f(r.id);c.button.style.setProperty(`--relevance-opacity`,_),c.button.style.setProperty(`--relevance-blur`,`${v}px`),c.button.classList.toggle(`exact`,!!y),y&&(c.button.style.setProperty(`--relevance-opacity`,1),c.button.style.setProperty(`--relevance-blur`,`0px`)),c.button.dataset.rank=h==null?``:h+1,c.button.dataset.exact=y?`true`:``,c.button.tabIndex=l.results.length?h!=null&&h<12?0:-1:o<12?0:-1,w(c,s,n,e||i.matches)});for(let[e,a]of t)r.has(e)||a.exit||(a.exit=!0,a.load?.cancel(),a.load=null,a.button.setAttribute(`aria-hidden`,`true`),a.button.dataset.rank=``,a.button.dataset.exact=``,a.button.classList.remove(`exact`),a.button.tabIndex=-1,w(a,C(a.image,l.width,l.height,a),n,i.matches))}function v(e){let t=x(l.width),n=new Set,r=e.length?[...e,...l.pool,...y]:y,i=[];for(let e of r)if(!n.has(e.id)&&(n.add(e.id),i.push(e),i.length===t))break;l.results=e,l.pool=i,_()}function T(e){let n=e-d,r=Math.min(n/1e3,.04);if(d=e,l.paused){for(let e of t.values())e.motion&&(e.motion.started+=n);u=requestAnimationFrame(T);return}document.hidden||(f+=r);let a=1-Math.exp(-4*r);l.x+=(l.pointer.x-l.x)*a,l.y+=(l.pointer.y-l.y)*a;for(let n of t.values()){let t=!0;if(n.motion){let r=ne(n.motion,i.matches?1/0:e);Object.assign(n,r.value),t=r.done,t&&(n.motion=null)}if(n.exit&&t){h(n);continue}let r=n.phase,a=i.matches?0:Math.sin(f*.22+r)*3+l.x*7,o=i.matches?0:Math.cos(f*.18+r)*3+l.y*7;n.button.style.transform=`translate3d(${(n.x-n.width/2+a).toFixed(2)}px,${(n.y-n.height/2+o).toFixed(2)}px,0) scale(${n.scale.toFixed(4)})`,n.button.style.pointerEvents=n.exit?`none`:``}u=requestAnimationFrame(T)}l.pool=y.slice(0,x(l.width)),_(!0);let E=new ResizeObserver(([e])=>{let{width:t,height:n}=e.contentRect;(t!==l.width||n!==l.height)&&(l.width=t,l.height=n,v(l.results))});E.observe(e);let re=e=>{e.pointerType!==`touch`&&(l.pointer.x=(e.clientX/l.width-.5)*2,l.pointer.y=(e.clientY/l.height-.5)*2,ie(e.target))};function ie(e){let n=e?.closest?.(`.image-tile`);for(let e of t.values())e.lifted&&e.button!==n&&D(e);if(!n)return;let r=[...t.values()].find(e=>e.button===n);r&&!r.lifted&&(r.lifted=!0,n.style.zIndex=ke)}function D(e){e.lifted=!1,e.button.style.zIndex=e.baseZ}let ae=()=>{l.pointer.x=l.pointer.y=0;for(let e of t.values())e.lifted&&D(e)};return e.addEventListener(`pointermove`,re),e.addEventListener(`pointerleave`,ae),u=requestAnimationFrame(T),o.current={state:l,update:v},()=>{cancelAnimationFrame(u),E.disconnect(),e.removeEventListener(`pointermove`,re),e.removeEventListener(`pointerleave`,ae),n.dispose(),r.dispose(),e.replaceChildren(),o.current=null}},[]),(0,_.useEffect)(()=>{o.current?.update(e)},[e]),(0,_.useEffect)(()=>{o.current&&(o.current.state.paused=n)},[n]),(0,M.jsx)(`div`,{className:`image-field`,ref:a,"aria-label":`Photograph collection`})}function je(e){return String(e??``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase().replace(/[^a-z0-9]+/g,` `).trim()}function Me(e,t=0){let n=String(e??``);return!n||n===`[]`||n===`{}`?``:(n=n.replace(/<[^>]*>/g,` `).replace(/&#\d+;/g,` `).replace(/&[a-z]+;/gi,` `).replace(/\s+/g,` `).trim(),t>0&&n.length>t?`${n.slice(0,t-1).trimEnd()}…`:n)}var Ne=[[`phong khach`,`Phòng khách`],[`phong ngu`,`Phòng ngủ`],[`phong tam`,`Phòng tắm`],[`phong an`,`Phòng ăn`],[`phong lam viec`,`Phòng làm việc`],[`phong thong`,`Phòng thông`],[`sanh`,`Sảnh`],[`van phong`,`Văn phòng`],[`ban cong`,`Ban công`],[`san thuong`,`Sân thượng`],[`hanh lang`,`Hành lang`],[`cau thang`,`Cầu thang`],[`garage`,`Garage`],[`tang lau`,`Tầng lầu`],[`nha ve sinh`,`Nhà vệ sinh`],[`kho`,`Kho`],[`bep`,`Bếp`],[`baner`,`Banner`],[`tap ket`,`Tấp kết`]],Pe=[`bao gia`,`gioi thieu`,`xay dung`,`sua nha`,`ai anh`,`tin tuc`,`kien thuc`,`video`,`hinh anh`,`thiet ke kien truc`,`blog`,`cap nhat`,`mua ban`,`lien he`,`tuyen dung`];function Fe(e){let t=Ne.map(([e,t])=>({label:t,words:new Set(je(e).split(` `))}));for(let n of e){let e=new Set(je(n).split(` `).filter(Boolean));if(!e.size)continue;let r=null,i=0;for(let n of t){let t=0;for(let r of n.words)e.has(r)&&t++;t===n.words.size&&n.words.size>i&&(i=n.words.size,r=n.label)}if(r)return r}return``}var Ie=/vinhomes|masteri|elysian|gamuda|global\s*city|the\s*global/i;function Le(e,t,n){let r=Me(e?.title,160),i=e=>/[̀-ͯ]/.test(e.normalize(`NFD`)),a=n.filter(e=>{let n=je(e);return n&&n!==`uncategorized`&&i(e)&&!Pe.includes(n)&&!Ie.test(e)&&je(e)!==je(t)}).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()),o=je(r),s=a.filter(e=>!o.includes(je(e))),c=[];if(t&&c.push(`Ảnh chụp ${t.toLowerCase()}`),s.length){let e=s.slice(0,2).join(` và `),t=s.length-Math.min(2,s.length);c.push(t>0?`thuộc chủ đề ${e} và ${t} chủ đề khác`:`thuộc chủ đề ${e}`)}if(!c.length)return r&&r!==`Ảnh nội thất`?`Ảnh minh hoạ cho bài viết “${r}” trong bộ sưu tập thiết kế nội thất Việt Nam của V.AI STUDIO.`:`Ảnh trong bộ sưu tập thiết kế nội thất Việt Nam của V.AI STUDIO.`;let l=c.join(`, `);return`${l.charAt(0).toUpperCase()}${l.slice(1)}, trong bộ sưu tập thiết kế nội thất Việt Nam của V.AI STUDIO.`}var Re=/nhóm sản phẩm|^loại|^giá|^giá bán|xuất xứ|^bảo hành|^tình trạng|^số lượng|^giao hàng|^liên hệ|thông tin|^hướng dẫn|^chính sách|^mã sản phẩm|^sku|^brand|^thương hiệu/i,ze=[/^(loại sản phẩm|loại bếp|loại chậu|nhóm sản phẩm)/i,/^(chất liệu|màu sắc|kiểu dáng|kích thước)/i];function Be(e,t,n){let r=t.filter(([e])=>e&&!Re.test(e));if(!r.length){if(n.length){let e=n.slice(0,2).join(`, `),t=n.length-Math.min(2,n.length);return`Sản phẩm nổi bật với ${e}${t>0?` và ${t} đặc điểm khác`:``}.`}return[Me(e.brand,40),Me(e.category??e.c,80)].filter(Boolean).join(` · `)||``}let i=[];for(let e of ze){let t=r.find(([t])=>e.test(t));t&&i.push(t[1])}for(let[e,t]of r){if(i.length>=4)break;i.includes(t)||i.push(t)}let a=Me(e.name??e.n,160)||Me(e.sku,40),o=i.slice(0,4).join(`, `);return a&&o?`${a}: ${o}.`:a||o}function Ve(e){let t=!!e?.sku&&!e?.avatarImageId,n=Array.isArray(e?.categories)?e.categories.map(e=>Me(e,60)).filter(Boolean):[],r=Fe(n),i=je(r),a=n.filter(e=>Pe.includes(je(e))),o=(r?[r]:[]).concat(n.filter(e=>je(e)!==i&&!Pe.includes(je(e)))).slice(0,10),s=Array.isArray(e?.specs)?e.specs.filter(e=>Array.isArray(e)&&e.length>=2).map(([e,t])=>[Me(e,60),Me(t,160)]).filter(([e,t])=>e&&t):[],c=Array.isArray(e?.feats)?e.feats.map(e=>Me(e,90)).filter(Boolean):[],l=[],u,d=Me(e?.summary??e?.sum??e?.desc,400);if(t){u=Me(e.name??e.n,160)||Me(e.sku,40),d||=Be(e,s,c)||[Me(e.brand,40),Me(e.category??e.c,80)].filter(Boolean).join(` · `);for(let[e,t]of s.slice(0,4))l.push([e,t]);for(let e of c.slice(0,3))l.push([`Tính năng`,e])}else u=Me(e?.title,160)||r||`Ảnh nội thất`,d||=Le(e,r,n),e?.id&&l.push([`Mã ảnh`,String(e.id)]),r&&l.push([`Không gian`,r]);return a.length&&l.push([`Chủ đề`,a.join(`, `)]),{heading:u,room:r,description:d,tags:o,facts:l,isProduct:t}}function He(e,t){return e.src?e.src:typeof e.url==`string`&&/^https?:\/\//i.test(e.url)?e.url:ye(e,t)}function Ue({photo:e,onClose:t}){let n=(0,_.useRef)(null),r=(0,_.useRef)(null),i=(0,_.useRef)(!1),a=(0,_.useRef)([]),o=(0,_.useRef)(null),[s,c]=(0,_.useState)(!1),[l,u]=(0,_.useState)(!1),[d,f]=(0,_.useState)(0),[p,m]=(0,_.useState)(0),h=!!e.sku&&!e.avatarImageId,g=(0,_.useMemo)(()=>h&&Array.isArray(e.images)?e.images.filter(Boolean):null,[h,e.images]),v=(0,_.useMemo)(()=>g?g[p]??g[0]:He(e,2400),[g,p,e]),y=g?v:e.previewURL||He(e,640),b=e.ar||d||4/3,x=(0,_.useCallback)(()=>{let t=r.current.getBoundingClientRect(),n=e.origin;return!n||!t.width||!t.height?`scale(.96)`:`translate(${n.x+n.width/2-t.x-t.width/2}px, ${n.y+n.height/2-t.y-t.height/2}px) scale(${n.width/t.width}, ${n.height/t.height})`},[e.origin]);(0,_.useEffect)(()=>{c(!1),f(0),u(!1)},[v]),(0,_.useEffect)(()=>{m(0)},[e]),(0,_.useEffect)(()=>{let e=document.activeElement;return n.current.showModal(),matchMedia(`(prefers-reduced-motion: reduce)`).matches||(a.current=[r.current.animate([{transform:x(),opacity:.7},{transform:`none`,opacity:1}],{duration:560,easing:`cubic-bezier(.22,1,.36,1)`})]),()=>{a.current.forEach(e=>e.cancel()),e?.isConnected&&e.focus({preventScroll:!0})}},[x]),(0,_.useLayoutEffect)(()=>{let e=o.current;if(o.current=null,!e||matchMedia(`(prefers-reduced-motion: reduce)`).matches)return;let t=r.current.getBoundingClientRect();a.current=[r.current.animate([{transform:`translate(${e.x+e.width/2-t.x-t.width/2}px, ${e.y+e.height/2-t.y-t.height/2}px) scale(${e.width/t.width}, ${e.height/t.height})`},{transform:`none`}],{duration:460,easing:`cubic-bezier(.22,1,.36,1)`})]},[l]);let S=(0,_.useCallback)(async()=>{if(!i.current){if(i.current=!0,!matchMedia(`(prefers-reduced-motion: reduce)`).matches){let e=getComputedStyle(r.current).transform;a.current.forEach(e=>e.cancel());let t=r.current.animate([{transform:e===`none`?`none`:e,opacity:1},{transform:x(),opacity:0}],{duration:320,easing:`cubic-bezier(.4,0,.2,1)`,fill:`forwards`});a.current=[t],n.current.classList.add(`is-closing`),await t.finished.catch(()=>{})}t()}},[t,x]),ee=(0,_.useCallback)(e=>{let t=g?.length??0;t<2||m(n=>{let r=n+e;return r<0||r>=t?n:r})},[g]);(0,_.useEffect)(()=>{if(!g||g.length<2)return;let e=e=>{e.key===`ArrowRight`?(e.preventDefault(),ee(1)):e.key===`ArrowLeft`&&(e.preventDefault(),ee(-1))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[g,ee]);let te=h?`${e.name||`Sản phẩm`}${e.sku?` (${e.sku})`:``}`:`Ảnh nội thất đã phóng to`,C=(0,M.jsx)(`span`,{className:`photo-origin`,children:h?e.name||e.sku:(e.categories||[])[0]||e.title||`Interior design`}),ne=!!(g&&g.length>1),w=Ce(e),T=h&&Array.isArray(e.specs)?e.specs:null,[E,re]=(0,_.useState)(``),ie=(0,_.useCallback)(async({url:e,title:t,label:n})=>{let r=e=>{n(e),window.clearTimeout(r.timer),r.timer=window.setTimeout(()=>n(``),1800)};if(navigator.share){try{await navigator.share({title:t,url:e}),r(`Đã chia sẻ`)}catch{}return}if(navigator.clipboard?.writeText)try{await navigator.clipboard.writeText(e),r(`Đã sao chép liên kết`);return}catch{}let i=document.createElement(`input`);i.value=e,i.setAttribute(`aria-hidden`,`true`),document.body.append(i),i.select();let a=document.execCommand?.(`copy`);i.remove(),r(a?`Đã sao chép liên kết`:`Không chia sẻ được`)},[]),D=(0,_.useMemo)(()=>Ve(e),[e]),ae=D.description.startsWith(`Ảnh trong bộ sưu tập`),oe=!!(D.room||D.tags.length>1||D.heading&&D.heading!==`Ảnh nội thất`||D.description&&!ae),O=(h?[e.name,e.n,e.sku].find(e=>typeof e==`string`&&e.trim()):[e.title,D.heading].find(e=>typeof e==`string`&&e.trim()))||`Ảnh nội thất V.AI STUDIO`;return(0,M.jsxs)(`dialog`,{ref:n,className:`photo-viewer`,"aria-label":`Ảnh toàn màn hình`,onCancel:e=>{e.preventDefault(),S()},onClick:e=>{e.target===n.current&&S()},children:[(0,M.jsxs)(`div`,{className:`photo-toolbar`,children:[w?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`button`,{type:`button`,className:`photo-share`,onClick:()=>ie({url:w,title:O,label:re}),children:[(0,M.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,M.jsx)(`path`,{d:`M14 4h6v6M20 4l-9 9M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5`})}),(0,M.jsx)(`span`,{children:E||(h?`Chia sẻ sản phẩm`:`Chia sẻ ảnh`)})]}),(0,M.jsx)(`a`,{className:`photo-open`,href:w,target:`_blank`,rel:`noopener noreferrer`,title:h?`Xem sản phẩm trên V.AI STUDIO`:`Xem ảnh nội thất trên V.AI STUDIO`,children:(0,M.jsx)(`span`,{children:`Xem trang`})})]}):null,C,(0,M.jsx)(`button`,{type:`button`,"aria-label":`Đóng ảnh`,autoFocus:!0,onClick:S,children:(0,M.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,M.jsx)(`path`,{d:`m6 6 12 12M6 18 18 6`})})})]}),(0,M.jsxs)(`div`,{className:`photo-viewport ${l?`is-zoomed`:``}`,onClick:e=>{e.target===e.currentTarget&&S()},children:[ne&&p>0&&(0,M.jsx)(`button`,{type:`button`,className:`photo-step is-prev`,"aria-label":`Ảnh trước`,onClick:e=>{e.stopPropagation(),ee(-1)},children:(0,M.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,M.jsx)(`path`,{d:`m14 6-6 6 6 6`})})}),(0,M.jsx)(`button`,{ref:r,type:`button`,className:`photo-frame`,"aria-label":l?`Thu nhỏ`:`Phóng to ảnh`,"aria-pressed":l,style:{"--photo-ar":b,backgroundImage:`url("${y}")`},onClick:()=>{o.current=r.current.getBoundingClientRect(),a.current.forEach(e=>e.cancel()),u(e=>!e)},children:(0,M.jsx)(`img`,{src:v,alt:te,className:s?`loaded`:``,onLoad:e=>{c(!0);let t=e.currentTarget;t.naturalWidth&&t.naturalHeight&&f(t.naturalWidth/t.naturalHeight)}})}),ne&&p{e.stopPropagation(),ee(1)},children:(0,M.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,M.jsx)(`path`,{d:`m10 6 6 6-6 6`})})})]}),h&&(e.price||T&&T.length)?(0,M.jsxs)(`div`,{className:`photo-caption`,children:[e.price&&(0,M.jsx)(`p`,{className:`photo-caption-price`,children:e.price}),T&&T.length>0?(0,M.jsx)(`dl`,{className:`photo-caption-specs`,children:T.slice(0,6).map(([e,t],n)=>(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:e}),(0,M.jsx)(`dd`,{children:t})]},n))}):null]}):null,oe?(0,M.jsxs)(`details`,{className:`photo-detail`,children:[(0,M.jsxs)(`summary`,{className:`photo-detail-summary`,children:[(0,M.jsx)(`span`,{className:`photo-detail-title`,children:D.heading}),e.price?(0,M.jsx)(`span`,{className:`photo-detail-price`,children:e.price}):null,(0,M.jsx)(`span`,{className:`photo-detail-toggle`,"aria-hidden":`true`,children:`Chi tiết`})]}),(0,M.jsxs)(`div`,{className:`photo-detail-body`,children:[D.description?(0,M.jsx)(`p`,{className:`photo-detail-desc`,children:D.description}):null,D.tags.length>0?(0,M.jsx)(`ul`,{className:`photo-detail-tags`,children:D.tags.map(e=>(0,M.jsx)(`li`,{children:e},e))}):null,D.facts.length>0?(0,M.jsx)(`dl`,{className:`photo-detail-facts`,children:D.facts.map(([e,t],n)=>(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:e}),(0,M.jsx)(`dd`,{children:t})]},n))}):null]})]}):null,ne?(0,M.jsxs)(`p`,{className:`photo-counter`,role:`status`,"aria-live":`polite`,children:[p+1,` / `,g.length]}):null]})}function We(e){return String(e??``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}function Ge(e,t,n=60){let r=We(String(e||``).trim());if(r.length<2||!t?.length)return[];let i=oe(r.split(/\s+/).filter(e=>e.length>1)),a=[];for(let e of t){let t=We([e.title,e.description,...e.categories||[],...e.keywords||[]].join(` `)),n=0;r.length>=3&&t.includes(r)&&(n+=900);let o=0;for(let e of i)t.includes(e)&&(n+=25,o++);o&&(n+=o*10,!(n<900&&n<60)&&a.push({...e,score:n}))}return a.sort((e,t)=>t.score-e.score||(e.addedAt`interior:${e}`,Xe=e=>`malloca:${e}`,Ze={ke:[`gia`],gia:[`ke`]},Qe=[`/eurogold_img/`,`/eurogold_tb_img/`,`/demax_img/`,`/canzy_img/`,`/images/`];function $e(e){if(typeof e!=`string`||!e||!/huggingface\.co\/spaces\/bep40\/v\.aistudio/i.test(e))return!1;let t=e.toLowerCase();return Qe.some(e=>t.includes(e))}function et(e){for(let t of e?.images??[])if(typeof t==`string`&&/^(https?:\/\/|data:image\/)/i.test(t)&&!$e(t))return t;return``}function tt(e){return{id:Xe(e.sku),ar:Number.isFinite(e.ar)?Math.max(.5,Math.min(2,e.ar)):1}}function nt(e){let t=t=>t>=0&&tNumber.isFinite(t.score)?Math.min(e,t.score):e,1/0),r=Number.isFinite(n)?n:.2;return e.forEach((n,i)=>{if(n.sku===void 0)return;let a=-1;for(let e=i-1;e>=0&&(a=t(e),!(a>=0));e--);if(a<0)for(let n=i+1;n=0));n++);n.score=a>=0?e[a].score:Math.max(r,r+.001*(e.length-i))}),e}function rt(e){return!e||typeof e!=`object`?null:e.product&&typeof e.product==`object`?e.product:e}var it=e=>`avatar-interior:${e}`;function at(e){return{...e,...tt(e),id:it(e.avatarImageId),score:Number.isFinite(e.score)?e.score:1}}function ot(e,t=1.5){return{...e,...tt(e),id:it(e.avatarImageId),featured:!0,featuredScale:t,score:Number.isFinite(e.score)?e.score:1}}function st(e,t,n={}){let r=n.productLimit??qe,i=n.interiorLimit??60,a=new Set,o=[],s=[],c=(n.avatarInteriors??[]).filter(e=>e&&typeof e==`object`&&e.avatarImageId).sort((e,t)=>e.addedAtt.addedAt?-1:0),l=n.featuredLimit??10;for(let[e,t]of c.entries()){let r=it(t.avatarImageId);a.has(r)||(a.add(r),s.push(ee&&typeof e==`object`&&e.sku&&!a.has(Xe(e.sku))).sort((e,t)=>String(e.addedAt||``)String(t.addedAt||``)?-1:0):[],f=[];for(let[e,t]of d.entries()){let e=et(t);if(!e)continue;let r=Xe(t.sku);if(a.has(r))continue;a.add(r);let i={...t,...tt(t),src:e,score:Number.isFinite(t.score)?t.score:1,featured:!0,featuredScale:n.recentScale??1.45};if(f.push(i),f.length>=u)break}for(let e=f.length-1;e>=0;e--)s.unshift(f[e]);o.unshift(...s);let p=n.keywordFloor??300,m=(t??[]).filter(e=>{let t=rt(e),n=et(t);return t?.sku&&n}),h=ae(ct(n.query)),g=pe((t??[]).map(e=>Number.isFinite(e?.score)?e.score:0)),_=h.length>=2&&m.some(e=>{let t=rt(e);if((Number.isFinite(e?.score)?e.score:0){if(lt(n,e))return!0;let t=Ze[e];return!!t&&t.some(e=>lt(n,e))})}),v=D(n.query);h.length!==0&&(g||_)&&(e=[]);function y(e){if(!v||!e?.name)return!0;let t=Ke(e.name);return h.some(e=>lt(t,e))}let b=n.cosFloor??.18,x=n.cosRel??.45,S=0;for(let t of e??[])Number.isFinite(t?.score)&&t.score>S&&(S=t.score);let ee=Math.max(b,S*x);for(let t of e??[]){let e=t?.score,n=e===void 0||!Number.isFinite(e)||e>=ee;if(t?.id&&n&&!a.has(Ye(t.id))&&(a.add(Ye(t.id)),o.push(t),o.length>=i))break}let te=[],C=ge(e??[],n.query??``,t??[]),ne=n.keywordFeatured??r,w=[],T=h.length>0,E=n.productFloor??(T?20:120);for(let e of t??[]){let t=rt(e),n=et(t);if(!t?.sku||!n)continue;let i=Xe(t.sku);if(a.has(i))continue;a.add(i);let o=C.has(i),s=Number.isFinite(e?.score)?e.score:0;if(!(s!==0&&s=r))break}let re=n.freshAdded??4;w.sort((e,t)=>t.score-e.score);let ie=w.filter(e=>{let t=e.product?.addedAt;return typeof t==`string`?t.length>0:Number.isFinite(t)&&t>0}).sort((e,t)=>String(t.product?.addedAt||``).localeCompare(String(e.product?.addedAt||``))),oe=new Set(ie.slice(0,re).map(e=>e.product.sku));if(w.forEach((e,t)=>{let r=h.length===0,i=e.isExact||t=p&&!r,a=oe.has(e.product.sku),o=e.isExact||i||a,s=e.isExact?n.exactScale??1.55:a?n.freshScale??1.45:n.keywordScale??1.4;te.push({...e.product,...tt(e.product),src:e.src,...o?{featured:!0,featuredScale:s}:{}})}),!te.length)return o;let O=te.filter(e=>e.featured),se=te.filter(e=>!e.featured);for(let e=O.length-1;e>=0;e--)o.splice(e,0,O[e]);for(let e=se.length-1;e>=0;e--)o.splice(Math.min(o.length,(e+1)*Je),0,se[e]);return nt(o)}function ct(e){let t=Ke(String(e||``).trim());return t?t.split(/\s+/).filter(e=>e.length>1):[]}function lt(e,t){if(!e||!t)return!1;let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return RegExp(`(^|[^a-z0-9])${n}($|[^a-z0-9])`).test(e)}var ut=3e4;function dt(){return(0,M.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,"aria-hidden":`true`,children:(0,M.jsx)(`path`,{d:`m7 7 10 10M7 17 17 7`})})}function ft(){let[e,t]=(0,_.useState)(``),[n,r]=(0,_.useState)([]),[i,a]=(0,_.useState)({phase:`idle`,label:``}),[o,s]=(0,_.useState)(!1),[c,l]=(0,_.useState)(null),[u,d]=(0,_.useState)(1222),[f,p]=(0,_.useState)([]),[m,h]=(0,_.useState)({loading:!1,error:``}),[g,v]=(0,_.useState)({count:0}),[y,b]=(0,_.useState)([]),[x,S]=(0,_.useState)([]),ee=(0,_.useRef)([]),te=(0,_.useRef)(null),C=(0,_.useRef)(null),ne=(0,_.useRef)(0),w=(0,_.useRef)(0),T=(0,_.useRef)(!1),E=(0,_.useRef)(null),re=(0,_.useRef)(``),ie=(0,_.useRef)([]),D=(0,_.useRef)(``);(0,_.useEffect)(()=>{let e=new Worker(new URL(new URL(`worker-n0zt6z0K.js`,import.meta.url).href,``+import.meta.url),{type:`module`});return te.current=e,e.onmessage=({data:e})=>{if(e.status===`loading`&&a({phase:`loading`,label:e.label,progress:e.progress}),e.status===`ready`&&(T.current=!0,a({phase:`ready`,label:``}),d(e.count)),e.status===`complete`&&e.id===ne.current&&(r(e.output),s(!1),a({phase:`ready`,label:``,elapsed:e.elapsed}),E.current?.resolve({query:e.text,matches:e.output.slice(0,12).map(({id:e,score:t})=>({id:e,score:t})),elapsedMs:Math.round(e.elapsed)}),E.current=null),e.status===`products-loading`&&h(e=>({...e,loading:!0})),e.status===`products-complete`&&e.id===w.current&&(p(e.output),h({loading:!1,error:``}),Array.isArray(e.interiors)&&b(e.interiors),typeof e.signature==`string`&&(D.current=e.signature),e.count&&v({count:e.count})),e.status===`avatar-updated`&&e.changed){let t=re.current.trim();ee.current=e.items??[],b(t?Ge(t,ee.current):ee.current),Array.isArray(e.recentProducts)&&S(e.recentProducts),t&&te.current?.postMessage({type:`search-products`,text:t,id:++w.current,limit:48})}if(e.status===`products-error`&&e.id===w.current&&(p([]),h({loading:!1,error:e.message})),e.status===`catalogue-updated`){let t=e.signature!==D.current;if(D.current=e.signature,v({count:e.count}),t){let e=re.current.trim();e&&te.current?.postMessage({type:`search-products`,text:e,id:++w.current,limit:48})}}e.status===`catalogue-error`&&h(t=>t.error||ie.current.length?t:{loading:!1,error:`Không đồng bộ được danh mục sản phẩm: ${e.message}`}),e.status===`error`&&(e.id==null||e.id===ne.current)&&(a({phase:`error`,label:e.message}),s(!1),E.current?.reject(Error(e.message)),E.current=null)},e.onerror=e=>{a({phase:`error`,label:e.message||`Search could not start. Please reload and try again.`}),s(!1),E.current?.reject(Error(`Search worker failed.`)),E.current=null},e.postMessage({type:`init`}),()=>{e.terminate()}},[]),(0,_.useEffect)(()=>{ie.current=f},[f]),(0,_.useEffect)(()=>{let e=()=>te.current?.postMessage({type:`refresh-catalogue`}),t=setInterval(e,ut),n=()=>{document.visibilityState===`visible`&&e()};return document.addEventListener(`visibilitychange`,n),()=>{clearInterval(t),document.removeEventListener(`visibilitychange`,n)}},[]);let ae=(0,_.useCallback)(e=>{E.current?.reject(Error(`Search superseded by a newer query.`)),E.current=null,e.trim()!==re.current.trim()&&l(null),t(e),re.current=e;let n=++ne.current,i=e.trim();if(!i){te.current?.postMessage({type:`clear`}),r([]),s(!1),p([]),h({loading:!1,error:``}),b(ee.current);return}s(!0),h({loading:!0,error:``}),b(Ge(i,ee.current)),te.current?.postMessage({type:`search`,text:i,id:n}),te.current?.postMessage({type:`search-products`,text:i,id:++w.current,limit:48})},[]);(0,_.useEffect)(()=>{let e=e=>{c||e.metaKey||e.ctrlKey||e.altKey||(e.key===`/`&&e.target.tagName!==`INPUT`&&(e.preventDefault(),C.current?.focus()),e.key===`Escape`&&(ae(``),C.current?.blur()))};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[c,ae]),(0,_.useEffect)(()=>{let e=document.modelContext;if(!e?.registerTool)return;let t=new AbortController,n={name:`search_images`,title:`Tìm ảnh nội thất`,description:`Tìm ảnh nội thất theo ý nghĩa và sắp xếp lại trường ảnh đang hiển thị. Truy vấn rỗng sẽ khôi phục bộ sưu tập.`,inputSchema:{type:`object`,properties:{query:{type:`string`,maxLength:300}},required:[`query`],additionalProperties:!1},annotations:{readOnlyHint:!1,untrustedContentHint:!1},execute:async({query:e})=>{if(typeof e!=`string`||e.length>300)throw Error(`Query must be a string of at most 300 characters.`);return ae(e),e.trim()?new Promise((e,t)=>{E.current={resolve:e,reject:t}}):(await new Promise(e=>requestAnimationFrame(e)),{query:``,reset:!0})}};try{Promise.resolve(e.registerTool(n,{signal:t.signal})).catch(console.warn)}catch{}return()=>t.abort()},[ae]);let oe=i.phase===`loading`,O=i.phase===`error`,se=(0,_.useMemo)(()=>st(n,f,{avatarInteriors:y,recentProducts:x,query:e}),[n,f,y,x,e]),ce=!m.error||f.length?``:m.error;return(0,M.jsxs)(`main`,{className:`app relative isolate h-dvh w-full overflow-hidden`,children:[(0,M.jsx)(`div`,{className:`brand-backdrop`,"aria-hidden":`true`}),(0,M.jsx)(Ae,{results:se,paused:!!c,query:e,products:f,onSelect:(e,t)=>l({...e,origin:t})}),(0,M.jsx)(`div`,{className:`vignette`,"aria-hidden":`true`}),(0,M.jsx)(`div`,{className:`grain`,"aria-hidden":`true`}),(0,M.jsxs)(`section`,{className:`search-center`,"aria-label":`Tìm kiếm ảnh ngữ nghĩa`,children:[(0,M.jsxs)(`form`,{className:`search-pill`,role:`search`,onSubmit:t=>{t.preventDefault(),ae(e)},children:[(0,M.jsx)(`input`,{ref:C,type:`text`,value:e,placeholder:`Tìm ảnh nội thất…`,"aria-label":`Tìm ảnh nội thất theo ý nghĩa`,"aria-describedby":`search-status`,autoComplete:`off`,spellCheck:`false`,maxLength:300,onChange:e=>ae(e.target.value)}),e&&(0,M.jsx)(`button`,{type:`button`,className:`clear-button`,"aria-label":`Xoá tìm kiếm`,onClick:()=>{ae(``),C.current?.focus()},children:(0,M.jsx)(dt,{})}),(0,M.jsx)(`div`,{className:`search-progress ${oe||o?`visible`:``}`,"aria-hidden":`true`,children:(0,M.jsx)(`span`,{style:{width:oe&&i.progress?`${i.progress}%`:`35%`}})})]}),(0,M.jsxs)(`div`,{id:`search-status`,className:`search-status ${O?`has-error`:``}`,role:`status`,"aria-live":`polite`,children:[!O&&ce?(0,M.jsx)(M.Fragment,{children:(0,M.jsx)(`span`,{className:`has-error-inline`,children:ce})}):null,O?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`span`,{children:`Không tải được bộ tìm kiếm.`}),(0,M.jsx)(`button`,{onClick:()=>{a({phase:`loading`,label:`Retrying`}),te.current?.postMessage({type:`init`}),e.trim()&&ae(e)},children:`Thử lại`}),(0,M.jsx)(`span`,{className:`error-detail`,children:i.label})]}):oe?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`span`,{className:`status-dot`}),i.label,i.progress==null?``:` · ${Math.round(i.progress)}%`]}):o?(0,M.jsx)(`span`,{className:`sr-only`,children:`Searching`}):null]})]}),(0,M.jsxs)(`footer`,{className:`footer pointer-events-none absolute inset-x-0 bottom-0 flex items-center justify-between`,children:[(0,M.jsxs)(`a`,{className:`pointer-events-auto`,href:`https://github.com/huggingface/transformers.js-examples/tree/main/semantic-image-search-web`,target:`_blank`,rel:`noreferrer`,children:[`Transformers.js `,(0,M.jsx)(`span`,{className:`version`,children:`4.3.0`})]}),(0,M.jsxs)(`span`,{children:[g.count?`${g.count.toLocaleString()} sản phẩm`:`sản phẩm`,(0,M.jsx)(`span`,{className:`footer-divider`,children:`/`}),` `,u.toLocaleString(),` ảnh`]})]}),c&&(0,M.jsx)(Ue,{photo:c,onClose:()=>l(null)})]})}(0,v.createRoot)(document.getElementById(`root`)).render((0,M.jsx)(ft,{})); \ No newline at end of file diff --git a/dist/assets/neon-frame.css b/dist/assets/neon-frame.css deleted file mode 100644 index c4e3df4f0793cb0e566a83e71800cb8f3a2e687f..0000000000000000000000000000000000000000 --- a/dist/assets/neon-frame.css +++ /dev/null @@ -1,170 +0,0 @@ -/* ── Neon frame: a light that runs around the picture ────────────────────── - * - * Loaded from index.html AFTER dist/assets/app.css, and deliberately overriding - * the ring that bundle paints. It exists because that ring is wrong in a way - * only shows up on non-square tiles. - * - * THE BUG IT UNDOES - * ----------------- - * The @keyframes neon-run shipped in app.css rotated the whole ::before layer - * by one turn. That layer carries BOTH the conic gradient and the mask, so the - * mask rotated with it and stopped lining up with the tile's edges. On a 16:9 - * photograph the painted border tilted off the frame and the highlight read as - * a skewed smear rather than a light going round the picture -- which is - * exactly what "a static neon border" looked like on screen. A tile that - * happened to be nearly square hid the bug, so the effect only ever looked - * broken on real photographs. - * - * WHAT MOVES NOW - * -------------- - * The layer never transforms. What animates is the conic gradient's own start - * angle, --neon-angle, so the bright head walks the perimeter and follows the - * rectangle exactly: it runs down the long edge, turns the corner and comes - * back along the short edge, like a light circling a picture frame. - * - * `--neon-angle` is REGISTERED with @property because an unregistered custom - * property is an untyped token the engine cannot interpolate -- a 0deg to - * 360deg keyframe on one flips once at the midpoint instead of sweeping. That - * flip is worse than the static ring, which is why the animation is gated on - * @supports below: a browser without registration gets the gradient and no - * motion at all, i.e. a lit frame with the head parked at the top. - * - * `inherits: false` keeps the angle on the ring itself. The tile is transformed - * every frame by the field engine, and an inherited animated property would be - * recomputed against a moving box -- which is how the gradient ends up sliding - * relative to the picture it is supposed to be travelling around. - * - * TWO LAYERS, ONE CLOCK - * --------------------- - * ::before is the crisp stroke. ::after is the halo: the same sweep, spread - * over a wider arc and blurred, so the light blooms off the edge instead of - * being cut flat against it. They are one pseudo-element apart because a - * pseudo-element can only carry one background, and a neon frame needs both the - * stroke and the glow. - * - * Both animate over the same duration from the same start angle, so the halo - * stays locked to the head of the stroke on every lap rather than drifting - * ahead of it. - * - * `mask` is what turns the full-size gradient into a ring. Without the composite - * the gradient would fill the whole tile and hide the photograph. The -webkit- - * forms are repeated because Safari needs the prefixed one, and the standard - * alone would leave Safari with an opaque tile. - * - * src/neon-frame.css carries the same rules, so a rebuild produces the same - * frame and this file becomes a no-op rather than a divergence. - */ -@property --neon-angle { - syntax: ''; - inherits: false; - initial-value: 0deg; -} - -.image-tile { - --neon: #22f5d0; - --neon-soft: #7ef9ff; - --neon-run: 2.6s; -} - -/* The crisp stroke: a white-hot head at 0deg, a comet tail fading back round - to 250deg, and a clear gap before the head returns -- so the eye reads a - single light travelling, not a ring that pulses in place. */ -.image-tile.exact::before, -.image-tile.featured::before { - padding: 1px; - background: conic-gradient(from var(--neon-angle, 0deg), - var(--neon) 0deg, - var(--neon-soft) 38deg, - #ffffff 70deg, - var(--neon-soft) 102deg, - var(--neon) 148deg, - #22f5d05c 250deg, - #22f5d000 344deg, - var(--neon) 360deg); - -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); - -webkit-mask-composite: xor; - mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); - mask-composite: exclude; - /* Any transform here drags the mask off the frame, which is the bug above. - Stated explicitly so a later edit cannot reintroduce it by accident. */ - transform: none; -} - -/* The halo. Same sweep from the same angle, spread wider so the light spills - both inward off the edge and outward into the dark around the tile. */ -.image-tile.exact::after, -.image-tile.featured::after { - padding: 2.5px; - background: conic-gradient(from var(--neon-angle, 0deg), - #22f5d000 0deg, - #22f5d085 62deg, - #b6fdffc4 92deg, - #22f5d05e 138deg, - #22f5d01f 250deg, - #22f5d000 348deg, - #22f5d000 360deg); - -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); - -webkit-mask-composite: xor; - mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); - mask-composite: exclude; - filter: blur(4px); - opacity: .82; - /* The stock rule animated box-shadow here instead. A box-shadow breathes in - place -- it cannot run along the perimeter, because the shadow's shape is - the tile's shape and never travels round it. */ - box-shadow: none; -} - -/* The head sweeps one full turn clockwise; the halo sweeps the same turn over - the same duration, so the two re-align every lap instead of drifting apart. - * - * NOTE this is a REPLACEMENT for app.css's neon-run, not an addition. Keyframes - * are global and the last definition of a name wins, so this block takes the - * name over from the built one for the whole page -- which is exactly what - * retires its `rotate(1turn)`, and also why the ungated reset below matters. - */ -@keyframes neon-run { - from { --neon-angle: 0deg; } - to { --neon-angle: 360deg; } -} - -/* Both pseudo-elements default to NO animation, outside any @supports gate. - * - * This has to be unconditional, and it is the subtle part of this file. - * app.css applies `animation: neon-run ...` to these selectors with no feature - * test of its own, so a browser that cannot register @property would otherwise - * run the keyframes above -- animating an untyped token, which snaps at the - * halfway point. The ring would blink once per cycle and look broken in a way - * the old static ring never did. - * - * Setting `animation: none` first and enabling it only inside @supports makes - * the unsupported case the safe one: a lit frame, head parked at the top, no - * motion. It also has to win on order against app.css, which this file loads - * after, so the @supports rule below re-asserts the animation. - */ -.image-tile.exact::before, -.image-tile.featured::before, -.image-tile.exact::after, -.image-tile.featured::after { animation: none; } - -@supports at-rule(@property) { - .image-tile.exact::before, - .image-tile.featured::before, - .image-tile.exact::after, - .image-tile.featured::after { - animation: neon-run var(--neon-run) linear infinite; - } -} - -/* A featured tile -- the exact answer to the query, or a photograph just added - on vai-avatar -- runs faster and thinner, so the newest photographs are - distinguishable from an exact hit by pace as well as by size. */ -.image-tile.featured { --neon-run: 2s; } -.image-tile.featured::before { padding: 1.5px; } - -/* A slow, low-frequency sweep reads as "lit"; a fast strobe reads as an alarm, - and this frame marks a correct answer rather than an error. */ -@media (prefers-reduced-motion: reduce) { - .image-tile.exact::before, .image-tile.exact::after, - .image-tile.featured::before, .image-tile.featured::after { animation: none; } -} diff --git a/dist/assets/share-fix.js b/dist/assets/share-fix.js deleted file mode 100644 index db43887618a4e1e15243c0d5b45fbee61ef5a7ee..0000000000000000000000000000000000000000 --- a/dist/assets/share-fix.js +++ /dev/null @@ -1,193 +0,0 @@ -/** - * Repairs the share link on vai-avatar interior photographs, in the browser. - * ========================================================================= - * - * THE SYMPTOM - * A photograph published on vai-avatar opens its share page at - * - * https://bep40-vai-avatar.hf.space/share/p/avatarimg%3Ab68dc779370dc70e - * - * which is vai-avatar's "Not Found" page. Every interior photograph is - * affected, on the tile's share button and on the viewer's "Xem trang" alike. - * - * WHY IT HAPPENS - * avatar-interiors.js gives every such photograph a namespaced `sku` of - * `avatarimg:`, so it travels the same code path as a catalogue - * product: same viewer, same detail panel, same neon. Namespacing is - * deliberate -- it is what stops a 16-hex image_id colliding with a baked - * interior's id in merge.js's de-duplication set. - * - * But `avatarimg:...` is not an identity the product catalogue knows, and - * vai-avatar's `/share/p/` resolves against exactly that catalogue. So the - * photograph was sent to the product route, where no such SKU exists, and the - * Space answered Not Found. There is nothing to fix on vai-avatar's side: the - * record it would need to find does not exist. The photograph is an interior, - * and the interior route is `/share/i/`. - * - * WHY THIS IS A FILE AND NOT ONLY THE SOURCE FIX - * src/assets.js now routes on `avatarImageId` first, and that is the real fix. - * It is not, though, what the browser runs yet: this Space is `sdk: static`, so - * the page is served from dist/, and dist/assets/index.js was built before that - * fix existed. The neon frame has the same problem -- dist/assets/app.css still - * carries the old `@keyframes neon-run { transform: rotate(1turn) }`, which - * rotated the mask off the frame. Rebuilding needs a shell. - * - * So this corrects the URL where it is consumed, with no rebuild, and the - * source fix carries the same logic forward. The two agree by construction: - * both send `avatarimg:` to `/share/i/`. - * - * WHAT IT COSTS - * One capture-phase listener and one MutationObserver. The observer watches - * only `href` on the whole document -- the field already rebuilds 80 tiles per - * keystroke, but share hrefs change on layout passes, not on the per-frame - * transform writes, so this sees a handful of callbacks rather than 60/s. The - * work per callback is one regex against an attribute value that is almost - * always not a share href. - * - * Once the bundle is rebuilt from src/assets.js this repairs nothing, because - * the hrefs it would find are already correct. It stays loaded rather than - * un-loading itself: it is a few regexes against a handful of anchors, and a - * self-disarming timer is a far worse thing to reason about than inert code. - */ - -const STUDIO = 'https://bep40-vai-avatar.hf.space'; - -/** Anchors worth checking at all: the viewer plus the tile share buttons. */ -const SHARE_ANCHORS = 'a[href*="/share/"]'; - -/** - * A share href that names an interior photograph by its namespaced sku. - * - * Matches the literal `avatarimg` immediately after `/share/p/`, then either - * separator: the value may not have been encoded (`avatarimg:`) or may have - * been (`avatarimg%3A`). Only that one segment is taken as the separator, so an - * id that itself contains a colon still comes through whole. - */ -const BROKEN = /\/share\/p\/(avatarimg)(?::|%3A)([^/?#]+)/i; - -/** - * The same URL, routed as the interior it is. - * - * The id is decoded first: it arrived percent-encoded inside the URL, and - * re-encoding the raw `%3A` would produce `%253A`. `decodeURIComponent` throws - * on a malformed escape, so a bad id is left alone rather than taking the whole - * listener down -- one broken href must not break the page it sits on. - * - * An empty id is rejected too: `/share/i/` with nothing after it is its own - * 404, so redirecting there would trade one dead link for another. - */ -function interiorURL(href) { - const match = BROKEN.exec(href); - if (!match) return null; - let id; - try { - id = decodeURIComponent(match[2]); - } catch { - return null; - } - id = id.trim(); - return id ? `${STUDIO}/share/i/${encodeURIComponent(id)}` : null; -} - -/** Rewrite one anchor's href if it is mis-routed. Returns true if it changed. */ -function repair(anchor) { - const href = anchor?.getAttribute?.('href'); - if (!href) return false; - const fixed = interiorURL(href); - if (!fixed || fixed === href) return false; - anchor.setAttribute('href', fixed); - // Assigning the IDL property as well is redundant with setAttribute for a - // fully-qualified URL, and deliberately so: it keeps `anchor.href` on the - // corrected string for any later read, however the property resolves. - anchor.href = fixed; - return true; -} - -/** - * Sweep `root` and everything under it. `root` defaults to the document. - * - * `root` ITSELF is checked, not only its descendants, and that is not - * redundancy. React sets props on a detached element and then inserts it, so - * the viewer's "Xem trang" anchor arrives in the tree already carrying its - * href -- which means the `href` mutation happened off-tree and no observer ever - * saw it. The only record that describes it is "this node was added", so a - * descendant-only sweep would miss it and the visible link would stay wrong - * until it was clicked. - * - * The tile share anchors take the opposite path and are covered either way: - * ImageField appends the anchor empty and fills the href later on a live - * element, which the `attributes` branch below sees. - */ -function scan(root = document) { - if (root.nodeType === Node.ELEMENT_NODE && root.matches?.(SHARE_ANCHORS)) { - repair(root); - } - for (const anchor of root.querySelectorAll?.(SHARE_ANCHORS) ?? []) { - repair(anchor); - } -} - -const observer = new MutationObserver(records => { - for (const record of records) { - if (record.type === 'attributes') { - // The href changed on an element already in the field. - repair(record.target); - continue; - } - for (const node of record.addedNodes) { - // Both places a share href is rendered: the anchor on a field tile, and - // the viewer's "Xem trang". - if (node.nodeType === Node.ELEMENT_NODE) scan(node); - } - } -}); - -function start() { - scan(); - observer.observe(document.documentElement, { - // href is the only attribute either the React viewer or the field engine - // sets to move a share link, so nothing else needs watching. - attributes: true, - attributeFilter: ['href'], - subtree: true, - childList: true, - }); -} - -if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', start, { once: true }); -} else { - start(); -} - -/** - * A capture-phase click handler, which is what actually guarantees the fix. - * - * The observer corrects the visible href for the reader, but observer callbacks - * run as microtasks after the mutation -- and a click can be dispatched on an - * anchor before any callback has run for the node that inserted it. Repairing - * during capture makes the corrected value the one the browser navigates to, - * because the default action resolves the URL at activation time, after capture - * has run. - * - * This is also the backstop that makes the fix independent of the observer - * catching anything at all: however the link got into the document, clicking it - * resolves it correctly. - * - * The event is deliberately NOT prevented: the aim is to redirect the - * navigation, not suppress it, so middle-click, ctrl-click and "open in new - * tab" all carry the corrected URL exactly as they would on a right one. - */ -document.addEventListener('click', event => { - const anchor = event.target?.closest?.('a[href]'); - if (anchor) repair(anchor); -}, true); - -/** - * Exposed for scripts/test-neon-ui.mjs. - * - * Not a debug hook: that test builds an anchor by hand with a deliberately - * broken href, because the field's own links depend on a live network read of - * the vai-avatar interior index that may not have landed when the test runs. - */ -globalThis.__repairInteriorShareLinks = () => scan(); diff --git a/dist/assets/worker-Bq7vdIsj.js b/dist/assets/worker-Bq7vdIsj.js deleted file mode 100644 index 4e1aeea6e36b8b4e84e6a6a41cabce04ba6a7d7b..0000000000000000000000000000000000000000 --- a/dist/assets/worker-Bq7vdIsj.js +++ /dev/null @@ -1,45 +0,0 @@ -var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n=/* @__PURE__ */ (e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")}),r=/* @__PURE__ */ t({InferenceSession:()=>Me,TRACE:()=>Ce,TRACE_EVENT_BEGIN:()=>De,TRACE_EVENT_END:()=>Oe,TRACE_FUNC_BEGIN:()=>Te,TRACE_FUNC_END:()=>Ee,Tensor:()=>xe,default:()=>rr,env:()=>w,registerBackend:()=>h}),i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,c=(e=>typeof n<`u`?n:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof n<`u`?n:e)[t]}):e)(function(e){ -/*! -* ONNX Runtime Web v1.31.0-dev.20260914-8d85527a0 -* Copyright (c) Microsoft Corporation. All rights reserved. -* Licensed under the MIT License. -*/ -if(typeof n<`u`)return n.apply(this,arguments);throw Error(`Dynamic require of "`+e+`" is not supported`)}),l=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},u=(e,t)=>{for(var n in t)i(e,n,{get:t[n],enumerable:!0})},d=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(let c of o(t))!s.call(e,c)&&c!==n&&i(e,c,{get:()=>t[c],enumerable:!(r=a(t,c))||r.enumerable});return e},f=e=>d(i({},`__esModule`,{value:!0}),e),p,m,h,g,_,v=l(()=>{p=/* @__PURE__ */ new Map,m=[],h=(e,t,n)=>{if(t&&typeof t.init==`function`&&typeof t.createInferenceSessionHandler==`function`){let r=p.get(e);if(r===void 0)p.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let t=m.indexOf(e);t!==-1&&m.splice(t,1);for(let t=0;t{let t=p.get(e);if(!t)return`backend not found.`;if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(e){return n||(t.error=`${e}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},_=async e=>{let t=e.executionProviders||[],n=t.map(e=>typeof e==`string`?e:e.name),r=n.length===0?m:n,i,a=[],o=/* @__PURE__ */ new Set;for(let e of r){let t=await g(e);typeof t==`string`?a.push({name:e,err:t}):(i||=t,i===t&&o.add(e))}if(!i)throw Error(`no available backend found. ERR: ${a.map(e=>`[${e.name}] ${e.err}`).join(`, `)}`);for(let{name:e,err:t}of a)n.includes(e)&&console.warn(`removing requested execution provider "${e}" from session options because it is not available: ${t}`);let s=t.filter(e=>o.has(typeof e==`string`?e:e.name));return[i,new Proxy(e,{get:(e,t)=>t===`executionProviders`?s:Reflect.get(e,t)})]}}),y=l(()=>{v()}),b,x=l(()=>{b=`1.31.0-dev.20260911-2a43ec07e`}),S,C,ee=l(()=>{x(),S=`warning`,C={wasm:{},webgl:{},webgpu:{},versions:{common:b},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);S=e}},get logLevel(){return S}},Object.defineProperty(C,"logLevel",{enumerable:!0})}),w,te=l(()=>{ee(),w=C}),ne,re,ie=l(()=>{ne=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t!==void 0&&t.format!==void 0?t.format:`RGB`,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t{be(),ae=(e,t)=>{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:`RGB`,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,ae(o,s)}throw Error(`Can not access image data`)}else{if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(ae(e.data,s))}});throw Error(`Input data provided is not supported - aborted tensor creation`)}if(o!==void 0)return ae(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},se=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new ye({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ce=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new ye({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},le=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new ye({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},ue=(e,t,n)=>new ye({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]})}),de,fe,pe,me,he=l(()=>{de=/* @__PURE__ */ new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),fe=/* @__PURE__ */ new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]),pe=!1,me=()=>{if(!pe){pe=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<`u`&&n.from;e&&(de.set(`int64`,BigInt64Array),fe.set(BigInt64Array,`int64`)),t&&(de.set(`uint64`,BigUint64Array),fe.set(BigUint64Array,`uint64`)),r?(de.set(`float16`,n),fe.set(n,`float16`)):de.set(`float16`,Uint16Array)}}}),ge,_e,ve=l(()=>{be(),ge=e=>{let t=1;for(let n=0;n{switch(e.location){case`cpu`:return new ye(e.type,e.data,t);case`cpu-pinned`:return new ye({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new ye({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new ye({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new ye({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}}}),ye,be=l(()=>{ie(),T(),he(),ve(),ye=class{constructor(e,t,n){me();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=de.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`){if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=de.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray){if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`)}else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=fe.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=ge(i);if(this.cpuData&&a!==this.cpuData.length&&(r!==`uint4`&&r!==`int4`||Math.ceil(a/2)!==this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return oe(e,t)}static fromTexture(e,t){return se(e,t)}static fromGpuBuffer(e,t){return ce(e,t)}static fromMLTensor(e,t){return le(e,t)}static fromPinnedBuffer(e,t,n){return ue(e,t,n)}toDataURL(e){return ne(this,e)}toImageData(e){return re(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return _e(this,e)}}}),xe,Se=l(()=>{be(),xe=ye}),Ce,we,Te,Ee,De,Oe,ke=l(()=>{ee(),Ce=(e,t)=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.timeStamp(`${e}::ORT::${t}`)},we=(e,t)=>{let n=(/* @__PURE__ */ Error()).stack?.split(/\r\n|\r|\n/g)||[],r=!1;for(let i=0;i{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||we(`BEGIN`,e)},Ee=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||we(`END`,e)},De=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.time(`ORT::${e}`)},Oe=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.timeEnd(`ORT::${e}`)}}),Ae,je=l(()=>{v(),Se(),ke(),Ae=class e{constructor(e){this.handler=e}async run(e,t,n){Te(),De(`InferenceSession.run`);let r={},i={};if(typeof e!=`object`||!e||e instanceof xe||Array.isArray(e))throw TypeError(`'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.`);let a=!0;if(typeof t==`object`){if(t===null)throw TypeError(`Unexpected argument[1]: cannot be null.`);if(t instanceof xe)throw TypeError(`'fetches' cannot be a Tensor`);if(Array.isArray(t)){if(t.length===0)throw TypeError(`'fetches' cannot be an empty array.`);a=!1;for(let e of t){if(typeof e!=`string`)throw TypeError(`'fetches' must be a string array or an object.`);if(this.outputNames.indexOf(e)===-1)throw RangeError(`'fetches' contains invalid output name: ${e}.`);r[e]=null}if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else{let e=!1,o=Object.getOwnPropertyNames(t);for(let n of this.outputNames)if(o.indexOf(n)!==-1){let i=t[n];(i===null||i instanceof xe)&&(e=!0,a=!1,r[n]=i)}if(e){if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else i=t}}else if(typeof t<`u`)throw TypeError(`Unexpected argument[1]: must be 'fetches' or 'options'.`);for(let t of this.inputNames)if(typeof e[t]>`u`)throw Error(`input '${t}' is missing in 'feeds'.`);if(a)for(let e of this.outputNames)r[e]=null;let o=await this.handler.run(e,r,i),s={};for(let e in o)if(Object.hasOwnProperty.call(o,e)){let t=o[e];s[e]=t instanceof xe?t:new xe(t.type,t.data,t.dims)}return Oe(`InferenceSession.run`),Ee(),s}async release(){return this.handler.dispose()}static async create(t,n,r,i){Te(),De(`InferenceSession.create`);let a,o={};if(typeof t==`string`){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof Uint8Array){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&t instanceof SharedArrayBuffer){let e=t,s=0,c=t.byteLength;if(typeof n==`object`&&n)o=n;else if(typeof n==`number`){if(s=n,!Number.isSafeInteger(s))throw RangeError(`'byteOffset' must be an integer.`);if(s<0||s>=e.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${e.byteLength}).`);if(c=t.byteLength-s,typeof r==`number`){if(c=r,!Number.isSafeInteger(c))throw RangeError(`'byteLength' must be an integer.`);if(c<=0||s+c>e.byteLength)throw RangeError(`'byteLength' is out of range (0, ${e.byteLength-s}].`);if(typeof i==`object`&&i)o=i;else if(typeof i<`u`)throw TypeError(`'options' must be an object.`)}else if(typeof r<`u`)throw TypeError(`'byteLength' must be a number.`)}else if(typeof n<`u`)throw TypeError(`'options' must be an object.`);a=new Uint8Array(e,s,c)}else throw TypeError(`Unexpected argument[0]: must be 'path' or 'buffer'.`);let[s,c]=await _(o),l=await s.createInferenceSessionHandler(a,c);return Oe(`InferenceSession.create`),Ee(),new e(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),Me,Ne=l(()=>{je(),Me=Ae}),Pe=l(()=>{}),Fe=l(()=>{}),Ie=l(()=>{}),Le=l(()=>{}),Re={};u(Re,{InferenceSession:()=>Me,TRACE:()=>Ce,TRACE_EVENT_BEGIN:()=>De,TRACE_EVENT_END:()=>Oe,TRACE_FUNC_BEGIN:()=>Te,TRACE_FUNC_END:()=>Ee,Tensor:()=>xe,env:()=>w,registerBackend:()=>h});var ze=l(()=>{y(),te(),Ne(),Se(),Pe(),Fe(),ke(),Ie(),Le()}),Be=l(()=>{}),Ve={};u(Ve,{default:()=>We});var He,Ue,We,Ge=l(()=>{Dn(),ht(),ot(),He=`ort-wasm-proxy-worker`,Ue=globalThis.self?.name===He,Ue&&(self.onmessage=e=>{let{type:t,in:n}=e.data;try{switch(t){case`init-wasm`:mt(n.wasm).then(()=>{hn(n).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})})},e=>{postMessage({type:t,err:e})});break;case`init-ep`:{let{epName:e,env:r}=n;gn(r,e).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})});break}case`copy-from`:{let{buffer:e}=n,r=bn(e);postMessage({type:t,out:r});break}case`create`:{let{model:e,options:r}=n;xn(e,r).then(e=>{postMessage({type:t,out:e})},e=>{postMessage({type:t,err:e})});break}case`release`:Sn(n),postMessage({type:t});break;case`run`:{let{sessionId:e,inputIndices:r,inputs:i,outputIndices:a,options:o}=n;wn(e,r,i,a,Array(a.length).fill(null),o).then(e=>{e.some(e=>e[3]!==`cpu`)?postMessage({type:t,err:`Proxy does not support non-cpu tensor location.`}):postMessage({type:t,out:e},En([...i,...e]))},e=>{postMessage({type:t,err:e})});break}case`end-profiling`:Tn(n),postMessage({type:t})}}catch(e){postMessage({type:t,err:e})}}),We=Ue?null:e=>new Worker(e??Ye,{type:`module`,name:He})}),Ke,qe,Je,Ye,Xe,Ze,Qe,$e,et,tt,nt,rt,it,at,ot=l(()=>{Be(),Ke=typeof location>`u`?void 0:location.origin,qe=import.meta.url>`file:`&&import.meta.url<`file;`,Je=()=>qe?new URL(new URL(`ort.webgpu.min.mjs`,import.meta.url).href,Ke).href:import.meta.url,Ye=Je(),Xe=()=>{if(Ye&&!Ye.startsWith(`blob:`))return Ye.substring(0,Ye.lastIndexOf(`/`)+1)},Ze=(e,t)=>{try{let n=t??Ye;return(n?new URL(e,n):new URL(e)).origin===Ke}catch{return!1}},Qe=(e,t)=>{let n=t??Ye;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},$e=(e,t)=>`${t??`./`}${e}`,et=async e=>{let t=await(await fetch(e,{credentials:`same-origin`})).blob();return URL.createObjectURL(t)},tt=async e=>(await import( -/*webpackIgnore:true*/ -/*@vite-ignore*/ -e)).default,nt=(Ge(),f(Ve)).default,rt=async()=>{if(!Ye)throw Error(`Failed to load proxy worker: cannot determine the script source URL.`);if(Ze(Ye))return[void 0,nt()];let e=await et(Ye);return[e,nt(e)]},it=void 0,at=async(e,t,n,r)=>{let i=it&&!(e||t);if(i){if(Ye)i=Ze(Ye)||r&&!n;else if(r&&!n)i=!0;else throw Error(`cannot determine the script source URL.`)}if(i)return[void 0,it];{let r=`ort-wasm-simd-threaded.asyncify.mjs`,i=e??Qe(r,t),a=n&&i&&!Ze(i,t),o=a?await et(i):i??$e(r,t);return[a?o:void 0,await tt(o)]}}}),st,ct,lt,ut,dt,ft,pt,mt,E,ht=l(()=>{ot(),ct=!1,lt=!1,ut=!1,dt=()=>{if(typeof SharedArrayBuffer>`u`)return!1;try{return typeof MessageChannel<`u`&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},ft=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},pt=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},mt=async e=>{if(ct)return Promise.resolve();if(lt)throw Error(`multiple calls to 'initializeWebAssembly()' detected.`);if(ut)throw Error(`previous call to 'initializeWebAssembly()' failed.`);lt=!0;let t=e.initTimeout,n=e.numThreads;if(e.simd!==!1){if(e.simd===`relaxed`){if(!pt())throw Error(`Relaxed WebAssembly SIMD is not supported in the current environment.`)}else if(!ft())throw Error(`WebAssembly SIMD is not supported in the current environment.`)}let r=dt();n>1&&!r&&(typeof self<`u`&&!self.crossOriginIsolated&&console.warn(`env.wasm.numThreads is set to `+n+`, but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info.`),console.warn(`WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading.`),e.numThreads=n=1);let i=e.wasmPaths,a=typeof i==`string`?i:void 0,o=i?.mjs,s=o?.href??o,c=i?.wasm,l=c?.href??c,u=e.wasmBinary,[d,f]=await at(s,a,n>1,!!u||!!l),p=!1,m=[];if(t>0&&m.push(new Promise(e=>{setTimeout(()=>{p=!0,e()},t)})),m.push(new Promise((e,t)=>{let r={numThreads:n};if(u)r.wasmBinary=u,r.locateFile=e=>e;else if(l||a)r.locateFile=e=>l??a+e;else if(s&&s.indexOf(`blob:`)!==0)r.locateFile=e=>new URL(e,s).href;else if(d){let e=Xe();e&&(r.locateFile=t=>e+t)}f(r).then(t=>{lt=!1,ct=!0,st=t,e(),d&&URL.revokeObjectURL(d)},e=>{lt=!1,ut=!0,t(e)})})),await Promise.race(m),p)throw Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},E=()=>{if(ct&&st)return st;throw Error(`WebAssembly is not initialized yet.`)}}),gt,_t,D,vt=l(()=>{ht(),gt=(e,t)=>{let n=E(),r=n.lengthBytesUTF8(e)+1,i=n._malloc(r);return n.stringToUTF8(e,i,r),t.push(i),i},_t=(e,t,n,r)=>{if(typeof e==`object`&&e){if(n.has(e))throw Error(`Circular reference in options`);n.add(e)}Object.entries(e).forEach(([e,i])=>{let a=t?t+e:e;if(typeof i==`object`)_t(i,a+`.`,n,r);else if(typeof i==`string`||typeof i==`number`)r(a,i.toString());else if(typeof i==`boolean`)r(a,i?`1`:`0`);else throw Error(`Can't handle extra config type: ${typeof i}`)})},D=e=>{let t=E(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetLastError(r,r+n);let i=Number(t.getValue(r,n===4?`i32`:`i64`)),a=t.getValue(r+n,`*`),o=a?t.UTF8ToString(a):``;throw Error(`${e} ERROR_CODE: ${i}, ERROR_MESSAGE: ${o}`)}finally{t.stackRestore(n)}}}),yt,bt=l(()=>{ht(),vt(),yt=e=>{let t=E(),n=0,r=[],i=e||{};try{if(e?.logSeverityLevel===void 0)i.logSeverityLevel=2;else if(typeof e.logSeverityLevel!=`number`||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw Error(`log severity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)i.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!=`number`||!Number.isInteger(e.logVerbosityLevel))throw Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(i.terminate=!1);let a=0;return e?.tag!==void 0&&(a=gt(e.tag,r)),n=t._OrtCreateRunOptions(i.logSeverityLevel,i.logVerbosityLevel,!!i.terminate,a),n===0&&D(`Can't create run options.`),e?.extra!==void 0&&_t(e.extra,``,/* @__PURE__ */ new WeakSet,(e,i)=>{let a=gt(e,r),o=gt(i,r);t._OrtAddRunConfigEntry(n,a,o)!==0&&D(`Can't set a run config entry: ${e} - ${i}.`)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(e=>t._free(e)),e}}}),xt,St,Ct,wt,Tt,Et,Dt,Ot=l(()=>{ht(),vt(),xt=e=>{switch(e){case`disabled`:return 0;case`basic`:return 1;case`extended`:return 2;case`layout`:return 3;case`all`:return 99;default:throw Error(`unsupported graph optimization level: ${e}`)}},St=e=>{switch(e){case`sequential`:return 0;case`parallel`:return 1;default:throw Error(`unsupported execution mode: ${e}`)}},Ct=e=>{e.extra||={},e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||=`1`,e.executionProviders&&e.executionProviders.some(e=>(typeof e==`string`?e:e.name)===`webgpu`)&&(e.enableMemPattern=!1)},wt=(e,t,n,r)=>{let i=gt(t,r),a=gt(n,r);E()._OrtAddSessionConfigEntry(e,i,a)!==0&&D(`Can't set a session config entry: ${t} - ${n}.`)},Tt=(e,t,n,r)=>{let i=gt(t,r),a=gt(n,r);e.push([i,a])},Et=async(e,t,n)=>{let r=t.executionProviders;for(let i of r){let r=typeof i==`string`?i:i.name,a=[];switch(r){case`webnn`:if(r=`WEBNN`,wt(e,`session.disable_quant_qdq`,`1`,n),wt(e,`session.disable_qdq_constant_folding`,`1`,n),typeof i!=`string`){let t=i?.deviceType;t&&wt(e,`deviceType`,t,n)}break;case`webgpu`:{r=`WebGPU`;let e;if(typeof i!=`string`){let r=i;if(r.device){if(typeof GPUDevice<`u`&&r.device instanceof GPUDevice)e=r.device;else throw Error(`Invalid GPU device set in WebGPU EP options.`)}let{enableGraphCapture:o}=t;if(typeof o==`boolean`&&o&&Tt(a,`enableGraphCapture`,`1`,n),typeof r.preferredLayout==`string`&&Tt(a,`preferredLayout`,r.preferredLayout,n),r.forceCpuNodeNames){let e=Array.isArray(r.forceCpuNodeNames)?r.forceCpuNodeNames:[r.forceCpuNodeNames];Tt(a,`forceCpuNodeNames`,e.join(` -`),n)}r.validationMode&&Tt(a,`validationMode`,r.validationMode,n),typeof r.enableMatmulFp32Accumulation==`boolean`&&Tt(a,`enableMatmulFp32Accumulation`,r.enableMatmulFp32Accumulation?`1`:`0`,n);for(let e of[`storageBufferCacheMode`,`uniformBufferCacheMode`,`queryResolveBufferCacheMode`,`defaultBufferCacheMode`]){let t=r[e];if(t){if(t!==`disabled`&&t!==`lazyRelease`&&t!==`simple`&&t!==`bucket`)throw Error(`${e} must be one of 'disabled', 'lazyRelease', 'simple' or 'bucket': ${t}`);Tt(a,e,t,n)}}}let o=E().webgpuRegisterDevice(e);if(o){let[e,t,r]=o;Tt(a,`deviceId`,e.toString(),n),Tt(a,`webgpuInstance`,t.toString(),n),Tt(a,`webgpuDevice`,r.toString(),n)}}break;case`wasm`:case`cpu`:continue;default:throw Error(`not supported execution provider: ${r}`)}let o=gt(r,n),s=a.length,c=0,l=0;if(s>0){c=E()._malloc(s*E().PTR_SIZE),n.push(c),l=E()._malloc(s*E().PTR_SIZE),n.push(l);for(let e=0;e{let t=E(),n=0,r=[],i=e||{};Ct(i);try{let e=xt(i.graphOptimizationLevel??`all`),a=St(i.executionMode??`sequential`),o=typeof i.logId==`string`?gt(i.logId,r):0,s=i.logSeverityLevel??2;if(!Number.isInteger(s)||s<0||s>4)throw Error(`log severity level is not valid: ${s}`);let c=i.logVerbosityLevel??0;if(!Number.isInteger(c)||c<0||c>4)throw Error(`log verbosity level is not valid: ${c}`);let l=typeof i.optimizedModelFilePath==`string`?gt(i.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(e,!!i.enableCpuMemArena,!!i.enableMemPattern,a,!!i.enableProfiling,0,o,s,c,l),n===0&&D(`Can't create session options.`),i.executionProviders&&await Et(n,i,r),i.enableGraphCapture!==void 0){if(typeof i.enableGraphCapture!=`boolean`)throw Error(`enableGraphCapture must be a boolean value: ${i.enableGraphCapture}`);wt(n,`enableGraphCapture`,i.enableGraphCapture.toString(),r)}if(i.freeDimensionOverrides)for(let[e,a]of Object.entries(i.freeDimensionOverrides)){if(typeof e!=`string`)throw Error(`free dimension override name must be a string: ${e}`);if(typeof a!=`number`||!Number.isInteger(a)||a<0)throw Error(`free dimension override value must be a non-negative integer: ${a}`);let i=gt(e,r);t._OrtAddFreeDimensionOverride(n,i,a)!==0&&D(`Can't set a free dimension override: ${e} - ${a}.`)}return i.extra!==void 0&&_t(i.extra,``,/* @__PURE__ */ new WeakSet,(e,t)=>{wt(n,e,t,r)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&D(`Can't release session options.`),r.forEach(e=>t._free(e)),e}}}),kt,At,jt,Mt,Nt,Pt,Ft,It,Lt=l(()=>{kt=e=>{switch(e){case`int8`:return 3;case`uint8`:return 2;case`bool`:return 9;case`int16`:return 5;case`uint16`:return 4;case`int32`:return 6;case`uint32`:return 12;case`float16`:return 10;case`float32`:return 1;case`float64`:return 11;case`string`:return 8;case`int64`:return 7;case`uint64`:return 13;case`int4`:return 22;case`uint4`:return 21;default:throw Error(`unsupported data type: ${e}`)}},At=e=>{switch(e){case 3:return`int8`;case 2:return`uint8`;case 9:return`bool`;case 5:return`int16`;case 4:return`uint16`;case 6:return`int32`;case 12:return`uint32`;case 10:return`float16`;case 1:return`float32`;case 11:return`float64`;case 8:return`string`;case 7:return`int64`;case 13:return`uint64`;case 22:return`int4`;case 21:return`uint4`;default:throw Error(`unsupported data type: ${e}`)}},jt=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t==`number`?t:t.reduce((e,t)=>e*t,1);return n>0?Math.ceil(r*n):void 0},Mt=e=>{switch(e){case`float16`:return typeof Float16Array<`u`?Float16Array:Uint16Array;case`float32`:return Float32Array;case`uint8`:return Uint8Array;case`int8`:return Int8Array;case`uint16`:return Uint16Array;case`int16`:return Int16Array;case`int32`:return Int32Array;case`bool`:return Uint8Array;case`float64`:return Float64Array;case`uint32`:return Uint32Array;case`int64`:return BigInt64Array;case`uint64`:return BigUint64Array;default:throw Error(`unsupported type: ${e}`)}},Nt=e=>{switch(e){case`verbose`:return 0;case`info`:return 1;case`warning`:return 2;case`error`:return 3;case`fatal`:return 4;default:throw Error(`unsupported logging level: ${e}`)}},Pt=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,Ft=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint64`||e===`int8`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,It=e=>{switch(e){case`none`:return 0;case`cpu`:return 1;case`cpu-pinned`:return 2;case`texture`:return 3;case`gpu-buffer`:return 4;case`ml-tensor`:return 5;default:throw Error(`unsupported data location: ${e}`)}}}),Rt,zt=l(()=>{Be(),Rt=async e=>{if(typeof e==`string`){let t=await fetch(e);if(!t.ok)throw Error(`failed to load external data file: ${e}`);let n=t.headers.get(`Content-Length`),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw Error(`failed to load external data file: ${e}, no response body.`);let n=t.body.getReader(),i;try{i=new ArrayBuffer(r)}catch(e){if(e instanceof RangeError){let e=Math.ceil(r/65536);i=new WebAssembly.Memory({initial:e,maximum:e}).buffer}else throw e}let a=0;for(;;){let{done:e,value:t}=await n.read();if(e)break;let r=t.byteLength;new Uint8Array(i,a,r).set(t),a+=r}return new Uint8Array(i,0,r)}}return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}}),Bt,Vt=l(()=>{Lt(),Bt=(e,t)=>new(Mt(t))(e)}),Ht,Ut,Wt,Gt,Kt,qt,Jt,Yt=l(()=>{Lt(),Ht=[`V`,`I`,`W`,`E`,`F`],Ut=(e,t)=>{console.log(`[${Ht[e]},${(/* @__PURE__ */ new Date()).toISOString()}]${t}`)},Kt=(e,t)=>{Wt=e,Gt=t},qt=(e,t)=>{let n=Nt(e);n>=Nt(Wt)&&Ut(n,typeof t==`function`?t():t)},Jt=(...e)=>{Gt&&qt(...e)}}),Xt,Zt,Qt,$t,en,tn,nn,rn,an,on,sn,cn=l(()=>{Lt(),Yt(),Xt=/* @__PURE__ */ new Map([[`float32`,32],[`float16`,16],[`int32`,32],[`uint32`,32],[`int64`,64],[`uint64`,64],[`int8`,8],[`uint8`,8],[`int4`,4],[`uint4`,4]]),Zt=(e,t)=>{if(t===`int32`)return e;let n=Xt.get(t);if(!n)throw Error(`WebNN backend does not support data type: ${t}`);let r=n/8;if(e.byteLength%r!==0)throw Error(`Invalid Uint8Array length - must be a multiple of ${r}.`);let i=e.byteLength/r,a=new(Mt(t))(e.buffer,e.byteOffset,i);switch(t){case`int64`:case`uint64`:{let e=new Int32Array(i);for(let t=0;t2147483647n||n<-2147483648n)throw Error(`Can not convert int64 data to int32 - value out of range.`);e[t]=Number(n)}return new Uint8Array(e.buffer)}case`int8`:case`uint8`:case`uint32`:{if(t===`uint32`&&a.some(e=>e>2147483647))throw Error(`Can not convert uint32 data to int32 - value out of range.`);let e=Int32Array.from(a,Number);return new Uint8Array(e.buffer)}default:throw Error(`Unsupported data conversion from ${t} to 'int32'`)}},Qt=(e,t)=>{if(t===`int32`)return e;if(e.byteLength%4!=0)throw Error(`Invalid Uint8Array length - must be a multiple of 4 (int32).`);let n=e.byteLength/4,r=new Int32Array(e.buffer,e.byteOffset,n);switch(t){case`int64`:{let e=BigInt64Array.from(r,BigInt);return new Uint8Array(e.buffer)}case`uint64`:{if(r.some(e=>e<0))throw Error(`Can not convert int32 data to uin64 - negative value found.`);let e=BigUint64Array.from(r,BigInt);return new Uint8Array(e.buffer)}case`int8`:{if(r.some(e=>e<-128||e>127))throw Error(`Can not convert int32 data to int8 - value out of range.`);let e=Int8Array.from(r,Number);return new Uint8Array(e.buffer)}case`uint8`:if(r.some(e=>e<0||e>255))throw Error(`Can not convert int32 data to uint8 - value out of range.`);return Uint8Array.from(r,Number);case`uint32`:{if(r.some(e=>e<0))throw Error(`Can not convert int32 data to uint32 - negative value found.`);let e=Uint32Array.from(r,Number);return new Uint8Array(e.buffer)}default:throw Error(`Unsupported data conversion from 'int32' to ${t}`)}},$t=1,en=()=>$t++,tn=/* @__PURE__ */ new Map([[`int8`,`int32`],[`uint8`,`int32`],[`uint32`,`int32`],[`int64`,`int32`]]),nn=(e,t)=>{let n=Xt.get(e);if(!n)throw Error(`WebNN backend does not support data type: ${e}`);return t.length>0?Math.ceil(t.reduce((e,t)=>e*t)*n/8):0},rn=class{constructor(e){this.isDataConverted=!1;let{sessionId:t,context:n,tensor:r,dataType:i,shape:a,fallbackDataType:o}=e;this.sessionId=t,this.mlContext=n,this.mlTensor=r,this.dataType=i,this.tensorShape=a,this.fallbackDataType=o}get tensor(){return this.mlTensor}get type(){return this.dataType}get fallbackType(){return this.fallbackDataType}get shape(){return this.tensorShape}get byteLength(){return nn(this.dataType,this.tensorShape)}destroy(){Jt(`verbose`,()=>`[WebNN] TensorWrapper.destroy`),this.mlTensor.destroy()}write(e){this.mlContext.writeTensor(this.mlTensor,e)}async read(e){if(this.fallbackDataType){let t=await this.mlContext.readTensor(this.mlTensor),n=Qt(new Uint8Array(t),this.dataType);if(e){(e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)).set(n);return}return new Uint8Array(n).buffer}return e?this.mlContext.readTensor(this.mlTensor,e):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(e,t,n){return this.mlContext===e&&this.dataType===t&&this.tensorShape.length===n.length&&this.tensorShape.every((e,t)=>e===n[t])}setIsDataConverted(e){this.isDataConverted=e}},an=class{constructor(e,t){this.tensorManager=e,this.wrapper=t}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(e,t,n,r){let i=this.tensorManager.getMLContext(e),a=this.tensorManager.getMLOpSupportLimits(e),o;if(!a?.input.dataTypes.includes(t)){if(o=tn.get(t),!o||!a?.input.dataTypes.includes(o))throw Error(`WebNN backend does not support data type: ${t}`);Jt(`verbose`,()=>`[WebNN] TensorIdTracker.ensureTensor: fallback dataType from ${t} to ${o}`)}if(this.wrapper){if(this.wrapper.canReuseTensor(i,t,n))return this.wrapper.tensor;if(r){if(this.wrapper.byteLength!==nn(t,n))throw Error(`Unable to copy data to tensor with different size.`);this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let s=typeof MLTensorUsage>`u`?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(e,t,n,s,!0,!0,o),r&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(e){let t=e;if(this.wrapper){if(this.wrapper.fallbackType){if(this.wrapper.fallbackType===`int32`)t=Zt(e,this.wrapper.type),this.wrapper.setIsDataConverted(!0);else throw Error(`Unsupported fallback data type: ${this.wrapper.fallbackType}`)}if(e.byteLength===this.wrapper.byteLength){this.wrapper.write(t);return}Jt(`verbose`,()=>`Data size does not match tensor size. Releasing tensor.`),this.releaseTensor()}this.activeUpload?this.activeUpload.set(t):this.activeUpload=new Uint8Array(t)}async download(e){if(this.activeUpload){let t=this.wrapper?.isDataConverted?Qt(this.activeUpload,this.wrapper?.type):this.activeUpload;if(e){e instanceof ArrayBuffer?new Uint8Array(e).set(t):new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(t);return}return t.buffer}if(!this.wrapper)throw Error(`Tensor has not been created.`);return e?this.wrapper.read(e):this.wrapper.read()}},on=class{constructor(e){this.backend=e,this.tensorTrackersById=/* @__PURE__ */ new Map,this.freeTensors=[],this.externalTensors=/* @__PURE__ */ new Set}getMLContext(e){let t=this.backend.getMLContext(e);if(!t)throw Error(`MLContext not found for session.`);return t}getMLOpSupportLimits(e){return this.backend.getMLOpSupportLimits(e)}reserveTensorId(){let e=en();return this.tensorTrackersById.set(e,new an(this)),e}releaseTensorId(e){let t=this.tensorTrackersById.get(e);t&&(this.tensorTrackersById.delete(e),t.tensorWrapper&&this.releaseTensor(t.tensorWrapper))}async ensureTensor(e,t,n,r,i){Jt(`verbose`,()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${t}, dataType: ${n}, shape: ${r}, copyOld: ${i}}`);let a=this.tensorTrackersById.get(t);if(!a)throw Error(`Tensor not found.`);return a.ensureTensor(e,n,r,i)}upload(e,t){let n=this.tensorTrackersById.get(e);if(!n)throw Error(`Tensor not found.`);n.upload(t)}async download(e,t){Jt(`verbose`,()=>`[WebNN] TensorManager.download {tensorId: ${e}, dstBuffer: ${t?.byteLength}}`);let n=this.tensorTrackersById.get(e);if(!n)throw Error(`Tensor not found.`);return n.download(t)}releaseTensorsForSession(e){for(let t of this.freeTensors)t.sessionId===e&&t.destroy();this.freeTensors=this.freeTensors.filter(t=>t.sessionId!==e)}registerTensor(e,t,n,r){let i=this.getMLContext(e),a=en(),o=new rn({sessionId:e,context:i,tensor:t,dataType:n,shape:r});return this.tensorTrackersById.set(a,new an(this,o)),this.externalTensors.add(o),a}async getCachedTensor(e,t,n,r,i,a,o){let s=this.getMLContext(e);for(let[r,i]of this.freeTensors.entries())if(i.canReuseTensor(s,t,n)){Jt(`verbose`,()=>`[WebNN] Reusing tensor {dataType: ${t}, ${o?`fallbackDataType: ${o},`:``} shape: ${n}`);let i=this.freeTensors.splice(r,1)[0];return i.sessionId=e,i}Jt(`verbose`,()=>`[WebNN] MLContext.createTensor {dataType: ${t}, ${o?`fallbackDataType: ${o},`:``} shape: ${n}}`);let c=await s.createTensor({dataType:o??t,shape:n,dimensions:n,usage:r,writable:i,readable:a});return new rn({sessionId:e,context:s,tensor:c,dataType:t,shape:n,fallbackDataType:o})}releaseTensor(e){this.externalTensors.has(e)&&this.externalTensors.delete(e),this.freeTensors.push(e)}},sn=(...e)=>new on(...e)}),ln={};u(ln,{WebNNBackend:()=>fn});var un,dn,fn,pn=l(()=>{Lt(),ht(),Vt(),cn(),Yt(),un=/* @__PURE__ */ new Map([[1,`float32`],[10,`float16`],[6,`int32`],[12,`uint32`],[7,`int64`],[13,`uint64`],[22,`int4`],[21,`uint4`],[3,`int8`],[2,`uint8`],[9,`uint8`]]),dn=(e,t)=>{if(e===t)return!0;if(e===void 0||t===void 0)return!1;let n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((n,i)=>n===r[i]&&e[n]===t[n])},fn=class{constructor(e){this.tensorManager=sn(this),this.mlContextBySessionId=/* @__PURE__ */ new Map,this.sessionIdsByMLContext=/* @__PURE__ */ new Map,this.mlContextCache=[],this.sessionGraphInputs=/* @__PURE__ */ new Map,this.sessionGraphOutputs=/* @__PURE__ */ new Map,this.temporaryGraphInputs=[],this.temporaryGraphOutputs=[],this.temporarySessionTensorIds=/* @__PURE__ */ new Map,this.mlOpSupportLimitsBySessionId=/* @__PURE__ */ new Map,Kt(e.logLevel,!!e.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw Error(`No active session`);return this.activeSessionId}onRunStart(e){Jt(`verbose`,()=>`[WebNN] onRunStart {sessionId: ${e}}`),this.activeSessionId=e}onRunEnd(e){Jt(`verbose`,()=>`[WebNN] onRunEnd {sessionId: ${e}}`);let t=this.temporarySessionTensorIds.get(e);if(t){for(let e of t)Jt(`verbose`,()=>`[WebNN] releasing temporary tensor {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e);this.temporarySessionTensorIds.delete(e),this.activeSessionId=void 0}}async createMLContext(e){if(e instanceof GPUDevice){let t=this.mlContextCache.findIndex(t=>t.gpuDevice===e);if(t!==-1)return this.mlContextCache[t].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({gpuDevice:e,mlContext:t}),t}}if(e===void 0){let e=this.mlContextCache.findIndex(e=>e.options===void 0&&e.gpuDevice===void 0);if(e!==-1)return this.mlContextCache[e].mlContext;{let e=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:e}),e}}let t=this.mlContextCache.findIndex(t=>dn(t.options,e));if(t!==-1)return this.mlContextCache[t].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({options:e,mlContext:t}),t}}registerMLContext(e,t){this.mlContextBySessionId.set(e,t);let n=this.sessionIdsByMLContext.get(t);n||(n=/* @__PURE__ */ new Set,this.sessionIdsByMLContext.set(t,n)),n.add(e),this.mlOpSupportLimitsBySessionId.has(e)||this.mlOpSupportLimitsBySessionId.set(e,t.opSupportLimits()),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(e,this.temporaryGraphInputs),this.temporaryGraphInputs=[]),this.temporaryGraphOutputs.length>0&&(this.sessionGraphOutputs.set(e,this.temporaryGraphOutputs),this.temporaryGraphOutputs=[])}onReleaseSession(e){this.sessionGraphInputs.delete(e),this.sessionGraphOutputs.delete(e);let t=this.mlContextBySessionId.get(e);if(!t)return;this.tensorManager.releaseTensorsForSession(e),this.mlContextBySessionId.delete(e),this.mlOpSupportLimitsBySessionId.delete(e);let n=this.sessionIdsByMLContext.get(t);if(n.delete(e),n.size===0){this.sessionIdsByMLContext.delete(t);let e=this.mlContextCache.findIndex(e=>e.mlContext===t);e!==-1&&this.mlContextCache.splice(e,1)}}getMLContext(e){return this.mlContextBySessionId.get(e)}getMLOpSupportLimits(e){return this.mlOpSupportLimitsBySessionId.get(e)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(e){Jt(`verbose`,()=>`[WebNN] releaseTensorId {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e)}async ensureTensor(e,t,n,r,i){let a=un.get(n);if(!a)throw Error(`Unsupported ONNX data type: ${n}`);return this.tensorManager.ensureTensor(e??this.currentSessionId,t,a,r,i)}async createTemporaryTensor(e,t,n){Jt(`verbose`,()=>`[WebNN] createTemporaryTensor {onnxDataType: ${t}, shape: ${n}}`);let r=un.get(t);if(!r)throw Error(`Unsupported ONNX data type: ${t}`);let i=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(e,i,r,n,!1);let a=this.temporarySessionTensorIds.get(e);return a?a.push(i):this.temporarySessionTensorIds.set(e,[i]),i}uploadTensor(e,t){if(!E().shouldTransferToMLTensor)throw Error(`Trying to upload to a MLTensor while shouldTransferToMLTensor is false`);Jt(`verbose`,()=>`[WebNN] uploadTensor {tensorId: ${e}, data: ${t.byteLength}}`),this.tensorManager.upload(e,t)}async downloadTensor(e,t){return this.tensorManager.download(e,t)}createMLTensorDownloader(e,t){return async()=>{let n=await this.tensorManager.download(e);return Bt(n,t)}}registerMLTensor(e,t,n,r){let i=un.get(n);if(!i)throw Error(`Unsupported ONNX data type: ${n}`);let a=this.tensorManager.registerTensor(e,t,i,r);return Jt(`verbose`,()=>`[WebNN] registerMLTensor {tensor: ${t}, dataType: ${i}, dimensions: ${r}} -> {tensorId: ${a}}`),a}registerGraphInput(e){this.temporaryGraphInputs.push(e)}registerGraphOutput(e){this.temporaryGraphOutputs.push(e)}isGraphInput(e,t){let n=this.sessionGraphInputs.get(e);return n?n.includes(t):!1}isGraphOutput(e,t){let n=this.sessionGraphOutputs.get(e);return n?n.includes(t):!1}isGraphInputOutputTypeSupported(e,t,n=!0){let r=un.get(kt(t)),i=this.mlOpSupportLimitsBySessionId.get(e);return typeof r>`u`?!1:n?!!i?.input.dataTypes.includes(r):!!i?.output.dataTypes.includes(r)}flush(){}}}),mn,hn,gn,_n,vn,yn,bn,xn,Sn,Cn,wn,Tn,En,Dn=l(()=>{ze(),bt(),Ot(),Lt(),ht(),vt(),zt(),mn=(e,t)=>{E()._OrtInit(e,t)!==0&&D(`Can't initialize onnxruntime.`)},hn=async e=>{mn(e.wasm.numThreads,Nt(e.logLevel))},gn=async(e,t)=>{E().asyncInit?.();let n=e.webgpu.adapter;if(t===`webgpu`){if(typeof navigator>`u`||!navigator.gpu)throw Error(`WebGPU is not supported in current environment`);if(n){if(typeof n.limits!=`object`||typeof n.features!=`object`||typeof n.requestDevice!=`function`)throw Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let t=e.webgpu.powerPreference;if(t!==void 0&&t!==`low-power`&&t!==`high-performance`)throw Error(`Invalid powerPreference setting: "${t}"`);let r=e.webgpu.forceFallbackAdapter;if(r!==void 0&&typeof r!=`boolean`)throw Error(`Invalid forceFallbackAdapter setting: "${r}"`);if(n=await navigator.gpu.requestAdapter({powerPreference:t,forceFallbackAdapter:r}),!n)throw Error(`Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.`)}}if(t===`webnn`&&(typeof navigator>`u`||!navigator.ml))throw Error(`WebNN is not supported in current environment`);if(t===`webgpu`&&E().webgpuInit(t=>{e.webgpu.device=t}),t===`webnn`){let t=new(pn(),f(ln)).WebNNBackend(e);E().webnnInit([t,()=>t.reserveTensorId(),e=>t.releaseTensorId(e),async(e,n,r,i,a)=>t.ensureTensor(e,n,r,i,a),(e,n)=>{t.uploadTensor(e,n)},async(e,n)=>t.downloadTensor(e,n),(e,n)=>t.registerMLContext(e,n),!!e.trace])}},_n=/* @__PURE__ */ new Map,vn=e=>{let t=E(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetInputOutputCount(e,r,r+n)!==0&&D(`Can't get session input/output count.`);let i=n===4?`i32`:`i64`;return[Number(t.getValue(r,i)),Number(t.getValue(r+n,i))]}finally{t.stackRestore(n)}},yn=(e,t)=>{let n=E(),r=n.stackSave(),i=0;try{let r=n.PTR_SIZE,a=n.stackAlloc(2*r);n._OrtGetInputOutputMetadata(e,t,a,a+r)!==0&&D(`Can't get session input/output metadata.`);let o=Number(n.getValue(a,`*`));i=Number(n.getValue(a+r,`*`));let s=n.HEAP32[i/4];if(s===0)return[o,0];let c=n.HEAPU32[i/4+1],l=[];for(let e=0;e{let t=E(),n=t._malloc(e.byteLength);if(n===0)throw Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},xn=async(e,t)=>{let n,r,i=E();Array.isArray(e)?[n,r]=e:e.buffer===i.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=bn(e);let a=0,o=0,s=0,c=[],l=[],u=[];try{if([o,c]=await Dt(t),t?.externalData&&i.mountExternalData){let e=[];for(let n of t.externalData){let t=typeof n==`string`?n:n.path,r=typeof n==`string`?n:n.data;e.push(Rt(r).then(e=>{i.mountExternalData(t,e)}))}await Promise.all(e)}for(let e of t?.executionProviders??[])if((typeof e==`string`?e:e.name)===`webnn`){if(i.shouldTransferToMLTensor=!1,typeof e!=`string`){let t=e,n=t?.context,r=t?.gpuDevice,a=t?.deviceType,o=t?.powerPreference;i.currentContext=n||(r?await i.webnnCreateMLContext(r):await i.webnnCreateMLContext({deviceType:a,powerPreference:o}))}else i.currentContext=await i.webnnCreateMLContext();break}a=await i._OrtCreateSession(n,r,o),i.webgpuOnCreateSession?.(a),a===0&&D(`Can't create a session.`),i.jsepOnCreateSession?.(),i.currentContext&&(i.webnnRegisterMLContext(a,i.currentContext),i.currentContext=void 0,i.shouldTransferToMLTensor=!0);let[e,d]=vn(a),f=!!t?.enableGraphCapture,p=[],m=[],h=[],g=[],_=[];for(let t=0;te===`gpu-buffer`||e===`ml-tensor`||e===`ml-tensor-cpu-output`)&&(s=i._OrtCreateBinding(a),s===0&&D(`Can't create IO binding.`),v={handle:s,outputPreferredLocations:_,outputPreferredLocationsEncoded:_.map(e=>e===`ml-tensor-cpu-output`?`ml-tensor`:e).map(e=>It(e))}),_n.set(a,[a,l,u,v,f,!1]),[a,p,m,h,g]}catch(e){throw l.forEach(e=>i._OrtFree(e)),u.forEach(e=>i._OrtFree(e)),s!==0&&i._OrtReleaseBinding(s)!==0&&D(`Can't release IO binding.`),a!==0&&i._OrtReleaseSession(a)!==0&&D(`Can't release session.`),e}finally{i._free(n),o!==0&&i._OrtReleaseSessionOptions(o)!==0&&D(`Can't release session options.`),c.forEach(e=>i._free(e)),i.unmountExternalData?.()}},Sn=e=>{let t=E(),n=_n.get(e);if(!n)throw Error(`cannot release session. invalid session id: ${e}`);let[r,i,a,o,s]=n;o&&(s&&t._OrtClearBoundOutputs(o.handle)!==0&&D(`Can't clear bound outputs.`),t._OrtReleaseBinding(o.handle)!==0&&D(`Can't release IO binding.`)),t.jsepOnReleaseSession?.(e),t.webnnOnReleaseSession?.(e),t.webgpuOnReleaseSession?.(e),i.forEach(e=>t._OrtFree(e)),a.forEach(e=>t._OrtFree(e)),t._OrtReleaseSession(r)!==0&&D(`Can't release session.`),_n.delete(e)},Cn=async(e,t,n,r,i,a,o=!1)=>{if(!e){t.push(0);return}let s=E(),c=s.PTR_SIZE,l=e[0],u=e[1],d=e[3],f=d,p,m;if(l===`string`&&(d===`gpu-buffer`||d===`ml-tensor`))throw Error(`String tensor is not supported on GPU.`);if(o&&d!==`gpu-buffer`)throw Error(`External buffer must be provided for input/output index ${a} when enableGraphCapture is true.`);if(d===`gpu-buffer`){let t=e[2].gpuBuffer;m=jt(kt(l),u);{let e=s.webgpuRegisterBuffer;if(!e)throw Error(`Tensor location "gpu-buffer" is not supported without using WebGPU.`);p=e(t,r)}}else if(d===`ml-tensor`){let t=e[2].mlTensor;m=jt(kt(l),u);let n=s.webnnRegisterMLTensor;if(!n)throw Error(`Tensor location "ml-tensor" is not supported without using WebNN.`);p=n(r,t,kt(l),u)}else{let t=e[2];if(Array.isArray(t)){m=c*t.length,p=s._malloc(m),n.push(p);for(let e=0;es.setValue(g+t*c,e,c===4?`i32`:`i64`));let e=s._OrtCreateTensor(kt(l),p,m,g,u.length,It(f));e===0&&D(`Can't create tensor for input/output. session=${r}, index=${a}.`),t.push(e)}finally{s.stackRestore(h)}},wn=async(e,t,n,r,i,a)=>{let o=E(),s=o.PTR_SIZE,c=_n.get(e);if(!c)throw Error(`cannot run inference. invalid session id: ${e}`);let l=c[0],u=c[1],d=c[2],f=c[3],p=c[4],m=c[5],h=t.length,g=r.length,_=0,v=[],y=[],b=[],x=[],S=[],C=o.stackSave(),ee=o.stackAlloc(h*s),w=o.stackAlloc(h*s),te=o.stackAlloc(g*s),ne=o.stackAlloc(g*s);try{[_,v]=yt(a),De(`wasm prepareInputOutputTensor`);for(let r=0;re*t,1);u=At(a);let _=f?.outputPreferredLocations[r[t]];if(u===`string`){if(_===`gpu-buffer`||_===`ml-tensor`)throw Error(`String tensor is not supported on GPU.`);let e=[];for(let t=0;t0){let t=o.webgpuGetBuffer;if(!t)throw Error(`preferredLocation "gpu-buffer" is not supported without using WebGPU.`);let r=t(d),i=jt(a,g);if(i===void 0||!Pt(u))throw Error(`Unsupported data type: ${u}`);l=!0;{o.webgpuRegisterBuffer(r,e,d);let t=o.webgpuCreateDownloader(r,i,e);C.push([u,h,{gpuBuffer:r,download:async()=>{let e=await t();return new(Mt(u))(e)},dispose:()=>{o._OrtReleaseTensor(n)!==0&&D(`Can't release tensor.`)}},`gpu-buffer`])}}else if(_===`ml-tensor`&&g>0){let t=o.webnnEnsureTensor,r=o.webnnIsGraphInputOutputTypeSupported;if(!t||!r)throw Error(`preferredLocation "ml-tensor" is not supported without using WebNN.`);if(jt(a,g)===void 0||!Ft(u))throw Error(`Unsupported data type: ${u}`);if(!r(e,u,!1))throw Error(`preferredLocation "ml-tensor" for ${u} output is not supported by current WebNN Context.`);let i=await t(e,d,a,h,!1);l=!0,C.push([u,h,{mlTensor:i,download:o.webnnCreateMLTensorDownloader(d,u),dispose:()=>{o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n)}},`ml-tensor`])}else if(_===`ml-tensor-cpu-output`&&g>0){let e=o.webnnCreateMLTensorDownloader(d,u)(),t=C.length;l=!0,re.push((async()=>{let r=[t,await e];return o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n),r})()),C.push([u,h,[],`cpu`])}else{let e=new(Mt(u))(g);new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(o.HEAPU8.subarray(d,d+e.byteLength)),C.push([u,h,e,`cpu`])}}finally{o.stackRestore(a),u===`string`&&d&&o._free(d),l||o._OrtReleaseTensor(n)}}f&&!p&&(o._OrtClearBoundOutputs(f.handle)!==0&&D(`Can't clear bound outputs.`),_n.set(e,[l,u,d,f,p,!1]));for(let[e,t]of await Promise.all(re))C[e][2]=t;return Oe(`wasm ProcessOutputTensor`),C}finally{o.webnnOnRunEnd?.(l),o.stackRestore(C),n.forEach(e=>{e&&e[3]===`gpu-buffer`&&o.webgpuUnregisterBuffer(e[2].gpuBuffer)}),i.forEach(e=>{e&&e[3]===`gpu-buffer`&&o.webgpuUnregisterBuffer(e[2].gpuBuffer)}),y.forEach(e=>o._OrtReleaseTensor(e)),b.forEach(e=>o._OrtReleaseTensor(e)),x.forEach(e=>o._free(e)),_!==0&&o._OrtReleaseRunOptions(_),v.forEach(e=>o._free(e))}},Tn=e=>{let t=E(),n=_n.get(e);if(!n)throw Error(`invalid session id`);let r=n[0],i=t._OrtEndProfiling(r);i===0&&D(`Can't get an profile file name.`),t._OrtFree(i)},En=e=>{let t=[];for(let n of e){let e=n[2];!Array.isArray(e)&&`buffer`in e&&t.push(e.buffer)}return t}}),On,kn,An,jn,Mn,Nn,Pn,Fn,In,Ln,Rn,zn,Bn,Vn,Hn,Un,Wn,Gn,Kn=l(()=>{ze(),Dn(),ht(),ot(),On=()=>!!w.wasm.proxy&&typeof document<`u`,An=!1,jn=!1,Mn=!1,Fn=/* @__PURE__ */ new Map,In=(e,t)=>{let n=Fn.get(e);n?n.push(t):Fn.set(e,[t])},Ln=()=>{if(An||!jn||Mn||!kn)throw Error(`worker not ready`)},Rn=e=>{switch(e.data.type){case`init-wasm`:An=!1,e.data.err?(Mn=!0,Pn[1](e.data.err)):(jn=!0,Pn[0]()),Nn&&=(URL.revokeObjectURL(Nn),void 0);break;case`init-ep`:case`copy-from`:case`create`:case`release`:case`run`:case`end-profiling`:{let t=Fn.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}}},zn=async()=>{if(!jn){if(An)throw Error(`multiple calls to 'initWasm()' detected.`);if(Mn)throw Error(`previous call to 'initWasm()' failed.`);if(An=!0,On())return new Promise((e,t)=>{kn?.terminate(),rt().then(([n,r])=>{try{kn=r,kn.onerror=e=>t(e),kn.onmessage=Rn,Pn=[e,t];let i={type:`init-wasm`,in:w};if(!i.in.wasm.wasmPaths&&n){let e=Xe();e&&(i.in.wasm.wasmPaths=e)}kn.postMessage(i),Nn=n}catch(e){t(e)}},t)});try{await mt(w.wasm),await hn(w),jn=!0}catch(e){throw Mn=!0,e}finally{An=!1}}},Bn=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`init-ep`,[t,n]);let r={type:`init-ep`,in:{epName:e,env:w}};kn.postMessage(r)});await gn(w,e)},Vn=async e=>On()?(Ln(),new Promise((t,n)=>{In(`copy-from`,[t,n]);let r={type:`copy-from`,in:{buffer:e}};kn.postMessage(r,[e.buffer])})):bn(e),Hn=async(e,t)=>{if(On()){if(t?.preferredOutputLocation)throw Error(`session option "preferredOutputLocation" is not supported for proxy.`);return Ln(),new Promise((n,r)=>{In(`create`,[n,r]);let i={type:`create`,in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),kn.postMessage(i,a)})}return xn(e,t)},Un=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`release`,[t,n]);let r={type:`release`,in:e};kn.postMessage(r)});Sn(e)},Wn=async(e,t,n,r,i,a)=>{if(On()){if(n.some(e=>e[3]!==`cpu`))throw Error(`input tensor on GPU is not supported for proxy.`);if(i.some(e=>e))throw Error(`pre-allocated output tensor is not supported for proxy.`);return Ln(),new Promise((i,o)=>{In(`run`,[i,o]);let s=n,c={type:`run`,in:{sessionId:e,inputIndices:t,inputs:s,outputIndices:r,options:a}};kn.postMessage(c,En(s))})}return wn(e,t,n,r,i,a)},Gn=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`end-profiling`,[t,n]);let r={type:`end-profiling`,in:e};kn.postMessage(r)});Tn(e)}}),qn,Jn,Yn,Xn=l(()=>{ze(),Kn(),Lt(),Be(),zt(),qn=(e,t)=>{switch(e.location){case`cpu`:return[e.type,e.dims,e.data,`cpu`];case`gpu-buffer`:return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},`gpu-buffer`];case`ml-tensor`:return[e.type,e.dims,{mlTensor:e.mlTensor},`ml-tensor`];default:throw Error(`invalid data location: ${e.location} for ${t()}`)}},Jn=e=>{switch(e[3]){case`cpu`:return new xe(e[0],e[2],e[1]);case`gpu-buffer`:{let t=e[0];if(!Pt(t))throw Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:i}=e[2];return xe.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:i})}case`ml-tensor`:{let t=e[0];if(!Ft(t))throw Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:i}=e[2];return xe.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:i})}default:throw Error(`invalid data location: ${e[3]}`)}},Yn=class{async fetchModelAndCopyToWasmMemory(e){return Vn(await Rt(e))}async loadModel(e,t){Te();let n;n=typeof e==`string`?await this.fetchModelAndCopyToWasmMemory(e):e,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await Hn(n,t),Ee()}async dispose(){return Un(this.sessionId)}async run(e,t,n){Te();let r=[],i=[];Object.entries(e).forEach(e=>{let t=e[0],n=e[1],a=this.inputNames.indexOf(t);if(a===-1)throw Error(`invalid input '${t}'`);r.push(n),i.push(a)});let a=[],o=[];Object.entries(t).forEach(e=>{let t=e[0],n=e[1],r=this.outputNames.indexOf(t);if(r===-1)throw Error(`invalid output '${t}'`);a.push(n),o.push(r)});let s=r.map((e,t)=>qn(e,()=>`input "${this.inputNames[i[t]]}"`)),c=a.map((e,t)=>e?qn(e,()=>`output "${this.outputNames[o[t]]}"`):null),l=await Wn(this.sessionId,i,s,o,c,n),u={};for(let e=0;e$n,initializeFlags:()=>Qn,wasmBackend:()=>er});var Qn,$n,er,tr=l(()=>{ze(),Kn(),Xn(),Qn=()=>{(typeof w.wasm.initTimeout!=`number`||w.wasm.initTimeout<0)&&(w.wasm.initTimeout=0);let e=w.wasm.simd;if(typeof e!=`boolean`&&e!==void 0&&e!==`fixed`&&e!==`relaxed`&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${e}". Reset it to \`false\` and ignore SIMD feature checking.`),w.wasm.simd=!1),typeof w.wasm.proxy!=`boolean`&&(w.wasm.proxy=!1),typeof w.wasm.trace!=`boolean`&&(w.wasm.trace=!1),typeof w.wasm.numThreads!=`number`||!Number.isInteger(w.wasm.numThreads)||w.wasm.numThreads<=0){if(typeof self<`u`&&!self.crossOriginIsolated)w.wasm.numThreads=1;else{let e=typeof navigator>`u`?c(`node:os`).cpus().length:navigator.hardwareConcurrency;w.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}}},$n=class{async init(e){Qn(),await zn(),await Bn(e)}async createInferenceSessionHandler(e,t){let n=new Yn;return await n.loadModel(e,t),n}},er=new $n});ze(),ze(),ze();var nr=`1.31.0-dev.20260914-8d85527a0`,rr=Re;{let e=(tr(),f(Zn)).wasmBackend;h(`webgpu`,e,5),h(`webnn`,e,5),h(`cpu`,e,10),h(`wasm`,e,10)}Object.defineProperty(w.versions,"web",{value:nr,enumerable:!0});let ir=`warning`;Object.defineProperty({wasm:{},webgl:{},webgpu:{},versions:{common:`1.30.0`},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);ir=e}},get logLevel(){return ir}},"logLevel",{enumerable:!0});const ar=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t===void 0||t.format===void 0?`RGB`:t.format,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat===void 0||t.tensorFormat===void 0?`RGB`:t.tensorFormat,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,sr(o,s)}throw Error(`Can not access image data`)}else if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(sr(e.data,s))}});else throw Error(`Input data provided is not supported - aborted tensor creation`);if(o!==void 0)return sr(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},lr=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new yr({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ur=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yr({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},dr=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yr({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},fr=(e,t,n)=>new yr({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]}),pr=/* @__PURE__ */ new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),mr=/* @__PURE__ */ new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]);let hr=!1;const gr=()=>{if(!hr){hr=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=n!==void 0&&n.from;e&&(pr.set(`int64`,BigInt64Array),mr.set(BigInt64Array,`int64`)),t&&(pr.set(`uint64`,BigUint64Array),mr.set(BigUint64Array,`uint64`)),r?(pr.set(`float16`,n),mr.set(n,`float16`)):pr.set(`float16`,Uint16Array)}},_r=e=>{let t=1;for(let n=0;n{switch(e.location){case`cpu`:return new yr(e.type,e.data,t);case`cpu-pinned`:return new yr({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new yr({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new yr({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new yr({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}};var yr=class{constructor(e,t,n){gr();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=pr.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`){if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=pr.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray){if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`)}else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=mr.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=_r(i);if(this.cpuData&&a!==this.cpuData.length&&(r!==`uint4`&&r!==`int4`||Math.ceil(a/2)!==this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return cr(e,t)}static fromTexture(e,t){return lr(e,t)}static fromGpuBuffer(e,t){return ur(e,t)}static fromMLTensor(e,t){return dr(e,t)}static fromPinnedBuffer(e,t,n){return fr(e,t,n)}toDataURL(e){return ar(this,e)}toImageData(e){return or(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return vr(this,e)}};const br=yr;var xr=Object.defineProperty,Sr=(e,t)=>{for(var n in t)xr(e,n,{get:t[n],enumerable:!0})},Cr={},wr={},Tr={},Er=`4.3.0`,Dr=typeof self<`u`,Or=!Qr(Cr),kr=!Qr(wr),Ar=Dr&&`caches`in self,jr=globalThis.Deno!==void 0;globalThis.Bun;var Mr=jr&&Ar&&!Or,Nr=typeof process<`u`,Pr=Nr&&process?.release?.name===`node`&&!Mr,Fr=typeof window<`u`&&window.document!==void 0,Ir=Dr&&[`DedicatedWorkerGlobalScope`,`ServiceWorkerGlobalScope`,`SharedWorkerGlobalScope`].includes(self.constructor?.name),Lr=Fr||Ir||Mr,Rr=Pr||typeof navigator<`u`&&`gpu`in navigator,zr=typeof navigator<`u`&&`ml`in navigator,Br=typeof crypto<`u`&&typeof crypto.getRandomValues==`function`,Vr=typeof chrome<`u`&&chrome.runtime!==void 0&&typeof chrome.runtime.id==`string`,Hr=typeof ServiceWorkerGlobalScope<`u`&&Dr&&self instanceof ServiceWorkerGlobalScope,Ur=(()=>{if(typeof navigator>`u`)return!1;let e=navigator.userAgent;if(!((navigator.vendor||``).indexOf(`Apple`)>-1&&!e.match(/CriOS|FxiOS|EdgiOS|OPiOS|mercury|brave/i)&&!e.includes(`Chrome`)&&!e.includes(`Android`)))return!1;let t=e.match(/Version\/(\d+)/);return t?parseInt(t[1],10)<26:!1})(),O=Object.freeze({IS_BROWSER_ENV:Fr,IS_WEBWORKER_ENV:Ir,IS_WEB_ENV:Lr,IS_SERVICE_WORKER_ENV:Hr,IS_DENO_WEB_RUNTIME:Mr,IS_WEB_CACHE_AVAILABLE:Ar,IS_WEBGPU_AVAILABLE:Rr,IS_WEBNN_AVAILABLE:zr,IS_SAFARI_BELOW_26:Ur,IS_PROCESS_AVAILABLE:Nr,IS_NODE_ENV:Pr,IS_FS_AVAILABLE:Or,IS_PATH_AVAILABLE:kr,IS_CRYPTO_AVAILABLE:Br,IS_CHROME_AVAILABLE:Vr}),Wr=Or&&kr,Gr=`./`;if(Wr){let e=import.meta.url;e?Gr=wr.dirname(wr.dirname(Tr.fileURLToPath(e))):typeof __dirname<`u`&&(Gr=wr.dirname(__dirname))}var Kr=Wr?wr.join(Gr,`/.cache/`):null,qr=`/models/`,Jr=Wr?wr.join(Gr,qr):qr,Yr=typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):void 0,Xr=Object.freeze({DEBUG:10,INFO:20,WARNING:30,ERROR:40,NONE:50}),Zr=Xr.WARNING,k={version:Er,backends:{onnx:{}},get logLevel(){return Zr},set logLevel(e){Zr=e,k.backends.onnx?.setLogLevel?.(e)},allowRemoteModels:!0,remoteHost:`https://huggingface.co/`,remotePathTemplate:`{model}/resolve/{revision}/`,allowLocalModels:!(Fr||Ir||Mr),localModelPath:Jr,useFS:Or,useBrowserCache:Ar,useFSCache:Or,cacheDir:Kr,useCustomCache:!1,customCache:null,useWasmCache:Ar||Or,cacheKey:`transformers-cache`,experimental_useCrossOriginStorage:!1,fetch:Yr};function Qr(e){return Object.keys(e).length===0}var $r=class{constructor(){let e=function(...t){return e._call(...t)};return Object.setPrototypeOf(e,new.target.prototype)}_call(...e){throw Error(`Must implement _call method in subclass`)}};function ei(e,t){e&&e(t)}var ti=class extends $r{constructor(e,t){super(),this.callback=e,this.files_loading=t,this.loads=/* @__PURE__ */ new Map}_call(e){if(e.status===`progress`){this.files_loading[e.file]={loaded:e.loaded,total:e.total};let t=Object.values(this.files_loading).reduce((e,t)=>e+t.loaded,0),n=Object.values(this.files_loading).reduce((e,t)=>e+t.total,0),r=n>0?t/n*100:0;this.callback({status:`progress_total`,name:e.name,progress:r,loaded:t,total:n,files:structuredClone(this.files_loading)})}this.callback(e)}};function ni(e){return Number.isInteger(e)||typeof e==`bigint`}function ri(e){return e==null||e===-1}function ii(e){let t=[],n=e;for(;Array.isArray(n);)t.push(n.length),n=n[0];return t}function ai(...e){return Array.prototype.concat.apply([],e)}function oi(...e){return e.reduce((e,t)=>e.flatMap(e=>t.map(t=>[e,t])))}function si(e,t){return Math.abs((e+t)%(2*t)-t)}function ci(e,t){return Object.assign({},...t.map(t=>{if(e[t]!==void 0)return{[t]:e[t]}}))}function li(e,t){let n=0;for(let r of e)r===t&&++n;return n}var A={error(...e){k.logLevel<=Xr.ERROR&&console.error(...e)},warn(...e){k.logLevel<=Xr.WARNING&&console.warn(...e)},info(...e){k.logLevel<=Xr.INFO&&console.log(...e)},debug(...e){k.logLevel<=Xr.DEBUG&&console.log(...e)},log(...e){this.info(...e)}},ui=class{constructor(e){this.trie=this._build_trie(e)}_build_trie(e){let t=/* @__PURE__ */ Object.create(null);for(let n of e){let e=t;for(let t=0;tr&&t.push(e.slice(r,i)),t.push(o),i+=o.length,r=i):++i}return r{try{return new RegExp(e,t)}catch(n){if(!(n instanceof SyntaxError))throw n;let r=/* @__PURE__ */ new Map,i=e.replace(/(\\[pP])\{([^}=]+)\}/g,(t,n,i,a)=>{let o=0;for(let t=a-1;t>=0&&e[t]===`\\`;--t)++o;if(o%2==1)return t;let s=r.get(i);if(s===void 0){try{RegExp(`\\p{${i}}`,`u`),s=i}catch{s=`Script=${i}`}r.set(i,s)}return`${n}{${s}}`});if(i===e)throw n;try{return new RegExp(i,t)}catch{throw n}}},pi=e=>e.replace(/ \./g,`.`).replace(/ \?/g,`?`).replace(/ \!/g,`!`).replace(/ ,/g,`,`).replace(/ \' /g,`'`).replace(/ n't/g,`n't`).replace(/ 'm/g,`'m`).replace(/ 's/g,`'s`).replace(/ 've/g,`'ve`).replace(/ 're/g,`'re`),mi=(e,t=!0)=>{if(e.Regex!==void 0)return fi(Qi(Bi(e.Regex)),`gu`);if(e.String!==void 0){let n=$i(e.String);return new RegExp(t?n:`(${n})`,`gu`)}return console.warn(`Unknown pattern type:`,e),null},hi=`\\p{Alphabetic}\\p{M}\\p{Nd}\\p{Pc}`,gi=`${hi}\\u00B2\\u00B3\\u00B9\\u00BC-\\u00BE`,_i=`[${gi}]`,vi=`[^${gi}]`,yi=`(?:(?|[:=!>])/,ji=/^\\([pPxu])\{([^}]*)\}/,Mi=/^\{(\d+(?:,\d*)?|,\d+)\}/,Ni=/^\[:(\^?)(\p{Alphabetic}+):\]/u,Pi=/^\[:\^:\]/,Fi=/^\[(?:\.[^\]]*\.\]|=[^\]]*=\])/,Ii=/^(?:\\x[0-9A-Fa-f]{2}|\\u[0-9A-Fa-f]{4}|\\c[A-Za-z])/,Li=e=>e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`,Ri=(e,t)=>String.fromCodePoint(e.codePointAt(t)),zi=e=>{if(!/^[0-9A-Fa-f]{1,8}$/.test(e))return null;let t=Number.parseInt(e,16);if(t>127)return null;let n=String.fromCharCode(t);return Li(n)?`[${n.toLowerCase()}${n.toUpperCase()}]`:null},Bi=e=>e.replace(/\[\^\(\\s\|\[([^\]]+)\]\)\]/g,`[^()|\\s$1]`),Vi=`[\\s\\S]`,Hi=256,Ui=()=>({fragment:``,alternatives:[],tail:null,contains_complex_set:!1}),Wi=e=>{throw SyntaxError(`Unsupported range with a set-valued character-class operand at index ${e}`)},Gi=(e,t,n,r=!0)=>{e.tail===`range`&&Wi(n),e.alternatives.push(t),e.tail=`set`,e.contains_complex_set=e.contains_complex_set||r},Ki=(e,t,n=!1,r=-1)=>{if(n&&e.tail===`range`&&Wi(r),e.tail===`range`){e.fragment+=t,e.tail=`complete_range`;return}e.fragment+=t,e.tail=n?`set`:`scalar`,e.contains_complex_set=e.contains_complex_set||n},qi=(e,t,n)=>{let r=ji.exec(e.slice(t));if(r){let[e,i,a]=r;return i===`P`&&a===`Word`?Gi(n,`[^${hi}]`,t):Ki(n,i===`x`?`\\u{${a}}`:i===`p`&&a===`Word`?hi:e,i===`p`||i===`P`,t),t+e.length}let i=Ii.exec(e.slice(t));if(i)return Ki(n,i[0]),t+i[0].length;if(t+1>=e.length)throw SyntaxError(`Unterminated escape in character class at index ${t}`);let a=Ri(e,t+1),o=t+1+a.length,s=Di.get(a);if(s!==void 0)return Ki(n,s),o;let c=Ei.get(a);if(c!==void 0)return Gi(n,c,t),o;let l=Ti.get(a),u,d=!1;return l===void 0?u=/[A-Za-z0-9]/.test(a)||ki.includes(a)||a===`-`?`\\${a}`:a:(u=l,d=a!==`a`&&a!==`e`),Ki(n,u,d,t),o},Ji=e=>e.length===1?e[0]:`(?:(?=(?:${e.join(`|`)}))${Vi})`,Yi=e=>Ji(e.fragment.length===0?e.alternatives:[`[${e.fragment}]`,...e.alternatives]),Xi=e=>{let t=fi(`^(?:${e})$`,`u`),n=``;for(let e=0;e<26;++e){let r=String.fromCharCode(65+e),i=String.fromCharCode(97+e),a=t.test(r);a!==t.test(i)&&(n+=a?i:r)}return n},Zi=(e,t,n,r=!0,i=1)=>{if(i>Hi)throw SyntaxError(`Maximum character-class nesting depth of ${Hi} exceeded at index ${t}`);let a=t+1,o=e[a]===`^`;o&&++a;let s=a,c=[Ui()],l=c[0],u=!1;for(;a1?SyntaxError(`Malformed character-class intersection with an empty operand at index ${a}`):SyntaxError(`Empty character class at index ${t}`);let e=c.some(e=>e.contains_complex_set);if(o&&c.length>1&&u)throw SyntaxError(`Unsupported outer-negated character-class intersection with a nested negated class containing a Unicode property, POSIX class, or shorthand at index ${t}`);let i=Yi(c[0]),d=i;if(c.length>1){let e=``;for(let t=1;t0&&(f?(p+=e,d=`[${p}]`):d=Ji([d,`[${e}]`]))}return{atom:o?f?`[^${p}]`:`(?:(?!${d})${Vi})`:d,end:a+1,negated:o,contains_complex_set:e,contains_nested_negated_complex_set:u}}if(e.startsWith(`&&`,a)){if(l.tail===null)throw SyntaxError(`Malformed character-class intersection with an empty operand at index ${a}`);l=Ui(),c.push(l),a+=2;continue}if(d===`[`){let t=e.slice(a);if(Pi.test(t))throw SyntaxError(`Malformed empty negated POSIX character class at index ${a}`);let r=Ni.exec(t);if(r){let[,e,t]=r,i=Oi.get(t);if(i===void 0)throw SyntaxError(`Unsupported POSIX character class "${t}" at index ${a}`);if(n&&e&&(t===`lower`||t===`upper`))throw SyntaxError(`Unsupported negated POSIX ${t} class inside an inline case-insensitive group`);e?Gi(l,`[^${i}]`,a):Ki(l,i,!0,a),a+=r[0].length;continue}if(Fi.test(t))throw SyntaxError(`Unsupported POSIX collating or equivalence bracket expression at index ${a}`);let o=Zi(e,a,n,!1,i+1);Gi(l,o.atom,a,o.contains_complex_set),u||=o.contains_nested_negated_complex_set||o.negated&&o.contains_complex_set,a=o.end;continue}if(d===`-`){let t=e[a+1]===`]`||e.startsWith(`&&`,a+1);l.tail===`set`&&!t&&Wi(a),l.tail===null||l.tail===`range`||l.tail===`complete_range`||t?Ki(l,`\\-`):(l.fragment+=`-`,l.tail=`range`),++a;continue}Ki(l,d===`^`&&l.fragment.length===0?`\\^`:d),a+=d.length}throw SyntaxError(`${c.length>1?`Unterminated character-class intersection`:`Unterminated character class`} at index ${t}`)},Qi=e=>{let t=``,n=-1,r=!1,i=!1,a=[],o=e=>{n=t.length,t+=e,r=!1};for(let s=0;s=e.length){t+=c;break}let a=Ri(e,s+1);if(s+=1+a.length,a===`G`)continue;let l=Di.get(a);if(l!==void 0){o(l);continue}let u=wi.get(a),d;d=u===void 0?/[A-Za-z0-9]/.test(a)||ki.includes(a)?`\\${a}`:a:u,o(d);continue}switch(c){case`[`:{let t=Zi(e,s,i);o(t.atom),s=t.end;continue}case`]`:o(`\\]`),++s;continue;case`.`:o(`[^\\n]`),++s;continue;case`^`:o(xi),++s;continue;case`$`:o(Si),++s;continue;case`(`:{let n=e.startsWith(`(?i:`,s),o=n?`(?i:`:Ai.exec(e.slice(s))?.[0]??`(`,c=n||o===`(?>`?`(?:`:o;a.push([t.length,i]),n&&(i=!0),t+=c,r=!1,s+=o.length;continue}case`)`:t+=c,[n,i]=a.pop()??[-1,!1],r=!1,++s;continue;case`|`:t+=c,n=-1,r=!1,++s;continue;case`{`:{let i=Mi.exec(e.slice(s));if(!i||n<0){o(`\\{`),++s;continue}let a=i[1].startsWith(`,`)?`0${i[1]}`:i[1];s+=i[0].length;let c=e[s];c===`+`||c===`*`?(t=`${t.slice(0,n)}(?:${t.slice(n)}{${a}})${c}`,++s):t+=`{${a}}`,r=!0;continue}case`}`:o(`\\}`),++s;continue;case`+`:if(r){++s;continue}t+=c,r=!0,++s;continue;case`*`:case`?`:t+=c,r=!0,++s;continue;default:o(i&&Li(c)?`[${c.toLowerCase()}${c.toUpperCase()}]`:c),s+=c.length;continue}}return t},$i=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),ea=(e,t,n)=>{let r=[],i=0;for(;ie>=19968&&e<=40959||e>=13312&&e<=19903||e>=131072&&e<=173791||e>=173824&&e<=177983||e>=177984&&e<=178207||e>=178208&&e<=183983||e>=63744&&e<=64255||e>=194560&&e<=195103,na=e=>Number.isInteger(e)||typeof e==`bigint`,ra=e=>{let t=0;for(let n of e)++t;return t},ia=e=>ca(e.toLowerCase()),aa=(...e)=>Array.prototype.concat.apply([],e),oa=e=>new Map(Object.entries(e)),sa=(e,t)=>{let n=[],r=0;for(let i of e.matchAll(t)){let t=i[0];r0&&n.push(t),r=i.index+t.length}return re.replace(/\p{M}/gu,``),la=(e,t,n=[])=>{if(!e||Array.isArray(e)||typeof e!=`object`)return`${t} must be a valid object`;for(let r of n)if(!(r in e))return`${t} must contain a "${r}" property`;return null},ua=e=>e.match(/\S+/g)||[],da=class{constructor(){let e=function(...t){return e._call(...t)};return Object.setPrototypeOf(e,new.target.prototype)}},fa=class extends da{constructor(e){super(),this.config=e}_call(e){return this.normalize(e)}},pa=class extends fa{tokenize_chinese_chars(e){let t=[];for(let n=0;ne.normalize(`NFKC`)).join(`~`):e.normalize(`NFKC`),e}},ha=class extends fa{constructor(e){super(e),this.normalizers=(e.normalizers??[]).map(e=>Da(e))}normalize(e){return this.normalizers.reduce((e,t)=>t?t.normalize(e):e,e)}},ga=class extends fa{constructor(e){super(e),this.pattern=mi(this.config.pattern??{})}normalize(e){return this.pattern===null?e:e.replaceAll(this.pattern,this.config.content??``)}},_a=class extends fa{constructor(){super(...arguments),this.form=`NFC`}normalize(e){return e=e.normalize(this.form),e}},va=class extends _a{constructor(){super(...arguments),this.form=`NFC`}},ya=class extends _a{constructor(){super(...arguments),this.form=`NFD`}},ba=class extends _a{constructor(){super(...arguments),this.form=`NFKC`}},xa=class extends _a{constructor(){super(...arguments),this.form=`NFKD`}},Sa=class extends fa{normalize(e){return this.config.strip_left&&this.config.strip_right?e=e.trim():(this.config.strip_left&&(e=e.trimStart()),this.config.strip_right&&(e=e.trimEnd())),e}},Ca=class extends fa{normalize(e){return ca(e)}},wa=class extends fa{normalize(e){return e.toLowerCase()}},Ta=class extends fa{normalize(e){return e=this.config.prepend+e,e}};function Ea(e){if(e===null)return null;switch(e.type){case`BertNormalizer`:return new pa(e);case`Precompiled`:return new ma(e);case`Sequence`:return new ha(e);case`Replace`:return new ga(e);case`NFC`:return new va(e);case`NFD`:return new ya(e);case`NFKC`:return new ba(e);case`NFKD`:return new xa(e);case`Strip`:return new Sa(e);case`StripAccents`:return new Ca(e);case`Lowercase`:return new wa(e);case`Prepend`:return new Ta(e);default:throw Error(`Unknown Normalizer type: ${e.type}`)}}var Da=Ea,Oa=class extends da{pre_tokenize(e,t){return(Array.isArray(e)?e.map(e=>this.pre_tokenize_text(e,t)):this.pre_tokenize_text(e,t)).flat()}_call(e,t){return this.pre_tokenize(e,t)}},ka=(()=>{let e=[...Array.from({length:94},(e,t)=>t+33),...Array.from({length:12},(e,t)=>t+161),...Array.from({length:82},(e,t)=>t+174)],t=e.slice(),n=0;for(let r=0;r<256;++r)e.includes(r)||(e.push(r),t.push(256+n),n+=1);let r=t.map(e=>String.fromCharCode(e));return Object.fromEntries(e.map((e,t)=>[e,r[t]]))})(),Aa=(e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[t,e])))(ka),ja=`\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E`,Ma=class extends Oa{constructor(e){super(),this.config=e,this.add_prefix_space=this.config.add_prefix_space??!1,this.trim_offsets=this.config.trim_offsets??!1,this.use_regex=this.config.use_regex??!0,this.pattern=/'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu,this.byte_encoder=ka,this.text_encoder=new TextEncoder}pre_tokenize_text(e,t){return this.add_prefix_space&&!e.startsWith(` `)&&(e=` `+e),(this.use_regex?e.match(this.pattern)||[]:[e]).map(e=>Array.from(this.text_encoder.encode(e),e=>this.byte_encoder[e]).join(``))}},Na=class extends Oa{pre_tokenize_text(e,t){return e.match(/\w+|[^\w\s]+/g)||[]}},Pa=class extends Oa{constructor(e){super(),this.replacement=e.replacement??`▁`,this.str_rep=e.str_rep||this.replacement,this.prepend_scheme=e.prepend_scheme??`always`}pre_tokenize_text(e,t){let{section_index:n=void 0}=t??{},r=e.replaceAll(` `,this.str_rep);return!r.startsWith(this.replacement)&&(this.prepend_scheme===`always`||this.prepend_scheme===`first`&&n===0)&&(r=this.str_rep+r),[r]}},Fa=class extends Oa{constructor(e){super(),this.config=e,this.pattern=mi(this.config.pattern??{},this.config.invert??!0)}pre_tokenize_text(e){return this.pattern===null?[]:this.config.invert?(e.match(this.pattern)||[]).filter(e=>e):this.config.behavior?.toLowerCase()===`removed`?e.split(this.pattern).filter(e=>e):sa(e,this.pattern)}},Ia=class extends Oa{constructor(e){super(),this.config=e,this.pattern=RegExp(`[^${ja}]+|[${ja}]+`,`gu`)}pre_tokenize_text(e){return e.match(this.pattern)||[]}},La=class extends Oa{constructor(e){super(),this.config=e;let t=`[^\\d]+|\\d${this.config.individual_digits?``:`+`}`;this.pattern=new RegExp(t,`gu`)}pre_tokenize_text(e){return e.match(this.pattern)||[]}},Ra=class extends Oa{constructor(){super(),this.pattern=RegExp(`[^\\s${ja}]+|[${ja}]`,`gu`)}pre_tokenize_text(e,t){return e.trim().match(this.pattern)||[]}},za=class extends Oa{constructor(e){super(),this.config=e,this.pattern=mi(this.config.pattern??{}),this.content=this.config.content??``}pre_tokenize_text(e){return this.pattern===null?[e]:[e.replaceAll(this.pattern,this.config.content??``)]}},Ba=class extends Oa{constructor(e){super(),this.tokenizers=(e.pretokenizers??[]).map(e=>Wa(e))}pre_tokenize_text(e,t){return this.tokenizers.reduce((e,n)=>n?n.pre_tokenize(e,t):e,[e])}},Va=class extends Oa{pre_tokenize_text(e){return ua(e)}},Ha=class extends Oa{constructor(e){super(),this.config=e,this._length=e.length}pre_tokenize_text(e){let t=[];for(let n=0;nthis.max_input_chars_per_word){t.push(this.unk_token);continue}let r=!1,i=0,a=[];for(;i0&&(r=this.config.continuing_subword_prefix+r),this.tokens_to_ids.has(r)){n=r;break}--t}if(n===null){r=!0;break}a.push(n),i=t}r?t.push(this.unk_token):t.push(...a)}return t}},qa=class e{constructor(e,t){this.is_leaf=e,this.children=t}static default(){return new e(!1,/* @__PURE__ */ new Map)}},Ja=class{constructor(){this.root=qa.default()}extend(e){for(let t of e)this.push(t)}push(e){let t=this.root;for(let n of e){let e=t.children.get(n);e===void 0&&(e=qa.default(),t.children.set(n,e)),t=e}t.is_leaf=!0}*common_prefix_search(e,t=0){let n=this.root;if(n===void 0)return;let r=``;for(let i=t;i[]),this.end_nodes=Array.from({length:this.len+1},()=>[]);let r=new Ya(this.bos_token_id??0,0,0,0,0),i=new Ya(this.eos_token_id??0,1,this.len,0,0);this.nodes.push(r.clone()),this.nodes.push(i.clone()),this.begin_nodes[this.len].push(i),this.end_nodes[0].push(r)}insert(e,t,n,r){let i=this.nodes.length,a=new Ya(r,i,e,t,n);this.begin_nodes[e].push(a),this.end_nodes[e+t].push(a),this.nodes.push(a)}viterbi(){let e=this.len,t=0;for(;t<=e;){if(this.begin_nodes[t].length==0)return[];for(let e of this.begin_nodes[t]){e.prev=null;let n=0,r=null;for(let i of this.end_nodes[t]){let t=i.backtrace_score+e.score;(r===null||t>n)&&(r=i.clone(),n=t)}if(r!==null)e.prev=r,e.backtrace_score=n;else return[]}++t}let n=[],r=this.begin_nodes[e][0].prev;if(r===null)return[];let i=r.clone();for(;i.prev!==null;)n.push(i.clone()),i=i.clone().prev.clone();return n.reverse(),n}piece(e){return this.chars.slice(e.pos,e.pos+e.length).join(``)}tokens(){return this.viterbi().map(e=>this.piece(e))}token_ids(){return this.viterbi().map(e=>e.token_id)}};function Za(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;r[e,t])),this.bos_token=` `,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=t,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.unk_token=this.vocab[this.unk_token_id],this.min_score=Za(this.scores)[0],this.unk_score=this.min_score-10,this.scores[this.unk_token_id]=this.unk_score,this.trie=new Ja,this.trie.extend(this.vocab),this.fuse_unk=!0}populate_nodes(e){let t=e.chars,n=0;for(;ne>t,t=1/0){this._heap=[],this._comparator=e,this._max_size=t}get size(){return this._heap.length}is_empty(){return this.size===0}peek(){return this._heap[0]}push(...e){return this.extend(e)}extend(e){for(let t of e)if(this.size0&&this._swap(0,t),this._heap.pop(),this._sift_down(),e}replace(e){let t=this.peek();return this._heap[0]=e,this._sift_down(),t}_parent(e){return(e+1>>>1)-1}_left(e){return(e<<1)+1}_right(e){return e+1<<1}_greater(e,t){return this._comparator(this._heap[e],this._heap[t])}_swap(e,t){let n=this._heap[e];this._heap[e]=this._heap[t],this._heap[t]=n}_sift_up(){this._sift_up_from(this.size-1)}_sift_up_from(e){for(;e>0&&this._greater(e,this._parent(e));)this._swap(e,this._parent(e)),e=this._parent(e)}_sift_down(){let e=0;for(;this._left(e)this.capacity&&this.cache.delete(this.cache.keys().next().value)}clear(){this.cache.clear()}},to=class extends Ga{constructor(e){super(e),this.tokens_to_ids=oa(e.vocab),this.unk_token_id=this.tokens_to_ids.get(e.unk_token),this.unk_token=e.unk_token,this.vocab=Array(this.tokens_to_ids.size);for(let[e,t]of this.tokens_to_ids)this.vocab[t]=e;let t=Array.isArray(e.merges[0]);this.merges=t?e.merges:e.merges.map(e=>e.split(` `,2)),this.bpe_ranks=new Map(this.merges.map((e,t)=>[JSON.stringify(e),t])),this.end_of_word_suffix=e.end_of_word_suffix,this.continuing_subword_suffix=e.continuing_subword_suffix??null,this.byte_fallback=this.config.byte_fallback??!1,this.byte_fallback&&(this.text_encoder=new TextEncoder),this.ignore_merges=this.config.ignore_merges??!1,this.max_length_to_cache=256,this.cache_capacity=1e4,this.cache=new eo(this.cache_capacity)}clear_cache(){this.cache.clear()}bpe(e){if(e.length===0)return[];let t=this.cache.get(e);if(t!==void 0)return t;let n=Array.from(e);this.end_of_word_suffix&&(n[n.length-1]+=this.end_of_word_suffix);let r=[];if(n.length>1){let e=new $a((e,t)=>e.score`<0x${e.toString(16).toUpperCase().padStart(2,`0`)}>`);e.every(e=>this.tokens_to_ids.has(e))?t.push(...e):this.unk_token!=null&&t.push(this.unk_token)}else this.unk_token!=null&&t.push(this.unk_token)}return t}},no=class extends Ga{constructor(e,t){super(e);let n=e.vocab;this.tokens_to_ids=oa(t.target_lang?n[t.target_lang]:n),this.bos_token=t.bos_token,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=t.eos_token,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.pad_token=t.pad_token,this.pad_token_id=this.tokens_to_ids.get(this.pad_token),this.unk_token=t.unk_token,this.unk_token_id=this.tokens_to_ids.get(this.unk_token),this.vocab=Array(this.tokens_to_ids.size);for(let[e,t]of this.tokens_to_ids)this.vocab[t]=e}encode(e){return e}};function ro(e,t){switch(e.type){case`WordPiece`:return new Ka(e);case`Unigram`:return new Qa(e,t.eos_token);case`BPE`:return new to(e);default:if(e.vocab)return Array.isArray(e.vocab)?new Qa(e,t.eos_token):Object.hasOwn(e,`continuing_subword_prefix`)&&Object.hasOwn(e,`unk_token`)?Object.hasOwn(e,`merges`)?new to(e):new Ka(e):new no(e,{target_lang:t.target_lang,bos_token:t.bos_token,eos_token:t.eos_token,pad_token:t.pad_token,unk_token:t.unk_token});throw Error(`Unknown TokenizerModel type: ${e?.type}`)}}var io=ro,ao=class extends da{constructor(e){super(),this.config=e}_call(e,...t){return this.post_process(e,...t)}},oo=class extends ao{post_process(e,t=null,n=!0){let r=t===null?this.config.single:this.config.pair,i=[],a=[];for(let o of r)`SpecialToken`in o?n&&(i.push(o.SpecialToken.id),a.push(o.SpecialToken.type_id)):`Sequence`in o&&(o.Sequence.id===`A`?(i=aa(i,e),a=aa(a,Array(e.length).fill(o.Sequence.type_id))):o.Sequence.id===`B`&&(i=aa(i,t),a=aa(a,Array(t.length).fill(o.Sequence.type_id))));return{tokens:i,token_type_ids:a}}},so=class extends ao{post_process(e,t=null){return{tokens:e,tokens_pair:t}}},co=class extends ao{constructor(e){super(e),this.sep=e.sep,this.cls=e.cls}post_process(e,t=null,n=!0){n&&(e=aa([this.cls[0]],e,[this.sep[0]]));let r=Array(e.length).fill(0);if(t){let i=[],a=n?[this.sep[0]]:[];e=aa(e,i,t,a),r=aa(r,Array(t.length+i.length+a.length).fill(1))}return{tokens:e,token_type_ids:r}}},lo=class extends ao{constructor(e){super(e),this.sep=e.sep,this.cls=e.cls}post_process(e,t,n=!0){n&&(e=aa([this.cls[0]],e,[this.sep[0]]));let r=Array(e.length).fill(0);if(t){let i=n?[this.sep[0]]:[],a=n?[this.sep[0]]:[];e=aa(e,i,t,a),r=aa(r,Array(t.length+i.length+a.length).fill(1))}return{tokens:e,token_type_ids:r}}},uo=class extends ao{constructor(e){super(e),this.processors=(e.processors??[]).map(e=>po(e))}post_process(e,t=null,n=!0){let r={tokens:e,tokens_pair:t};for(let e of this.processors)r=e.post_process(r.tokens,r.tokens_pair,n);return r}};function fo(e){if(e===null)return null;switch(e.type){case`TemplateProcessing`:return new oo(e);case`ByteLevel`:return new so(e);case`BertProcessing`:return new co(e);case`RobertaProcessing`:return new lo(e);case`Sequence`:return new uo(e);default:throw Error(`Unknown PostProcessor type: ${e.type}`)}}var po=fo,mo=class extends da{constructor(e){super(),this.config=e,this.added_tokens=[],this.end_of_word_suffix=null,this.trim_offsets=`trim_offsets`in e&&e.trim_offsets}_call(e){return this.decode(e)}decode(e){return this.decode_chain(e).join(``)}},ho=class extends mo{constructor(e){super(e),this.byte_decoder=Aa,this.text_decoder=new TextDecoder(`utf-8`,{fatal:!1,ignoreBOM:!0}),this.end_of_word_suffix=null}convert_tokens_to_string(e){let t=e.join(``),n=new Uint8Array([...t].map(e=>this.byte_decoder[e]));return this.text_decoder.decode(n)}decode_chain(e){let t=[],n=[];for(let r of e)this.added_tokens.find(e=>e.content===r)===void 0?n.push(r):(n.length>0&&(t.push(this.convert_tokens_to_string(n)),n=[]),t.push(r));return n.length>0&&t.push(this.convert_tokens_to_string(n)),t}},go=class extends mo{constructor(e){super(e),this.cleanup=e.cleanup}decode_chain(e){return e.map((e,t)=>{if(t!==0){let t=this.config.prefix;e=t&&e.startsWith(t)?e.replace(t,``):` `+e}return this.cleanup&&(e=pi(e)),e})}},_o=class extends mo{constructor(e){super(e),this.replacement=e.replacement??`▁`}decode_chain(e){let t=[];for(let n=0;nt.replaceAll(this.suffix,n===e.length-1?``:` `))}},yo=class extends mo{constructor(e){super(e),this.pad_token=e.pad_token??``,this.word_delimiter_token=e.word_delimiter_token??``,this.cleanup=e.cleanup}convert_tokens_to_string(e){if(e.length===0)return``;let t=[e[0]];for(let n=1;ne!==this.pad_token).join(``);return this.cleanup&&(n=pi(n).replaceAll(this.word_delimiter_token,` `).trim()),n}decode_chain(e){return[this.convert_tokens_to_string(e)]}},bo=class extends mo{constructor(e){super(e),this.decoders=(e.decoders??[]).map(e=>Eo(e))}decode_chain(e){return this.decoders.reduce((e,t)=>t.decode_chain(e),e)}},xo=class extends mo{constructor(e){super(e),this.pattern=mi(this.config.pattern)}decode_chain(e){let t=this.config.content??``,n=this.pattern;return n===null?e:e.map(e=>e.replaceAll(n,t))}},So=class extends mo{decode_chain(e){return[e.join(``)]}},Co=class extends mo{constructor(e){super(e),this.content=e.content??``,this.start=e.start??0,this.stop=e.stop??0}decode_chain(e){return e.map(e=>{let t=0;for(let n=0;n`)){let t=parseInt(r.slice(3,5),16);isNaN(t)||(e=t)}if(e!==null)n.push(e);else{if(n.length>0){let e=this.text_decoder.decode(Uint8Array.from(n));t.push(e),n=[]}t.push(r)}}if(n.length>0){let e=this.text_decoder.decode(Uint8Array.from(n));t.push(e),n=[]}return t}};function To(e){if(e===null)return null;switch(e.type){case`ByteLevel`:return new ho(e);case`WordPiece`:return new go(e);case`Metaspace`:return new _o(e);case`BPEDecoder`:return new vo(e);case`CTC`:return new yo(e);case`Sequence`:return new bo(e);case`Replace`:return new xo(e);case`Fuse`:return new So(e);case`Strip`:return new Co(e);case`ByteFallback`:return new wo(e);default:throw Error(`Unknown Decoder type: ${e.type}`)}}var Eo=To,Do=class{constructor(e,t){let n=la(e,`Tokenizer`,[`model`,`decoder`,`post_processor`,`pre_tokenizer`,`normalizer`]);if(n)throw Error(n);let r=la(t,`Config`);if(r)throw Error(r);this.tokenizer=e,this.config=t,this.normalizer=Da(this.tokenizer.normalizer),this.pre_tokenizer=Wa(this.tokenizer.pre_tokenizer),this.model=io(this.tokenizer.model,this.config),this.post_processor=po(this.tokenizer.post_processor),this.decoder=Eo(this.tokenizer.decoder),this.special_tokens=[],this.all_special_ids=[],this.added_tokens=[];let i=[],a=[];this.added_tokens_map=/* @__PURE__ */ new Map;for(let e of this.tokenizer.added_tokens){let t=new di(e);if(this.added_tokens.push(t),this.model.tokens_to_ids.set(t.content,t.id),this.model.vocab[t.id]=t.content,t.special&&(this.special_tokens.push(t.content),this.all_special_ids.push(t.id)),this.added_tokens_map.set(t.content,t),t.normalized&&this.normalizer!==null){let e=this.normalizer(t.content);a.push(e),this.added_tokens_map.set(e,t)}else i.push(t.content)}(this.config.additional_special_tokens??[]).forEach(e=>{this.special_tokens.includes(e)||this.special_tokens.push(e)}),this.decoder&&(this.decoder.added_tokens=this.added_tokens,this.decoder.end_of_word_suffix=this.model.end_of_word_suffix),this.splitter_unnormalized=new ui(i),this.splitter_normalized=new ui(a),this.remove_space=this.config.remove_space,this.clean_up_tokenization_spaces=this.config.clean_up_tokenization_spaces??!0,this.do_lowercase_and_remove_accent=this.config.do_lowercase_and_remove_accent??!1}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{tokens:i,token_type_ids:a}=this.tokenize_helper(e,{text_pair:t,add_special_tokens:n}),o=i.map(e=>this.added_tokens_map.get(e)?.id??this.model.tokens_to_ids.get(e)??this.model.unk_token_id),s={ids:o,tokens:i,attention_mask:Array(o.length).fill(1)};return r&&a&&(s.token_type_ids=a),s}decode(e,t={}){if(!Array.isArray(e)||e.length===0||!na(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);let n=e.map(e=>this.model.vocab[Number(e)]??this.model.unk_token);t.skip_special_tokens&&(n=n.filter(e=>!this.special_tokens.includes(e)));let r=this.decoder?this.decoder(n):n.join(` `);return this.decoder&&this.decoder.end_of_word_suffix&&(r=r.replaceAll(this.decoder.end_of_word_suffix,` `),t.skip_special_tokens&&(r=r.trim())),(t.clean_up_tokenization_spaces??this.clean_up_tokenization_spaces)&&(r=pi(r)),r}tokenize(e,{text_pair:t=null,add_special_tokens:n=!1}={}){return this.tokenize_helper(e,{text_pair:t,add_special_tokens:n}).tokens}encode_text(e){if(e===null)return null;let t=this.splitter_unnormalized.split(e);return t.forEach((e,n)=>{let r=this.added_tokens_map.get(e);r&&(r.lstrip&&n>0&&(t[n-1]=t[n-1].trimEnd()),r.rstrip&&n{if(e.length===0)return[];if(this.added_tokens_map.has(e))return[e];if(this.remove_space===!0&&(e=e.trim().split(/\s+/).join(` `)),this.do_lowercase_and_remove_accent&&(e=ia(e)),this.normalizer!==null&&(e=this.normalizer(e)),e.length===0)return[];let n=this.splitter_normalized.split(e);return n.forEach((e,t)=>{let r=this.added_tokens_map.get(e);r&&(r.lstrip&&t>0&&(n[t-1]=n[t-1].trimEnd()),r.rstrip&&t{if(e.length===0)return[];if(this.added_tokens_map.has(e))return[e];let n=this.pre_tokenizer===null?[e]:this.pre_tokenizer(e,{section_index:t});return this.model(n)})})}tokenize_helper(e,{text_pair:t=null,add_special_tokens:n=!0}){let r=this.encode_text(e),i=this.encode_text(t||null);return this.post_processor?this.post_processor(r,i,n):{tokens:aa(r??[],i??[])}}token_to_id(e){return this.model.tokens_to_ids.get(e)}id_to_token(e){return this.model.vocab[e]}get_added_tokens_decoder(){let e=/* @__PURE__ */ new Map;for(let t of this.added_tokens)e.set(t.id,t);return e}get_vocab(e=!0){let t=/* @__PURE__ */ new Map;for(let n=0;nt in e?Oo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ao=(e,t,n)=>(ko(e,typeof t==`symbol`?t:t+``,n),n),j=Object.freeze({Text:`Text`,NumericLiteral:`NumericLiteral`,StringLiteral:`StringLiteral`,Identifier:`Identifier`,Equals:`Equals`,OpenParen:`OpenParen`,CloseParen:`CloseParen`,OpenStatement:`OpenStatement`,CloseStatement:`CloseStatement`,OpenExpression:`OpenExpression`,CloseExpression:`CloseExpression`,OpenSquareBracket:`OpenSquareBracket`,CloseSquareBracket:`CloseSquareBracket`,OpenCurlyBracket:`OpenCurlyBracket`,CloseCurlyBracket:`CloseCurlyBracket`,Comma:`Comma`,Dot:`Dot`,Colon:`Colon`,Pipe:`Pipe`,CallOperator:`CallOperator`,AdditiveBinaryOperator:`AdditiveBinaryOperator`,MultiplicativeBinaryOperator:`MultiplicativeBinaryOperator`,ExponentiationBinaryOperator:`ExponentiationBinaryOperator`,ComparisonBinaryOperator:`ComparisonBinaryOperator`,UnaryOperator:`UnaryOperator`,Comment:`Comment`}),jo=class{constructor(e,t){this.value=e,this.type=t}};function Mo(e){return/\w/.test(e)}function No(e){return/[0-9]/.test(e)}function Po(e){return/\s/.test(e)}var Fo=[[`{%`,j.OpenStatement],[`%}`,j.CloseStatement],[`{{`,j.OpenExpression],[`}}`,j.CloseExpression],[`(`,j.OpenParen],[`)`,j.CloseParen],[`{`,j.OpenCurlyBracket],[`}`,j.CloseCurlyBracket],[`[`,j.OpenSquareBracket],[`]`,j.CloseSquareBracket],[`,`,j.Comma],[`.`,j.Dot],[`:`,j.Colon],[`|`,j.Pipe],[`<=`,j.ComparisonBinaryOperator],[`>=`,j.ComparisonBinaryOperator],[`==`,j.ComparisonBinaryOperator],[`!=`,j.ComparisonBinaryOperator],[`<`,j.ComparisonBinaryOperator],[`>`,j.ComparisonBinaryOperator],[`+`,j.AdditiveBinaryOperator],[`-`,j.AdditiveBinaryOperator],[`~`,j.AdditiveBinaryOperator],[`**`,j.ExponentiationBinaryOperator],[`*`,j.MultiplicativeBinaryOperator],[`//`,j.MultiplicativeBinaryOperator],[`/`,j.MultiplicativeBinaryOperator],[`%`,j.MultiplicativeBinaryOperator],[`=`,j.Equals]],Io=/* @__PURE__ */ new Map([[`n`,` -`],[`t`,` `],[`r`,`\r`],[`b`,`\b`],[`f`,`\f`],[`v`,`\v`],[`'`,`'`],[`"`,`"`],[`\\`,`\\`]]);function Lo(e,t={}){return e.endsWith(` -`)&&(e=e.slice(0,-1)),t.lstrip_blocks&&(e=e.replace(/^[ \t]*({[#%-])/gm,`$1`)),t.trim_blocks&&(e=e.replace(/([#%-]})\n/g,`$1`)),e.replace(/(\s*){%(-?)\s*(?:end)?generation\s*(-?)%}(\s*)/gs,(e,t,n,r,i)=>(n?``:t)+(r?``:i))}function Ro(e,t={}){let n=[],r=Lo(e,t),i=0,a=0,o=e=>{let t=``;for(;e(r[i]);){if(r[i]===`\\`){if(++i,i>=r.length)throw SyntaxError(`Unexpected end of input`);let e=r[i++],n=Io.get(e);if(n===void 0)throw SyntaxError(`Unexpected escaped character: ${e}`);t+=n;continue}if(t+=r[i++],i>=r.length)throw SyntaxError(`Unexpected end of input`)}return t},s=()=>{let e=n.at(-1);e&&e.type===j.Text&&(e.value=e.value.trimEnd(),e.value===``&&n.pop())},c=()=>{for(;i0){n.push(new jo(e,j.Text));continue}}if(r[i]===`{`&&r[i+1]===`#`){i+=2;let e=r[i]===`-`;e&&++i;let t=``;for(;r[i]!==`#`||r[i+1]!==`}`;){if(i+2>=r.length)throw SyntaxError(`Missing end of comment tag`);t+=r[i++]}let a=t.endsWith(`-`);a&&(t=t.slice(0,-1)),e&&s(),n.push(new jo(t,j.Comment)),i+=2,a&&c();continue}if(r.slice(i,i+3)===`{%-`){s(),n.push(new jo(`{%`,j.OpenStatement)),i+=3;continue}if(r.slice(i,i+3)===`{{-`){s(),n.push(new jo(`{{`,j.OpenExpression)),a=0,i+=3;continue}if(o(Po),r.slice(i,i+3)===`-%}`){n.push(new jo(`%}`,j.CloseStatement)),i+=3,c();continue}if(r.slice(i,i+3)===`-}}`){n.push(new jo(`}}`,j.CloseExpression)),i+=3,c();continue}let t=r[i];if(t===`-`||t===`+`){let e=n.at(-1)?.type;if(e===j.Text||e===void 0)throw SyntaxError(`Unexpected character: ${t}`);switch(e){case j.Identifier:case j.NumericLiteral:case j.StringLiteral:case j.CloseParen:case j.CloseSquareBracket:break;default:{++i;let e=o(No);if(e.length>0&&r[i]===`.`&&No(r[i+1])){++i;let t=o(No);e=`${e}.${t}`}n.push(new jo(`${t}${e}`,e.length>0?j.NumericLiteral:j.UnaryOperator));continue}}}for(let[e,t]of Fo)if(!(e===`}}`&&a>0)&&r.slice(i,i+e.length)===e){n.push(new jo(e,t)),t===j.OpenExpression?a=0:t===j.OpenCurlyBracket?++a:t===j.CloseCurlyBracket&&--a,i+=e.length;continue main}if(t===`'`||t===`"`){++i;let e=o(e=>e!==t);n.push(new jo(e,j.StringLiteral)),++i;continue}if(No(t)){let e=o(No);if(n.at(-1)?.type!==j.Dot&&r[i]===`.`&&No(r[i+1])){++i;let t=o(No);e=`${e}.${t}`}n.push(new jo(e,j.NumericLiteral));continue}if(Mo(t)){let e=o(Mo);n.push(new jo(e,j.Identifier));continue}throw SyntaxError(`Unexpected character: ${t}`)}return n}var zo=class{type=`Statement`},Bo=class extends zo{constructor(e){super(),this.body=e}type=`Program`},Vo=class extends zo{constructor(e,t,n){super(),this.test=e,this.body=t,this.alternate=n}type=`If`},Ho=class extends zo{constructor(e,t,n,r){super(),this.loopvar=e,this.iterable=t,this.body=n,this.defaultBlock=r}type=`For`},Uo=class extends zo{type=`Break`},Wo=class extends zo{type=`Continue`},Go=class extends zo{constructor(e,t,n){super(),this.assignee=e,this.value=t,this.body=n}type=`Set`},Ko=class extends zo{constructor(e,t,n){super(),this.name=e,this.args=t,this.body=n}type=`Macro`},qo=class extends zo{constructor(e){super(),this.value=e}type=`Comment`},Jo=class extends zo{type=`Expression`},Yo=class extends Jo{constructor(e,t,n){super(),this.object=e,this.property=t,this.computed=n}type=`MemberExpression`},Xo=class extends Jo{constructor(e,t){super(),this.callee=e,this.args=t}type=`CallExpression`},Zo=class extends Jo{constructor(e){super(),this.value=e}type=`Identifier`},Qo=class extends Jo{constructor(e){super(),this.value=e}type=`Literal`},$o=class extends Qo{type=`IntegerLiteral`},es=class extends Qo{type=`FloatLiteral`},ts=class extends Qo{type=`StringLiteral`},ns=class extends Qo{type=`ArrayLiteral`},rs=class extends Qo{type=`TupleLiteral`},is=class extends Qo{type=`ObjectLiteral`},as=class extends Jo{constructor(e,t,n){super(),this.operator=e,this.left=t,this.right=n}type=`BinaryExpression`},os=class extends Jo{constructor(e,t){super(),this.operand=e,this.filter=t}type=`FilterExpression`},ss=class extends zo{constructor(e,t){super(),this.filter=e,this.body=t}type=`FilterStatement`},cs=class extends Jo{constructor(e,t){super(),this.lhs=e,this.test=t}type=`SelectExpression`},ls=class extends Jo{constructor(e,t,n){super(),this.operand=e,this.negate=t,this.test=n}type=`TestExpression`},us=class extends Jo{constructor(e,t){super(),this.operator=e,this.argument=t}type=`UnaryExpression`},ds=class extends Jo{constructor(e=void 0,t=void 0,n=void 0){super(),this.start=e,this.stop=t,this.step=n}type=`SliceExpression`},fs=class extends Jo{constructor(e,t){super(),this.key=e,this.value=t}type=`KeywordArgumentExpression`},ps=class extends Jo{constructor(e){super(),this.argument=e}type=`SpreadExpression`},ms=class extends Jo{constructor(e){super(),this.argument=e}type=`KeywordSpreadExpression`},hs=class extends zo{constructor(e,t,n){super(),this.call=e,this.callerArgs=t,this.body=n}type=`CallStatement`},gs=class extends Jo{constructor(e,t,n){super(),this.condition=e,this.trueExpr=t,this.falseExpr=n}type=`Ternary`};function _s(e){let t=new Bo([]),n=0;function r(t,r){let i=e[n++];if(!i||i.type!==t)throw Error(`Parser Error: ${r}. ${i.type} !== ${t}.`);return i}function i(e){if(!c(e))throw SyntaxError(`Expected ${e}`);++n}function a(){switch(e[n].type){case j.Comment:return new qo(e[n++].value);case j.Text:return l();case j.OpenStatement:return u();case j.OpenExpression:return d();default:throw SyntaxError(`Unexpected token type: ${e[n].type}`)}}function o(...t){return n+t.length<=e.length&&t.every((t,r)=>t===e[n+r].type)}function s(...t){return e[n]?.type===j.OpenStatement&&e[n+1]?.type===j.Identifier&&t.includes(e[n+1]?.value)}function c(...t){return n+t.length<=e.length&&t.every((t,r)=>e[n+r].type===`Identifier`&&t===e[n+r].value)}function l(){return new ts(r(j.Text,`Expected text token`).value)}function u(){if(r(j.OpenStatement,`Expected opening statement token`),e[n].type!==j.Identifier)throw SyntaxError(`Unknown statement, got ${e[n].type}`);let t=e[n].value,c;switch(t){case`set`:++n,c=f();break;case`if`:++n,c=p(),r(j.OpenStatement,`Expected {% token`),i(`endif`),r(j.CloseStatement,`Expected %} token`);break;case`macro`:++n,c=m(),r(j.OpenStatement,`Expected {% token`),i(`endmacro`),r(j.CloseStatement,`Expected %} token`);break;case`for`:++n,c=g(),r(j.OpenStatement,`Expected {% token`),i(`endfor`),r(j.CloseStatement,`Expected %} token`);break;case`call`:{++n;let e=null;o(j.OpenParen)&&(e=te(`parameters`));let t=ue();if(t.type!==`Identifier`)throw SyntaxError(`Expected identifier following call statement`);let l=te(`call`);r(j.CloseStatement,`Expected closing statement token`);let u=[];for(;!s(`endcall`);)u.push(a());r(j.OpenStatement,`Expected '{%'`),i(`endcall`),r(j.CloseStatement,`Expected closing statement token`),c=new hs(new Xo(t,l),e,u);break}case`break`:++n,r(j.CloseStatement,`Expected closing statement token`),c=new Uo;break;case`continue`:++n,r(j.CloseStatement,`Expected closing statement token`),c=new Wo;break;case`filter`:{++n;let e=ue();e instanceof Zo&&o(j.OpenParen)&&(e=w(e)),r(j.CloseStatement,`Expected closing statement token`);let t=[];for(;!s(`endfilter`);)t.push(a());r(j.OpenStatement,`Expected '{%'`),i(`endfilter`),r(j.CloseStatement,`Expected '%}'`),c=new ss(e,t);break}default:throw SyntaxError(`Unknown statement type: ${t}`)}return c}function d(){r(j.OpenExpression,`Expected opening expression token`);let e=_();return r(j.CloseExpression,`Expected closing expression token`),e}function f(){let e=h(),t=null,c=[];if(o(j.Equals))++n,t=h();else{for(r(j.CloseStatement,`Expected %} token`);!s(`endset`);)c.push(a());r(j.OpenStatement,`Expected {% token`),i(`endset`)}return r(j.CloseStatement,`Expected closing statement token`),new Go(e,t,c)}function p(){let e=_();r(j.CloseStatement,`Expected closing statement token`);let t=[],i=[];for(;!s(`elif`,`else`,`endif`);)t.push(a());if(s(`elif`)){++n,++n;let e=p();i.push(e)}else if(s(`else`))for(++n,++n,r(j.CloseStatement,`Expected closing statement token`);!s(`endif`);)i.push(a());return new Vo(e,t,i)}function m(){let e=ue();if(e.type!==`Identifier`)throw SyntaxError(`Expected identifier following macro statement`);let t=te(`parameters`);r(j.CloseStatement,`Expected closing statement token`);let n=[];for(;!s(`endmacro`);)n.push(a());return new Ko(e,t,n)}function h(e=!1){let t=e?ue:_,r=[t()],i=o(j.Comma);for(;i&&(++n,r.push(t()),o(j.Comma)););return i?new rs(r):r[0]}function g(){let e=h(!0);if(!(e instanceof Zo||e instanceof rs))throw SyntaxError(`Expected identifier/tuple for the loop variable, got ${e.type} instead`);if(!c(`in`))throw SyntaxError("Expected `in` keyword following loop variable");++n;let t=_();r(j.CloseStatement,`Expected closing statement token`);let i=[];for(;!s(`endfor`,`else`);)i.push(a());let o=[];if(s(`else`))for(++n,++n,r(j.CloseStatement,`Expected closing statement token`);!s(`endfor`);)o.push(a());return new Ho(e,t,i,o)}function _(){return v()}function v(){let e=y();if(c(`if`)){++n;let t=y();return c(`else`)?(++n,new gs(t,e,v())):new cs(e,t)}return e}function y(){let t=b();for(;c(`or`);){let r=e[n];++n;let i=b();t=new as(r,t,i)}return t}function b(){let t=x();for(;c(`and`);){let r=e[n];++n;let i=x();t=new as(r,t,i)}return t}function x(){let t;for(;c(`not`);){let r=e[n];++n,t=new us(r,x())}return t??S()}function S(){let t=C();for(;;){let r;if(c(`not`,`in`))r=new jo(`not in`,j.Identifier),n+=2;else if(c(`in`))r=e[n++];else if(o(j.ComparisonBinaryOperator))r=e[n++];else break;let i=C();t=new as(r,t,i)}return t}function C(){let t=ae();for(;o(j.AdditiveBinaryOperator);){let r=e[n];++n;let i=ae();t=new as(r,t,i)}return t}function ee(){let e=ie(ue());return o(j.OpenParen)?w(e):e}function w(e){let t=new Xo(e,te(`call`));return t=ie(t),o(j.OpenParen)&&(t=w(t)),t}function te(e){r(j.OpenParen,`Expected opening parenthesis for arguments list`);let t=ne(e);return r(j.CloseParen,`Expected closing parenthesis for arguments list`),t}function ne(t){let r=[],i=/* @__PURE__ */ new Set,a=!1,s=!1;for(;!o(j.CloseParen);){let c=o(j.ExponentiationBinaryOperator),l=o(j.MultiplicativeBinaryOperator)&&e[n].value===`*`;if(t===`parameters`&&(c||l))throw SyntaxError(`Argument unpacking is not allowed in parameter declarations`);if(c){if(++n,r.push(new ms(_())),o(j.Comma)&&++n,!o(j.CloseParen))throw SyntaxError("Expected closing parenthesis: `**` must be applied to the final argument");break}let u;if(l){if(s)throw SyntaxError("Only one `*` argument unpacking is allowed");s=!0,++n,u=new ps(_())}else{if(u=_(),o(j.Equals)){if(++n,!(u instanceof Zo))throw SyntaxError(t===`parameters`?`Expected identifier for parameter declaration`:`Expected identifier for keyword argument`);let e=_();u=new fs(u,e)}if(t===`parameters`){if(!(u instanceof Zo||u instanceof fs))throw SyntaxError(`Expected identifier for parameter declaration`);let e=u instanceof Zo?u.value:u.key.value;if(i.has(e))throw SyntaxError(`Duplicate parameter name: ${e}`);i.add(e)}if(u instanceof fs)a=!0;else if(a)throw SyntaxError(t===`call`?`Positional arguments must come before keyword arguments`:`Non-default argument follows default argument`);else if(s)throw SyntaxError("Positional arguments must not follow `*` argument unpacking")}r.push(u),o(j.Comma)&&++n}return r}function re(){let e=[],t=!1;for(;!o(j.CloseSquareBracket);)o(j.Colon)?(e.push(void 0),++n,t=!0):(e.push(_()),o(j.Colon)&&(++n,t=!0));if(e.length===0)throw SyntaxError(`Expected at least one argument for member/slice expression`);if(t){if(e.length>3)throw SyntaxError(`Expected 0-3 arguments for slice expression`);return new ds(...e)}return e[0]}function ie(t){for(;o(j.Dot)||o(j.OpenSquareBracket);){let i=e[n];++n;let a,o=i.type===j.OpenSquareBracket;if(o)a=re(),r(j.CloseSquareBracket,`Expected closing square bracket`);else if(a=ue(),a.type!==`Identifier`&&a.type!==`IntegerLiteral`)throw SyntaxError(`Expected identifier or integer following dot operator`);t=new Yo(t,a,o)}return t}function ae(){let t=oe();for(;o(j.MultiplicativeBinaryOperator);){let r=e[n++],i=oe();t=new as(r,t,i)}return t}function oe(){let t=se();for(;o(j.ExponentiationBinaryOperator);){let r=e[n++],i=se();t=new as(r,t,i)}return t}function se(){let e=ce();for(;c(`is`);){++n;let t=c(`not`);t&&++n;let r=ue();if(!(r instanceof Zo))throw SyntaxError(`Expected identifier for the test`);e=new ls(e,t,r)}return e}function ce(){let e=le();for(;o(j.Pipe);){++n;let t=ue();if(!(t instanceof Zo))throw SyntaxError(`Expected identifier for the filter`);o(j.OpenParen)&&(t=w(t)),e=new os(e,t)}return e}function le(){let t=e[n];if(t&&(t.type===j.UnaryOperator||t.type===j.AdditiveBinaryOperator)&&(t.value===`-`||t.value===`+`)){let t=e[n++];return new us(t,le())}return ee()}function ue(){let t=e[n++];switch(t.type){case j.NumericLiteral:{let e=t.value;return e.includes(`.`)?new es(Number(e)):new $o(Number(e))}case j.StringLiteral:{let r=t.value;for(;o(j.StringLiteral);)r+=e[n++].value;return new ts(r)}case j.Identifier:return new Zo(t.value);case j.OpenParen:{let e=h();return r(j.CloseParen,"Expected closing parenthesis, got ${tokens[current].type} instead."),e}case j.OpenSquareBracket:{let e=[];for(;!o(j.CloseSquareBracket);)e.push(_()),o(j.Comma)&&++n;return++n,new ns(e)}case j.OpenCurlyBracket:{let e=/* @__PURE__ */ new Map;for(;!o(j.CloseCurlyBracket);){let t=_();r(j.Colon,`Expected colon between key and value in object literal`);let i=_();e.set(t,i),o(j.Comma)&&++n}return++n,new is(e)}default:throw SyntaxError(`Unexpected token: ${t.type}`)}}for(;n0)for(let i=e;it;i+=n)r.push(i);return r}function ys(e,t,n,r=1){let i=Math.sign(r);i>=0?(t=(t??=0)<0?Math.max(e.length+t,0):Math.min(t,e.length),n=(n??=e.length)<0?Math.max(e.length+n,0):Math.min(n,e.length)):(t=(t??=e.length-1)<0?Math.max(e.length+t,-1):Math.min(t,e.length-1),n=(n??=-1)<-1?Math.max(e.length+n,-1):Math.min(n,e.length-1));let a=[];for(let o=t;i*oe.toUpperCase())}function xs(e){return Ss(/* @__PURE__ */ new Date,e)}function Ss(e,t){let n=new Intl.DateTimeFormat(void 0,{month:`long`}),r=new Intl.DateTimeFormat(void 0,{month:`short`}),i=e=>e<10?`0`+e:e.toString();return t.replace(/%[YmdbBHM%]/g,t=>{switch(t){case`%Y`:return e.getFullYear().toString();case`%m`:return i(e.getMonth()+1);case`%d`:return i(e.getDate());case`%b`:return r.format(e);case`%B`:return n.format(e);case`%H`:return i(e.getHours());case`%M`:return i(e.getMinutes());case`%%`:return`%`;default:return t}})}function Cs(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ws(e,t,n,r){if(r===0)return e;let i=r==null||r<0?1/0:r,a=t.length===0?/* @__PURE__ */ RegExp(`(?=)`,`gu`):new RegExp(Cs(t),`gu`);return e.replaceAll(a,e=>i>0?(--i,n):e)}var Ts=class extends Error{},Es=class extends Error{},Ds=/* @__PURE__ */ new Map,Os=class{type=`RuntimeValue`;value;get builtins(){return Ds}constructor(e=void 0){this.value=e}__bool__(){return new F(!!this.value)}toString(){return String(this.value)}},M=class extends Os{type=`IntegerValue`},N=class extends Os{type=`FloatValue`;toString(){return Object.is(this.value,-0)?`-0.0`:this.value%1==0?this.value.toFixed(1):this.value.toString()}},P=class extends Os{type=`StringValue`;_builtins;get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`upper`,new L(()=>new P(this.value.toUpperCase()))],[`lower`,new L(()=>new P(this.value.toLowerCase()))],[`strip`,new L(()=>new P(this.value.trim()))],[`title`,new L(()=>new P(bs(this.value)))],[`capitalize`,new L(()=>new P(this.value.charAt(0).toUpperCase()+this.value.slice(1)))],[`length`,new M(this.value.length)],[`rstrip`,new L(()=>new P(this.value.trimEnd()))],[`lstrip`,new L(()=>new P(this.value.trimStart()))],[`startswith`,new L(e=>{if(e.length===0)throw Error(`startswith() requires at least one argument`);let t=e[0];if(t instanceof P)return new F(this.value.startsWith(t.value));if(t instanceof I){for(let e of t.value){if(!(e instanceof P))throw Error(`startswith() tuple elements must be strings`);if(this.value.startsWith(e.value))return new F(!0)}return new F(!1)}throw Error(`startswith() argument must be a string or tuple of strings`)})],[`endswith`,new L(e=>{if(e.length===0)throw Error(`endswith() requires at least one argument`);let t=e[0];if(t instanceof P)return new F(this.value.endsWith(t.value));if(t instanceof I){for(let e of t.value){if(!(e instanceof P))throw Error(`endswith() tuple elements must be strings`);if(this.value.endsWith(e.value))return new F(!0)}return new F(!1)}throw Error(`endswith() argument must be a string or tuple of strings`)})],[`split`,new L(e=>{let t=e[0]??new R;if(!(t instanceof P||t instanceof R))throw Error(`sep argument must be a string or null`);let n=e[1]??new M(-1);if(!(n instanceof M))throw Error(`maxsplit argument must be a number`);let r=[];if(t instanceof R){let e=this.value.trimStart();for(let{0:t,index:i}of e.matchAll(/\S+/g)){if(n.value!==-1&&r.length>=n.value&&i!==void 0){r.push(t+e.slice(i+t.length));break}r.push(t)}}else{if(t.value===``)throw Error(`empty separator`);r=this.value.split(t.value),n.value!==-1&&r.length>n.value&&r.push(r.splice(n.value).join(t.value))}return new I(r.map(e=>new P(e)))})],[`replace`,new L(e=>{if(e.length<2)throw Error(`replace() requires at least two arguments`);let t=e[0],n=e[1];if(!(t instanceof P&&n instanceof P))throw Error(`replace() arguments must be strings`);let r;if(r=e.length>2?e[2].type===`KeywordArgumentsValue`?e[2].value.get(`count`)??new R:e[2]:new R,!(r instanceof M||r instanceof R))throw Error(`replace() count argument must be a number or null`);return new P(ws(this.value,t.value,n.value,r.value))})]])}},F=class extends Os{type=`BooleanValue`},ks=/[\x7f-\uffff]/g;function As(e){return e.replace(ks,e=>`\\u`+e.charCodeAt(0).toString(16).padStart(4,`0`))}function js(e,t={},n=0,r=!0){let{indent:i=null,ensureAscii:a=!1,separators:o=null,sortKeys:s=!1}=t,c,l;switch(o?[c,l]=o:i?(c=`,`,l=`: `):(c=`, `,l=`: `),e.type){case`NullValue`:return`null`;case`UndefinedValue`:return r?`null`:`undefined`;case`IntegerValue`:case`FloatValue`:case`BooleanValue`:return JSON.stringify(e.value);case`StringValue`:{let t=JSON.stringify(e.value);return a&&(t=As(t)),t}case`ArrayValue`:case`NamespaceValue`:case`ObjectValue`:{let o=i?` `.repeat(i):``,u=` -`+o.repeat(n),d=u+o;if(e.type===`ArrayValue`){let a=e.value.map(e=>js(e,t,n+1,r));return i?`[${d}${a.join(`${c}${d}`)}${u}]`:`[${a.join(c)}]`}{let o=Array.from(e.value.entries());s&&(o=o.sort(([e],[t])=>e.localeCompare(t)));let f=o.map(([e,o])=>{let s=JSON.stringify(e);a&&(s=As(s));let c=`${s}${l}${js(o,t,n+1,r)}`;return i?`${d}${c}`:c});return i?`{${f.join(c)}${u}}`:`{${f.join(c)}}`}}default:throw Error(`Cannot convert to JSON: ${e.type}`)}}var Ms=class extends Os{type=`ObjectValue`;_builtins;__bool__(){return new F(this.value.size>0)}get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`get`,new L(([e,t])=>{if(!(e instanceof P))throw Error(`Object key must be a string: got ${e.type}`);return this.value.get(e.value)??t??new R})],[`items`,new L(()=>this.items())],[`keys`,new L(()=>this.keys())],[`values`,new L(()=>this.values())],[`dictsort`,new L(e=>{let t=/* @__PURE__ */ new Map,n=e.filter(e=>e instanceof Ns?(t=e.value,!1):!0),r=n.at(0)??t.get(`case_sensitive`)??new F(!1);if(!(r instanceof F))throw Error(`case_sensitive must be a boolean`);let i=n.at(1)??t.get(`by`)??new P(`key`);if(!(i instanceof P))throw Error(`by must be a string`);if(![`key`,`value`].includes(i.value))throw Error(`by must be either 'key' or 'value'`);let a=n.at(2)??t.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);return new I(Array.from(this.value.entries()).map(([e,t])=>new I([new P(e),t])).sort((e,t)=>{let n=i.value===`key`?0:1,o=e.value[n],s=t.value[n],c=Ws(o,s,r.value);return a.value?-c:c}))})]])}items(){return new I(Array.from(this.value.entries()).map(([e,t])=>new I([new P(e),t])))}keys(){return new I(Array.from(this.value.keys()).map(e=>new P(e)))}values(){return new I(Array.from(this.value.values()))}toString(){return js(this,{},0,!1)}},Ns=class extends Ms{type=`KeywordArgumentsValue`},Ps=class extends Os{type=`NamespaceValue`;toString(){return js(this,{},0,!1)}},I=class extends Os{type=`ArrayValue`;_builtins;get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`length`,new M(this.value.length)]])}__bool__(){return new F(this.value.length>0)}toString(){return js(this,{},0,!1)}},Fs=class extends I{type=`TupleValue`},L=class extends Os{type=`FunctionValue`},R=class extends Os{type=`NullValue`},z=class extends Os{type=`UndefinedValue`};function Is(e){let t;if(e instanceof I?t=e.value:e instanceof P&&(t=Array.from(e.value,e=>new P(e))),!t||t.length!==2)throw Error(`namespace expected an object or an iterable of [key, value] pairs`);let[n,r]=t;if(!(n instanceof P))throw Error(`namespace keys must be strings`);return[n,r]}var Ls=class{constructor(e){this.parent=e}variables=/* @__PURE__ */ new Map([[`namespace`,new L(e=>{let t=e.slice(),n;if(t.at(-1)instanceof Ns&&(n=t.pop()),t.length>1)throw Error(`namespace expected at most 1 argument, got ${t.length}`);let r=/* @__PURE__ */ new Map;if(t.length===1){let e=t[0];if(e instanceof Ms)for(let[t,n]of e.value)r.set(t,n);else if(e instanceof I)for(let t of e.value){let[e,n]=Is(t);r.set(e.value,n)}else throw Error(`'${e.type}' object is not iterable`)}if(n)for(let[e,t]of n.value)r.set(e,t);return new Ps(r)})]]);tests=Ls.TESTS;set(e,t){return this.declareVariable(e,Ys(t))}declareVariable(e,t){if(this.variables.has(e))throw SyntaxError(`Variable already declared: ${e}`);return this.variables.set(e,t),t}setVariable(e,t){return this.variables.set(e,t),t}resolve(e){if(this.variables.has(e))return this;if(this.parent)return this.parent.resolve(e);throw Error(`Unknown variable: ${e}`)}lookupVariable(e){try{return this.resolve(e).variables.get(e)??new z}catch{return new z}}},Rs=Ls;Ao(Rs,`TESTS`,/* @__PURE__ */ new Map([[`boolean`,e=>e.type===`BooleanValue`],[`callable`,e=>e instanceof L],[`odd`,e=>{if(!(e instanceof M))throw Error(`cannot odd on ${e.type}`);return e.value%2!=0}],[`even`,e=>{if(!(e instanceof M))throw Error(`cannot even on ${e.type}`);return e.value%2==0}],[`false`,e=>e.type===`BooleanValue`&&!e.value],[`true`,e=>e.type===`BooleanValue`&&e.value],[`none`,e=>e.type===`NullValue`],[`string`,e=>e.type===`StringValue`],[`number`,e=>e instanceof M||e instanceof N],[`integer`,e=>e instanceof M],[`iterable`,e=>e.type===`ArrayValue`||e.type===`StringValue`],[`mapping`,e=>e instanceof Ms],[`sequence`,e=>e instanceof I||e instanceof Ms||e instanceof P],[`lower`,e=>{let t=e.value;return e.type===`StringValue`&&t===t.toLowerCase()}],[`upper`,e=>{let t=e.value;return e.type===`StringValue`&&t===t.toUpperCase()}],[`none`,e=>e.type===`NullValue`],[`defined`,e=>e.type!==`UndefinedValue`],[`undefined`,e=>e.type===`UndefinedValue`],[`equalto`,(e,t)=>e.value===t.value],[`eq`,(e,t)=>e.value===t.value]]));function zs(e){e.set(`false`,!1),e.set(`true`,!0),e.set(`none`,null),e.set(`raise_exception`,e=>{throw Error(e)}),e.set(`range`,vs),e.set(`strftime_now`,xs),e.set(`True`,!0),e.set(`False`,!1),e.set(`None`,null)}function Bs(e){return e instanceof Ms||e instanceof Ps}function Vs(e){return e instanceof M||e instanceof N||e instanceof F}function Hs(e){return e instanceof F?Number(e.value):e.value}function Us(e,t){let n=t.split(`.`),r=e;for(let e of n)if(Bs(r))r=r.value.get(e)??new z;else if(r instanceof I){let t=parseInt(e,10);if(!isNaN(t)&&t>=0&&tr)}if(e.type!==t.type)throw Error(`Cannot compare different types: ${e.type} and ${t.type}`);switch(e.type){case`StringValue`:{let r=e.value,i=t.value;return n||(r=r.toLowerCase(),i=i.toLowerCase()),ri)}default:throw Error(`Cannot compare type: ${e.type}`)}}function Gs(e){if(e.type===`Identifier`)return{name:e.value};let t=e;return{name:t.key.value,defaultValue:t.value}}function Ks(e){return e===`kwargs`||e===`varargs`}function qs(e,t){let n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set,i=e=>{Ks(e)&&n.add(e)},a=e=>{if(e.type===`Identifier`)i(e.value);else if(e.type===`TupleLiteral`)for(let t of e.value)a(t)},o=e=>{i(Gs(e).name)},s=e=>{for(let t of e){let e=Gs(t);e.defaultValue&&l(e.defaultValue)}},c=e=>{e.type===`CallExpression`&&l(e.args)},l=e=>{if(Array.isArray(e)){for(let t of e)l(t);return}if(e instanceof Map){for(let[t,n]of e)l(t),l(n);return}if(e instanceof zo)switch(e.type){case`For`:{let t=e;if(a(t.loopvar),t.iterable.type===`SelectExpression`){let e=t.iterable;l(e.lhs),l(t.body),l(t.defaultBlock),l(e.test);return}l(t.iterable),l(t.body),l(t.defaultBlock);return}case`Set`:{let t=e;a(t.assignee),l(t.value),l(t.body);return}case`Macro`:{let t=e;for(let e of t.args)o(e);s(t.args),l(t.body);return}case`CallStatement`:{let t=e;l(t.call);for(let e of t.callerArgs??[])o(e);s(t.callerArgs??[]),l(t.body);return}case`FilterStatement`:{let t=e;l(t.body),c(t.filter);return}case`Identifier`:{let t=e.value;Ks(t)&&!n.has(t)&&r.add(t);return}case`MemberExpression`:{let t=e;l(t.object),t.computed&&l(t.property);return}case`FilterExpression`:{let t=e;l(t.operand),c(t.filter);return}case`TestExpression`:l(e.operand);return;case`SelectExpression`:{let t=e;l(t.test),l(t.lhs);return}case`KeywordArgumentExpression`:l(e.value);return;default:for(let t of Object.values(e))l(t)}};for(let t of e)o(t);return l(t),r}var Js=class{global;constructor(e){this.global=e??new Rs}run(e){return this.evaluate(e,this.global)}evaluateBinaryExpression(e,t){let n=this.evaluate(e.left,t);switch(e.operator.value){case`and`:return n.__bool__().value?this.evaluate(e.right,t):n;case`or`:return n.__bool__().value?n:this.evaluate(e.right,t)}let r=this.evaluate(e.right,t);switch(e.operator.value){case`==`:return new F(n.value==r.value);case`!=`:return new F(n.value!=r.value)}if(n instanceof z||r instanceof z){if(r instanceof z&&[`in`,`not in`].includes(e.operator.value))return new F(e.operator.value===`not in`);throw Error(`Cannot perform operation ${e.operator.value} on undefined values`)}if(n instanceof R||r instanceof R)throw Error(`Cannot perform operation on null values`);if(e.operator.value===`~`)return new P(n.value.toString()+r.value.toString());if(e.operator.value===`**`&&Vs(n)&&Vs(r)){let e=Hs(n),t=Hs(r);if(e===0&&t<0)throw Error(`0.0 cannot be raised to a negative power`);let i=e**t;if(!Number.isFinite(i))throw Error(`Exponentiation result is not a finite real number`);return n instanceof N||r instanceof N||t<0?new N(i):new M(i)}if((n instanceof M||n instanceof N)&&(r instanceof M||r instanceof N)){let t=n.value,i=r.value;switch(e.operator.value){case`+`:case`-`:case`*`:{let a=e.operator.value===`+`?t+i:e.operator.value===`-`?t-i:t*i;return n instanceof N||r instanceof N?new N(a):new M(a)}case`/`:return new N(t/i);case`//`:{let e=Math.floor(t/i);return n instanceof N||r instanceof N?new N(e):new M(e)}case`%`:{let e=t%i;return n instanceof N||r instanceof N?new N(e):new M(e)}case`<`:return new F(t`:return new F(t>i);case`>=`:return new F(t>=i);case`<=`:return new F(t<=i)}}else if(n instanceof I&&r instanceof I)switch(e.operator.value){case`+`:return new I(n.value.concat(r.value))}else if(r instanceof I){let t=r.value.find(e=>e.value===n.value)!==void 0;switch(e.operator.value){case`in`:return new F(t);case`not in`:return new F(!t)}}if(n instanceof P||r instanceof P)switch(e.operator.value){case`+`:return new P(n.value.toString()+r.value.toString())}if(n instanceof P&&r instanceof P)switch(e.operator.value){case`in`:return new F(r.value.includes(n.value));case`not in`:return new F(!r.value.includes(n.value))}if(n instanceof P&&r instanceof Ms)switch(e.operator.value){case`in`:return new F(r.value.has(n.value));case`not in`:return new F(!r.value.has(n.value))}throw SyntaxError(`Unknown operator "${e.operator.value}" between ${n.type} and ${r.type}`)}evaluateArguments(e,t){let n=[],r=/* @__PURE__ */ new Map,i=(e,t)=>{if(r.has(e))throw Error(`Got multiple values for keyword argument '${e}'`);r.set(e,t)};for(let r of e)if(r.type===`SpreadExpression`){let e=r,i=this.evaluate(e.argument,t);if(!(i instanceof I))throw Error(`Cannot unpack non-iterable type: ${i.type}`);for(let e of i.value)n.push(e)}else r.type!==`KeywordArgumentExpression`&&r.type!==`KeywordSpreadExpression`&&n.push(this.evaluate(r,t));for(let n of e)if(n.type===`KeywordArgumentExpression`){let e=n;i(e.key.value,this.evaluate(e.value,t))}else if(n.type===`KeywordSpreadExpression`){let e=n,r=this.evaluate(e.argument,t);if(!(r instanceof Ms))throw Error(`Argument after ** must be a mapping, not ${r.type}`);for(let[e,t]of r.value)i(e,t)}return[n,r]}applyFilter(e,t,n){if(t.type===`Identifier`){let r=t;if(r.value===`safe`)return e;if(r.value===`tojson`)return new P(js(e,{}));if(e instanceof I)switch(r.value){case`list`:return e;case`first`:return e.value[0];case`last`:return e.value[e.value.length-1];case`length`:return new M(e.value.length);case`reverse`:return new I(e.value.slice().reverse());case`sort`:return new I(e.value.slice().sort((e,t)=>Ws(e,t,!1)));case`join`:return new P(e.value.map(e=>e.value).join(``));case`string`:return new P(js(e,{},0,!1));case`unique`:{let t=/* @__PURE__ */ new Set,n=[];for(let r of e.value)t.has(r.value)||(t.add(r.value),n.push(r));return new I(n)}default:throw Error(`Unknown ArrayValue filter: ${r.value}`)}else if(e instanceof P)switch(r.value){case`length`:case`upper`:case`lower`:case`title`:case`capitalize`:{let t=e.builtins.get(r.value);if(t instanceof L)return t.value([],n);if(t instanceof M)return t;throw Error(`Unknown StringValue filter: ${r.value}`)}case`trim`:return new P(e.value.trim());case`indent`:return new P(e.value.split(` -`).map((e,t)=>t===0||e.length===0?e:` `+e).join(` -`));case`join`:case`string`:return e;case`int`:{let t=parseInt(e.value,10);return new M(isNaN(t)?0:t)}case`float`:{let t=parseFloat(e.value);return new N(isNaN(t)?0:t)}default:throw Error(`Unknown StringValue filter: ${r.value}`)}else if(e instanceof M||e instanceof N)switch(r.value){case`abs`:return e instanceof M?new M(Math.abs(e.value)):new N(Math.abs(e.value));case`int`:return new M(Math.floor(e.value));case`float`:return new N(e.value);case`string`:return new P(e.toString());default:throw Error(`Unknown NumericValue filter: ${r.value}`)}else if(e instanceof Ms)switch(r.value){case`items`:return new I(Array.from(e.value.entries()).map(([e,t])=>new I([new P(e),t])));case`length`:return new M(e.value.size);default:{let t=e.builtins.get(r.value);if(t)return t instanceof L?t.value([],n):t;throw Error(`Unknown ObjectValue filter: ${r.value}`)}}else if(e instanceof F)switch(r.value){case`bool`:return new F(e.value);case`int`:return new M(+!!e.value);case`float`:return new N(+!!e.value);case`string`:return new P(e.value?`true`:`false`);default:throw Error(`Unknown BooleanValue filter: ${r.value}`)}throw Error(`Cannot apply filter "${r.value}" to type: ${e.type}`)}if(t.type===`CallExpression`){let r=t;if(r.callee.type!==`Identifier`)throw Error(`Unknown filter: ${r.callee.type}`);let i=r.callee.value;if(i===`tojson`){let[,t]=this.evaluateArguments(r.args,n),i=t.get(`indent`)??new R;if(!(i instanceof M||i instanceof R))throw Error(`If set, indent must be a number`);let a=t.get(`ensure_ascii`)??new F(!1);if(!(a instanceof F))throw Error(`If set, ensure_ascii must be a boolean`);let o=t.get(`sort_keys`)??new F(!1);if(!(o instanceof F))throw Error(`If set, sort_keys must be a boolean`);let s=t.get(`separators`)??new R,c=null;if(s instanceof I||s instanceof Fs){if(s.value.length!==2)throw Error(`separators must be a tuple of two strings`);let[e,t]=s.value;if(!(e instanceof P)||!(t instanceof P))throw Error(`separators must be a tuple of two strings`);c=[e.value,t.value]}else if(!(s instanceof R))throw Error(`If set, separators must be a tuple of two strings`);return new P(js(e,{indent:i.value,ensureAscii:a.value,sortKeys:o.value,separators:c}))}if(i===`join`){let t;if(e instanceof P)t=Array.from(e.value);else if(e instanceof I)t=e.value.map(e=>e.value);else throw Error(`Cannot apply filter "${i}" to type: ${e.type}`);let[a,o]=this.evaluateArguments(r.args,n),s=a.at(0)??o.get(`separator`)??new P(``);if(!(s instanceof P))throw Error(`separator must be a string`);return new P(t.join(s.value))}if(i===`int`||i===`float`){let[t,a]=this.evaluateArguments(r.args,n),o=t.at(0)??a.get(`default`)??(i===`int`?new M(0):new N(0));if(e instanceof P){let t=i===`int`?parseInt(e.value,10):parseFloat(e.value);return isNaN(t)?o:i===`int`?new M(t):new N(t)}if(e instanceof M||e instanceof N)return e;if(e instanceof F)return i===`int`?new M(+!!e.value):new N(+!!e.value);throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}if(i==="default"){let[t,i]=this.evaluateArguments(r.args,n),a=t[0]??new P(``),o=t[1]??i.get(`boolean`)??new F(!1);if(!(o instanceof F))throw Error("`default` filter flag must be a boolean");return e instanceof z||o.value&&!e.__bool__().value?a:e}if(e instanceof I){switch(i){case`sort`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);let o=t.at(1)??i.get(`case_sensitive`)??new F(!1);if(!(o instanceof F))throw Error(`case_sensitive must be a boolean`);let s=t.at(2)??i.get(`attribute`)??new R;if(!(s instanceof P||s instanceof M||s instanceof R))throw Error(`attribute must be a string, integer, or null`);let c=e=>s instanceof R?e:Us(e,s instanceof M?String(s.value):s.value);return new I(e.value.slice().sort((e,t)=>{let n=Ws(c(e),c(t),o.value);return a.value?-n:n}))}case`selectattr`:case`rejectattr`:{let t=i===`selectattr`;if(e.value.some(e=>!Bs(e)))throw Error(`\`${i}\` can only be applied to array of objects`);if(r.args.some(e=>e.type!==`StringLiteral`))throw Error(`arguments of \`${i}\` must be strings`);let[a,o,s]=r.args.map(e=>this.evaluate(e,n)),c;if(o){let e=n.tests.get(o.value);if(!e)throw Error(`Unknown test: ${o.value}`);c=e}else c=(...e)=>e[0].__bool__().value;return new I(e.value.filter(e=>{let n=e.value.get(a.value),r=n?c(n,s):!1;return t?r:!r}))}case`map`:{let[,t]=this.evaluateArguments(r.args,n);if(t.has(`attribute`)){let n=t.get(`attribute`);if(!(n instanceof P))throw Error(`attribute must be a string`);let r=t.get(`default`);return new I(e.value.map(e=>{if(!Bs(e))throw Error(`items in map must be an object`);let t=Us(e,n.value);return t instanceof z?r??new z:t}))}throw Error("`map` expressions without `attribute` set are not currently supported.")}}throw Error(`Unknown ArrayValue filter: ${i}`)}if(e instanceof P){switch(i){case`indent`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`width`)??new M(4);if(!(a instanceof M))throw Error(`width must be a number`);let o=t.at(1)??i.get(`first`)??new F(!1),s=t.at(2)??i.get(`blank`)??new F(!1),c=e.value.split(` -`),l=` `.repeat(a.value);return new P(c.map((e,t)=>!o.value&&t===0||!s.value&&e.length===0?e:l+e).join(` -`))}case`replace`:{let t=e.builtins.get(`replace`);if(!(t instanceof L))throw Error(`replace filter not available`);let[i,a]=this.evaluateArguments(r.args,n);return t.value([...i,new Ns(a)],n)}}throw Error(`Unknown StringValue filter: ${i}`)}if(e instanceof Ms){let t=e.builtins.get(i);if(t&&t instanceof L){let[e,i]=this.evaluateArguments(r.args,n);return i.size>0&&e.push(new Ns(i)),t.value(e,n)}throw Error(`Unknown ObjectValue filter: ${i}`)}throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}throw Error(`Unknown filter: ${t.type}`)}evaluateFilterExpression(e,t){let n=this.evaluate(e.operand,t);return this.applyFilter(n,e.filter,t)}evaluateTestExpression(e,t){let n=this.evaluate(e.operand,t),r=t.tests.get(e.test.value);if(!r)throw Error(`Unknown test: ${e.test.value}`);let i=r(n);return new F(e.negate?!i:i)}evaluateSelectExpression(e,t){return this.evaluate(e.test,t).__bool__().value?this.evaluate(e.lhs,t):new z}evaluateUnaryExpression(e,t){let n=this.evaluate(e.argument,t);switch(e.operator.value){case`not`:return new F(!n.value);case`+`:case`-`:{let t=e.operator.value===`-`?-1:1;if(n instanceof M||n instanceof N||n instanceof F){let e=t*(n instanceof F?+!!n.value:n.value);return n instanceof N?new N(e):new M(e)}throw SyntaxError(`Unknown operator "${e.operator.value}" for ${n.type}`)}default:throw SyntaxError(`Unknown operator: ${e.operator.value}`)}}evaluateTernaryExpression(e,t){return this.evaluate(e.condition,t).__bool__().value?this.evaluate(e.trueExpr,t):this.evaluate(e.falseExpr,t)}evalProgram(e,t){return this.evaluateBlock(e.body,t)}evaluateBlock(e,t){let n=``;for(let r of e){let e=this.evaluate(r,t);e.type!==`NullValue`&&e.type!==`UndefinedValue`&&(n+=e.toString())}return new P(n)}evaluateIdentifier(e,t){return t.lookupVariable(e.value)}evaluateCallExpression(e,t){let[n,r]=this.evaluateArguments(e.args,t);r.size>0&&n.push(new Ns(r));let i=this.evaluate(e.callee,t);if(i.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${i.type}`);return i.value(n,t)}evaluateSliceExpression(e,t,n){if(!(e instanceof I||e instanceof P))throw Error(`Slice object must be an array or string`);let r=this.evaluate(t.start,n),i=this.evaluate(t.stop,n),a=this.evaluate(t.step,n);if(!(r instanceof M||r instanceof z))throw Error(`Slice start must be numeric or undefined`);if(!(i instanceof M||i instanceof z))throw Error(`Slice stop must be numeric or undefined`);if(!(a instanceof M||a instanceof z))throw Error(`Slice step must be numeric or undefined`);return e instanceof I?new I(ys(e.value,r.value,i.value,a.value)):new P(ys(Array.from(e.value),r.value,i.value,a.value).join(``))}evaluateMemberExpression(e,t){let n=this.evaluate(e.object,t),r;if(e.computed){if(e.property.type===`SliceExpression`)return this.evaluateSliceExpression(n,e.property,t);r=this.evaluate(e.property,t)}else r=e.property.type===`IntegerLiteral`?new M(e.property.value):new P(e.property.value);let i;if(Bs(n)){if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.value.get(r.value)??(n instanceof Ms?n.builtins.get(r.value):void 0)}else if(n instanceof I||n instanceof P){if(r instanceof M)i=n.value.at(r.value),n instanceof P&&(i=new P(n.value.at(r.value)));else if(r instanceof P)i=n.builtins.get(r.value);else throw Error(`Cannot access property with non-string/non-number: got ${r.type}`)}else{if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.builtins.get(r.value)}return i instanceof Os?i:new z}evaluateSet(e,t){let n=e.value?this.evaluate(e.value,t):this.evaluateBlock(e.body,t);if(e.assignee.type===`Identifier`){let r=e.assignee.value;t.setVariable(r,n)}else if(e.assignee.type===`TupleLiteral`){let r=e.assignee;if(!(n instanceof I))throw Error(`Cannot unpack non-iterable type in set: ${n.type}`);let i=n.value;if(i.length!==r.value.length)throw Error(`Too ${r.value.length>i.length?`few`:`many`} items to unpack in set`);for(let e=0;et.setVariable(e.loopvar.value,c);else if(e.loopvar.type===`TupleLiteral`){let t=e.loopvar;if(c.type!==`ArrayValue`)throw Error(`Cannot unpack non-iterable type: ${c.type}`);let n=c;if(t.value.length!==n.value.length)throw Error(`Too ${t.value.length>n.value.length?`few`:`many`} items to unpack`);l=e=>{for(let r=0;r0?a[t-1]:new z],[`nextitem`,t0)throw Error(`macro ${e} takes no keyword argument '${o.keys().next().value}'`);if(n.has(`varargs`))i.setVariable(`varargs`,new I(a.slice(t.length)));else if(a.length>t.length)throw Error(`macro ${e} takes not more than ${t.length} argument(s)`);for(let[e,t]of s)i.setVariable(e,this.evaluate(t,i))}evaluateMacro(e,t){let n=qs(e.args,e.body);return t.setVariable(e.name.value,new L((t,r)=>{let i=new Rs(r);return this.bindMacroArguments(`'${e.name.value}'`,e.args,n,t,i),this.evaluateBlock(e.body,i)})),new R}evaluateCallStatement(e,t){let n=e.callerArgs??[],r=qs(n,e.body),i=new L(i=>{let a=new Rs(t);return this.bindMacroArguments(`None`,n,r,i,a),this.evaluateBlock(e.body,a)}),[a,o]=this.evaluateArguments(e.call.args,t);a.push(new Ns(o));let s=this.evaluate(e.call.callee,t);if(s.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${s.type}`);let c=new Rs(t);return c.setVariable(`caller`,i),s.value(a,c)}evaluateFilterStatement(e,t){let n=this.evaluateBlock(e.body,t);return this.applyFilter(n,e.filter,t)}evaluate(e,t){if(!e)return new z;switch(e.type){case`Program`:return this.evalProgram(e,t);case`Set`:return this.evaluateSet(e,t);case`If`:return this.evaluateIf(e,t);case`For`:return this.evaluateFor(e,t);case`Macro`:return this.evaluateMacro(e,t);case`CallStatement`:return this.evaluateCallStatement(e,t);case`Break`:throw new Ts;case`Continue`:throw new Es;case`IntegerLiteral`:return new M(e.value);case`FloatLiteral`:return new N(e.value);case`StringLiteral`:return new P(e.value);case`ArrayLiteral`:return new I(e.value.map(e=>this.evaluate(e,t)));case`TupleLiteral`:return new Fs(e.value.map(e=>this.evaluate(e,t)));case`ObjectLiteral`:{let n=/* @__PURE__ */ new Map;for(let[r,i]of e.value){let e=this.evaluate(r,t);if(!(e instanceof P))throw Error(`Object keys must be strings: got ${e.type}`);n.set(e.value,this.evaluate(i,t))}return new Ms(n)}case`Identifier`:return this.evaluateIdentifier(e,t);case`CallExpression`:return this.evaluateCallExpression(e,t);case`MemberExpression`:return this.evaluateMemberExpression(e,t);case`UnaryExpression`:return this.evaluateUnaryExpression(e,t);case`BinaryExpression`:return this.evaluateBinaryExpression(e,t);case`FilterExpression`:return this.evaluateFilterExpression(e,t);case`FilterStatement`:return this.evaluateFilterStatement(e,t);case`TestExpression`:return this.evaluateTestExpression(e,t);case`SelectExpression`:return this.evaluateSelectExpression(e,t);case`Ternary`:return this.evaluateTernaryExpression(e,t);case`Comment`:return new R;default:throw SyntaxError(`Unknown node type: ${e.type}`)}}};function Ys(e){switch(typeof e){case`number`:return Number.isInteger(e)?new M(e):new N(e);case`string`:return new P(e);case`boolean`:return new F(e);case`undefined`:return new z;case`object`:return e===null?new R:Array.isArray(e)?new I(e.map(Ys)):new Ms(new Map(Object.entries(e).map(([e,t])=>[e,Ys(t)])));case`function`:return new L((t,n)=>Ys(e(...t.map(e=>e.value))??null));default:throw Error(`Cannot convert to runtime value: ${e}`)}}var Xs=` -`,Zs=`{%- `,Qs=` -%}`,$s=Object.freeze({CONDITIONAL:0,LOGICAL_OR:1,LOGICAL_AND:2,LOGICAL_NOT:3,COMPARISON:4,ADDITIVE:5,MULTIPLICATIVE:6,EXPONENTIATION:7,TEST:8,FILTER:9,UNARY_SIGN:10,ATOM:11});function ec(e){switch(e.operator.type){case`ExponentiationBinaryOperator`:return $s.EXPONENTIATION;case`MultiplicativeBinaryOperator`:return $s.MULTIPLICATIVE;case`AdditiveBinaryOperator`:return $s.ADDITIVE;case`ComparisonBinaryOperator`:return $s.COMPARISON;case`Identifier`:return e.operator.value===`and`?$s.LOGICAL_AND:e.operator.value===`in`||e.operator.value===`not in`?$s.COMPARISON:$s.LOGICAL_OR}return $s.LOGICAL_OR}function tc(e){switch(e.type){case`SelectExpression`:case`Ternary`:return $s.CONDITIONAL;case`BinaryExpression`:return ec(e);case`UnaryExpression`:return e.operator.value===`not`?$s.LOGICAL_NOT:$s.UNARY_SIGN;case`TestExpression`:return $s.TEST;case`FilterExpression`:return $s.FILTER;default:return $s.ATOM}}function nc(e,t){let n=B(e);return tc(e)sc(e,t,n)).join(Xs)}function oc(e){return e.map(e=>B(e)).join(`, `)}function sc(e,t,n){let r=n.repeat(t);switch(e.type){case`Program`:return ac(e.body,t,n);case`If`:return cc(e,t,n);case`For`:return lc(e,t,n);case`Set`:return uc(e,t,n);case`Macro`:return dc(e,t,n);case`Break`:return r+ic(`break`);case`Continue`:return r+ic(`continue`);case`CallStatement`:return fc(e,t,n);case`FilterStatement`:return pc(e,t,n);case`Comment`:return r+`{# `+e.value+` #}`;default:return r+`{{- `+B(e)+` -}}`}}function cc(e,t,n){let r=n.repeat(t),i=[],a=e;for(;a&&(i.push({test:a.test,body:a.body}),a.alternate.length===1&&a.alternate[0].type===`If`);)a=a.alternate[0];let o=r+ic(`if`,B(i[0].test))+Xs+ac(i[0].body,t+1,n);for(let e=1;e0&&(o+=Xs+r+ic(`else`)+Xs+ac(a.alternate,t+1,n)),o+=Xs+r+ic(`endif`),o}function lc(e,t,n){let r=n.repeat(t),i=``;if(e.iterable.type===`SelectExpression`){let t=e.iterable;i=`${B(t.lhs)} if ${B(t.test)}`}else i=B(e.iterable);let a=r+ic(`for`,B(e.loopvar),`in`,i)+Xs+ac(e.body,t+1,n);return e.defaultBlock.length>0&&(a+=Xs+r+ic(`else`)+Xs+ac(e.defaultBlock,t+1,n)),a+=Xs+r+ic(`endfor`),a}function uc(e,t,n){let r=n.repeat(t),i=B(e.assignee),a=e.value?B(e.value):``,o=r+ic(`set`,`${i}${e.value?` = `+a:``}`);return e.body.length===0?o:o+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endset`)}function dc(e,t,n){let r=n.repeat(t),i=oc(e.args);return r+ic(`macro`,`${e.name.value}(${i})`)+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endmacro`)}function fc(e,t,n){let r=n.repeat(t),i=e.callerArgs&&e.callerArgs.length>0?`(${oc(e.callerArgs)})`:``,a=B(e.call),o=r+ic(`call${i}`,a)+Xs;return o+=ac(e.body,t+1,n)+Xs,o+=r+ic(`endcall`),o}function pc(e,t,n){let r=n.repeat(t),i=r+ic(`filter`,e.filter.type===`Identifier`?e.filter.value:B(e.filter))+Xs;return i+=ac(e.body,t+1,n)+Xs,i+=r+ic(`endfilter`),i}function B(e){switch(e.type){case`SpreadExpression`:return`*${B(e.argument)}`;case`KeywordSpreadExpression`:return`**${B(e.argument)}`;case`Identifier`:return e.value;case`IntegerLiteral`:return`${e.value}`;case`FloatLiteral`:{let t=e.value;return Object.is(t,-0)?`-0.0`:t%1==0?t.toFixed(1):t.toString()}case`StringLiteral`:return JSON.stringify(e.value);case`BinaryExpression`:{let t=e,n=ec(t),r=nc(t.left,n),i=nc(t.right,n+1);return`${r} ${t.operator.value} ${i}`}case`UnaryExpression`:{let t=e,n=t.argument.type===`UnaryExpression`?tc(t):$s.ATOM;return t.operator.value+(t.operator.value===`not`?` `:``)+nc(t.argument,n)}case`CallExpression`:{let t=e,n=oc(t.args);return`${B(t.callee)}(${n})`}case`MemberExpression`:{let t=e,n=nc(t.object,$s.ATOM),r=B(t.property);return!t.computed&&t.property.type!==`Identifier`&&t.property.type!==`IntegerLiteral`&&(r=`(${r})`),t.computed?`${n}[${r}]`:`${n}.${r}`}case`FilterExpression`:{let t=e,n=nc(t.operand,$s.FILTER);return t.filter.type===`CallExpression`?`${n} | ${B(t.filter)}`:`${n} | ${t.filter.value}`}case`SelectExpression`:{let t=e;return`${nc(t.lhs,$s.LOGICAL_OR)} if ${nc(t.test,$s.LOGICAL_OR)}`}case`TestExpression`:{let t=e;return`${nc(t.operand,$s.TEST)} is${t.negate?` not`:``} ${t.test.value}`}case`ArrayLiteral`:case`TupleLiteral`:{let t=oc(e.value),n=e.type===`ArrayLiteral`?`[]`:`()`;return`${n[0]}${t}${n[1]}`}case`ObjectLiteral`:return`{${Array.from(e.value.entries()).map(([e,t])=>`${B(e)}: ${B(t)}`).join(`, `)}}`;case`SliceExpression`:{let t=e;return`${t.start?B(t.start):``}:${t.stop?B(t.stop):``}${t.step?`:${B(t.step)}`:``}`}case`KeywordArgumentExpression`:{let t=e;return`${t.key.value}=${B(t.value)}`}case`Ternary`:{let t=e;return`${nc(t.trueExpr,$s.LOGICAL_OR)} if ${nc(t.condition,$s.LOGICAL_OR)} else ${nc(t.falseExpr,$s.CONDITIONAL)}`}default:throw Error(`Unknown expression type: ${e.type}`)}}var mc=class{parsed;constructor(e){let t=Ro(e,{lstrip_blocks:!0,trim_blocks:!0});this.parsed=_s(t)}render(e){let t=new Rs;if(zs(t),e)for(let[n,r]of Object.entries(e))t.set(n,r);return new Js(t).run(this.parsed).value}format(e){return rc(this.parsed,e?.indent||` `)}},hc={txt:`text/plain`,html:`text/html`,css:`text/css`,js:`text/javascript`,json:`application/json`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`},gc=class e{constructor(e){if(this.filePath=e,this.headers=new Headers,this.exists=Cr.existsSync(e),this.exists){this.status=200,this.statusText=`OK`;let t=Cr.statSync(e);this.headers.set(`content-length`,t.size.toString()),this.updateContentType();let n=Cr.createReadStream(e);this.body=new ReadableStream({start(e){n.on(`data`,t=>e.enqueue(t)),n.on(`end`,()=>e.close()),n.on(`error`,t=>e.error(t))},cancel(){n.destroy()}})}else this.status=404,this.statusText=`Not Found`,this.body=null}updateContentType(){let e=this.filePath.toString().split(`.`).pop().toLowerCase();this.headers.set(`content-type`,hc[e]??`application/octet-stream`)}clone(){let t=new e(this.filePath);return t.exists=this.exists,t.status=this.status,t.statusText=this.statusText,t.headers=new Headers(this.headers),t}async arrayBuffer(){return(await Cr.promises.readFile(this.filePath)).buffer}async blob(){let e=await Cr.promises.readFile(this.filePath);return new Blob([e],{type:this.headers.get(`content-type`)})}async text(){return await Cr.promises.readFile(this.filePath,`utf8`)}async json(){return JSON.parse(await this.text())}},_c=class{constructor(e){this._mt=/* @__PURE__ */ new Uint32Array(624),this._idx=625,this._gauss_next=null,this._random_fn=this.random.bind(this),this.seed(e)}seed(e){if(e==null){if(O.IS_CRYPTO_AVAILABLE){let t=/* @__PURE__ */ new Uint32Array(1);crypto.getRandomValues(t),e=t[0]}else e=Date.now()>>>0}let t=this._mt,n=(e,t)=>Math.imul(e,t)>>>0,r=[];for(let t=e||0;t>0;t=Math.floor(t/4294967296))r.push(t&4294967295);r.length||r.push(0),t[0]=19650218;for(let e=1;e<624;++e)t[e]=n(1812433253,t[e-1]^t[e-1]>>>30)+e>>>0;let i=1,a=0;for(let e=Math.max(624,r.length);e>0;--e,++i,++a)i>=624&&(t[0]=t[623],i=1),a>=r.length&&(a=0),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1664525))+r[a]+a>>>0;for(let e=623;e>0;--e,++i)i>=624&&(t[0]=t[623],i=1),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1566083941))-i>>>0;t[0]=2147483648,this._idx=624,this._gauss_next=null}_int32(){let e=this._mt;if(this._idx>=624){for(let t=0;t<624;++t){let n=e[t]&2147483648|e[(t+1)%624]&2147483647;e[t]=(e[(t+397)%624]^n>>>1^(n&1?2567483615:0))>>>0}this._idx=0}let t=e[this._idx++];return t^=t>>>11,t^=t<<7&2636928640,t^=t<<15&4022730752,t^=t>>>18,t>>>0}random(){return((this._int32()>>>5)*67108864+(this._int32()>>>6))/9007199254740992}gauss(e=0,t=1){let n=this._gauss_next;if(this._gauss_next=null,n===null){let e=this.random()*2*Math.PI,t=Math.sqrt(-2*Math.log(1-this.random()));n=Math.cos(e)*t,this._gauss_next=Math.sin(e)*t}return e+n*t}shuffle(e){for(let t=e.length-1;t>0;--t){let n=32-Math.clz32(t+1),r=this._int32()>>>32-n;for(;r>t;)r=this._int32()>>>32-n;let i=e[t];e[t]=e[r],e[r]=i}}choices(e,t){return e[vc(this._random_fn,t)]}};function vc(e,t){let n=0;for(let e=0;evc(bc.random,e),Sc=new _c,Cc=class{constructor(e){this.path=e}async match(e){let t=new gc(wr.join(this.path,e));if(t.exists)return t}async put(e,t,n=void 0){let r=wr.join(this.path,e),i=r+`.tmp.${O.IS_PROCESS_AVAILABLE?process.pid:Date.now()}.${Sc._int32().toString(36)}`;try{let e=t.headers.get(`Content-Length`),a=parseInt(e??`0`),o=0;await Cr.promises.mkdir(wr.dirname(r),{recursive:!0});let s=Cr.createWriteStream(i),c=t.body.getReader();for(;;){let{done:e,value:t}=await c.read();if(e)break;await new Promise((e,n)=>{s.write(t,t=>{if(t){n(t);return}e()})}),o+=t.length;let r=a?o/a*100:0;n?.({progress:r,loaded:o,total:a})}await new Promise((e,t)=>{s.close(n=>n?t(n):e())}),await Cr.promises.rename(i,r)}catch(e){try{await Cr.promises.unlink(i)}catch{}throw e}}async delete(e){let t=wr.join(this.path,e);try{return await Cr.promises.unlink(t),!0}catch{return!1}}},wc={400:`Bad request error occurred while trying to load file`,401:`Unauthorized access to file`,403:`Forbidden access to file`,404:`Could not locate file`,408:`Request timeout error occurred while trying to load file`,500:`Internal server error error occurred while trying to load file`,502:`Bad gateway error occurred while trying to load file`,503:`Service unavailable error occurred while trying to load file`,504:`Gateway timeout error occurred while trying to load file`},Tc=100,Ec=/^(\b[\w\-.]+\b\/)?\b[\w\-.]{1,96}\b$/;function Dc(...e){return e=e.map((t,n)=>(n&&(t=t.replace(/* @__PURE__ */ RegExp(`^/`),``)),n!==e.length-1&&(t=t.replace(/* @__PURE__ */ RegExp(`/$`),``)),t)),e.join(`/`)}function Oc(e,t=null,n=null){let r;try{r=new URL(e)}catch{return!1}return!(t&&!t.includes(r.protocol)||n&&!n.includes(r.hostname))}function kc(e){return!(!Ec.test(e)||e.includes(`..`)||e.includes(`--`)||e.endsWith(`.git`)||e.endsWith(`.ipynb`))}function Ac(e,t={},...n){return JSON.stringify([e,t.revision??`main`,t.cache_dir??null,t.local_files_only??!1,...n])}var jc=class extends Error{constructor(e,{status:t=null}={}){super(e),this.name=`ModelFileNotFoundError`,this.status=t}},Mc=/* @__PURE__ */ new Set([401,403,404]);function Nc(e,t,n){if(!n)return null;let r=`${wc[e]??`Error (${e}) occurred while trying to load file`}: "${t}".`;throw Mc.has(e)?new jc(r,{status:e}):Error(r)}async function Pc(e,t,n){let r=e.headers.get(`Content-Length`),i=r?parseInt(r,10):n??0;r===null&&!n&&A.warn(`Unable to determine content-length from response headers. Will expand buffer when needed.`);let a=new Uint8Array(i),o=0,s=e.body.getReader();async function c(){let{done:e,value:n}=await s.read();if(e)return;let r=o+n.length;if(r>i){i=r;let e=new Uint8Array(i);e.set(a),a=e}return a.set(n,o),o=r,t({progress:o/i*100,loaded:o,total:i}),c()}return await c(),a}function Fc(e){return Oc(e,[`blob:`])}function Ic(e,{allowUnresolved:t=!1}={}){let n;if(typeof location<`u`&&location.href)n=location.href;else if(import.meta.url)n=import.meta.url;else return e;try{return new URL(e,n).href}catch(n){if(!t)throw n;return e}}var Lc=`SHA-256`,Rc=`experimental_transformers-hash-cache`,zc=e=>({algorithm:Lc,value:e}),Bc=class{#e=null;_getHashCache=()=>(this.#e??=caches.open(Rc),this.#e);static isAvailable=()=>typeof navigator<`u`&&`crossOriginStorage`in navigator;match=async e=>{let t=await this._getFileHash(e);if(t)try{let e=await(await navigator.crossOriginStorage.requestFileHandle(zc(t))).getFile();return new Response(e,{headers:{"Content-Length":String(e.size)}})}catch{return}};put=async(e,t)=>{let n=await this._getFileHash(e);if(n){let e=await t.blob();await this._storeBlobInCOS(e,n)}else this._processAndStore(e,t.body)};_storeBlobInCOS=async(e,t)=>{let n=await(await navigator.crossOriginStorage.requestFileHandle(zc(t),{create:!0,origins:`*`})).createWritable();await n.write(e),await n.close()};_processAndStore=async(e,t)=>{try{let n=[];for await(let e of t)n.push(e);let r=new Blob(n),i=await this._getBlobHash(r);await this._storeBlobInCOS(r,i);try{await(await this._getHashCache()).put(e,new Response(i))}catch{}}catch{}};delete=async e=>{try{return await(await this._getHashCache()).delete(e)}catch{return!1}};_getFileHash=async e=>{try{let t=await this._getHashCache(),n=await t.match(e);if(n)return n.text();let r=await this._getLfsFileHash(e);return r?(await t.put(e,new Response(r)),r):null}catch{return null}};_getLfsFileHash=async e=>{if(!e.includes(`/resolve/`))return null;let t=e.replace(`/resolve/`,`/raw/`);try{let e=(await fetch(t).then(e=>e.text())).match(/^oid sha256:([0-9a-f]+)$/m);return e?e[1]:null}catch{return null}};_getBlobHash=async e=>{let t=await e.arrayBuffer(),n=await crypto.subtle.digest(Lc,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}};async function Vc(e=null){let t=null;if(k.useCustomCache){if(!k.customCache)throw Error("`env.useCustomCache=true`, but `env.customCache` is not defined.");if(!k.customCache.match||!k.customCache.put)throw Error("`env.customCache` must be an object which implements the `match` and `put` functions of the Web Cache API. For more information, see https://developer.mozilla.org/en-US/docs/Web/API/Cache");t=k.customCache}if(!t&&k.experimental_useCrossOriginStorage&&Bc.isAvailable()&&(t=new Bc),!t&&k.useBrowserCache){if(typeof caches>`u`)throw Error(`Browser cache is not available in this environment.`);try{t=await caches.open(k.cacheKey)}catch(e){A.warn(`An error occurred while opening the browser cache:`,e)}}if(!t&&k.useFSCache){if(!O.IS_FS_AVAILABLE)throw Error(`File System Cache is not available in this environment.`);t=new Cc(e??k.cacheDir)}return t}async function Hc(e,...t){for(let n of t)try{let t=await e.match(n);if(t)return t}catch{continue}}var Uc=new class{#e;#t;constructor(e){this.#e=e,this.#t=/* @__PURE__ */ new Map}get(e){if(!this.#t.has(e))return;let t=this.#t.get(e);return this.#t.delete(e),this.#t.set(e,t),t}put(e,t){this.#t.has(e)&&this.#t.delete(e),this.#t.set(e,t),this.#t.size>this.#e&&this.#t.delete(this.#t.keys().next().value)}delete(e){return this.#t.delete(e)}clear(){this.#t.clear()}}(100);function Wc(e,t){let n=Uc.get(e);if(n!==void 0)return n;let r=t().then(e=>e,t=>(Uc.delete(e),Promise.reject(t)));return Uc.put(e,r),r}async function Gc(e){if(!Oc(e,[`http:`,`https:`]))return null;let t=Yc(e);return t.set(`Range`,`bytes=0-0`),k.fetch(e,{method:`GET`,headers:t,cache:`no-store`})}function Kc(e,t,n={}){return Wc(Ac(e,n,t),()=>qc(e,t,n))}async function qc(e,t,n){let r=await Vc(n?.cache_dir),{localPath:i,remoteURL:a,proposedCacheKey:o,validModelId:s}=Xc(e,t,n,r),c=await Zc(r,i,o);if(c!==void 0&&typeof c!=`string`){let e=c.headers.get(`content-length`),t=c.headers.get(`content-type`);return{exists:!0,size:e?parseInt(e,10):void 0,contentType:t||void 0,fromCache:!0}}if(k.allowLocalModels&&!Oc(i,[`http:`,`https:`]))try{let e=await Jc(i);if(typeof e!=`string`&&e.status!==404){let t=e.headers.get(`content-length`),n=e.headers.get(`content-type`);return{exists:!0,size:t?parseInt(t,10):void 0,contentType:n||void 0,fromCache:!1}}}catch{}if(k.allowRemoteModels&&!n.local_files_only&&s){let e=await Gc(a);if(e&&e.status>=200&&e.status<300){let t,n=e.headers.get(`content-type`);if(e.status===206){let n=e.headers.get(`content-range`);if(n){let e=n.match(/bytes \d+-\d+\/(\d+)/);e&&(t=parseInt(e[1],10))}}else if(e.status===200)try{await e.body?.cancel()}catch{}if(t===void 0){let n=e.headers.get(`content-length`);t=n?parseInt(n,10):void 0}return{exists:!0,size:t,contentType:n||void 0,fromCache:!1}}e&&e.status!==404&&e.status!==416&&Nc(e.status,a,!0)}return{exists:!1,fromCache:!1}}async function Jc(e){return k.useFS&&!Oc(e,[`http:`,`https:`,`blob:`])?new gc(e instanceof URL?e.protocol===`file:`?e.pathname:e.toString():e):k.fetch(e,{headers:Yc(e)})}function Yc(e){let t=typeof process<`u`&&process?.release?.name===`node`,n=new Headers;if(t){let t=!!{}.TESTING_REMOTELY,r=k.version;if(n.set(`User-Agent`,`transformers.js/${r}; is_ci/${t};`),Oc(e,[`http:`,`https:`],[`huggingface.co`,`hf.co`])){let e={}.HF_TOKEN??{}.HF_ACCESS_TOKEN;e&&n.set(`Authorization`,`Bearer ${e}`)}}return n}function Xc(e,t,n={},r=null){let i=n.revision??`main`,a=Dc(e,t),o=kc(e),s=o?Dc(k.localModelPath,a):a,c=Dc(k.remoteHost,k.remotePathTemplate.replaceAll(`{model}`,e).replaceAll(`{revision}`,encodeURIComponent(i)),t);return{requestURL:a,localPath:s,remoteURL:c,proposedCacheKey:r instanceof Cc?i===`main`?a:Dc(e,i,t):c,validModelId:o}}async function Zc(e,t,n){if(e)return await Hc(e,t,n)}async function Qc(e,t,n,r,i,a,o={}){if(await n.match(r)===void 0&&!(typeof Cache<`u`&&n instanceof Cache&&!Oc(Ic(r,{allowUnresolved:!0}),[`http:`,`https:`]))){if(!a){let a=o.progress_callback?n=>ei(o.progress_callback,{status:`progress`,name:e,file:t,...n}):void 0;await n.put(r,i,a)}else if(typeof i!=`string`){let e=new Headers(i.headers);e.set(`content-length`,a.byteLength.toString()),await n.put(r,new Response(a,{headers:e})).catch(e=>{A.warn(`Unable to add response to browser cache: ${e}.`)})}}}async function $c(e,t,n=!0,r={},i=!1,a=null){let{requestURL:o,localPath:s,remoteURL:c,proposedCacheKey:l,validModelId:u}=Xc(e,t,r,a),d,f=!1,p;p=await Zc(a,s,l);let m=p!==void 0;if(m)d=l;else{if(k.allowLocalModels){if(!Oc(o,[`http:`,`https:`]))try{p=await Jc(s),d=s}catch(e){A.warn(`Unable to load from local path "${s}": "${e}"`)}else if(r.local_files_only)throw Error(`\`local_files_only=true\`, but attempted to load a remote file from: ${o}.`);else if(!k.allowRemoteModels)throw Error(`\`env.allowRemoteModels=false\`, but attempted to load a remote file from: ${o}.`)}if(p===void 0||typeof p!=`string`&&p.status===404){if(r.local_files_only||!k.allowRemoteModels){if(n)throw new jc(`\`local_files_only=true\` or \`env.allowRemoteModels=false\` and file was not found locally at "${s}".`);return null}if(!u)throw new jc(`Local file missing at "${s}" and download aborted due to invalid model ID "${e}".`);if(p=await Jc(c),p.status!==200)return Nc(p.status,c,n);d=l}f=a&&typeof Response<`u`&&p instanceof Response&&p.status===200}ei(r.progress_callback,{status:`download`,name:e,file:t});let h;if(!(O.IS_NODE_ENV&&i)){let n;if(typeof p!=`string`){if(!r.progress_callback)n=new Uint8Array(await p.arrayBuffer());else if(m&&typeof navigator<`u`&&/firefox/i.test(navigator.userAgent))n=new Uint8Array(await p.arrayBuffer()),ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n.length,total:n.length});else{let i,a=p.headers.get(`content-length`);if(a)i=parseInt(a,10);else try{let n=await Kc(e,t,r);n.size&&(i=n.size)}catch{}n=await Pc(p,n=>{ei(r.progress_callback,{status:`progress`,name:e,file:t,...n})},i)}}h=n}if(f&&d&&typeof p!=`string`&&await Qc(e,t,a,d,p,h,r),O.IS_NODE_ENV&&i&&r.progress_callback&&typeof p!=`string`){let n=parseInt(p.headers.get(`content-length`),10)||0;ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n,total:n})}if(ei(r.progress_callback,{status:`done`,name:e,file:t}),h){if(!O.IS_NODE_ENV&&i)throw Error(`Cannot return path in a browser environment.`);return h}if(p instanceof gc)return p.filePath;let g=await a?.match(d);if(g instanceof gc)return g.filePath;if(g instanceof Response)return new Uint8Array(await g.arrayBuffer());if(typeof g==`string`)return g;throw Error(`Unable to get model file path or buffer.`)}var el=/* @__PURE__ */ new Map;async function tl(e,t,n=!0,r={},i=!1){if(!k.allowLocalModels){if(r.local_files_only)throw Error("Invalid configuration detected: local models are disabled (`env.allowLocalModels=false`) but you have requested to only use local models (`local_files_only=true`).");if(!k.allowRemoteModels)throw Error("Invalid configuration detected: both local and remote models are disabled. Fix by setting `env.allowLocalModels` or `env.allowRemoteModels` to `true`.")}let a=Ac(e,r,t,n,i),{progress_callback:o}=r,s=o instanceof ti?o.loads:el,c=s.get(a);return c||(ei(o,{status:`initiate`,name:e,file:t}),c=Vc(r.cache_dir).then(a=>$c(e,t,n,r,i,a)),s===el&&(c=c.finally(()=>el.delete(a))),s.set(a,c)),await c}async function nl(e,t,n=!0,r={}){let i=await tl(e,t,n,r,!1);return i===null?null:new TextDecoder(`utf-8`).decode(i)}async function rl(e,t,n=!0,r={}){let i=await nl(e,t,n,r);return i===null?{}:JSON.parse(i)}function il(e,[t,n,r],[i,a],o=`bilinear`,s=!1){let c=a/r,l=i/n,u=new e.constructor(i*a*t),d=n*r,f=i*a;for(let o=0;o=0;--e)i[e]=a,r[e]=t[n[e]],a*=r[e];let a=n.map((e,t)=>i[n.indexOf(t)]),o=new e.constructor(e.length);for(let n=0;n=0;--e)r+=i%t[e]*a[e],i=Math.floor(i/t[e]);o[r]=e[n]}return[o,r]}function ol(e){let t=ll(e)[0],n=e.map(e=>Math.exp(e-t)),r=n.reduce((e,t)=>e+t,0);return n.map(e=>e/r)}function sl(e){let t=ll(e)[0],n=0;for(let r=0;re-t-r)}function cl(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;rt&&(t=e[r],n=r);return[t,n]}function ul(e){return e>0&&!(e&e-1)}var dl=class{constructor(e){if(this.size=e|0,this.size<=1||!ul(this.size))throw Error(`FFT size must be a power of two larger than 1`);this._csize=e<<1,this.table=new Float64Array(this.size*2);for(let e=0;ee;e<<=1)++t;this._width=t%2==0?t-1:t,this._bitrev=new Int32Array(1<>>t&3)<>>1);for(let t=0;t>>1]=e[t];return n}toComplexArray(e,t){let n=t||this.createComplexArray();for(let t=0;t>>1],n[t+1]=0;return n}transform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,1)}realTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._realTransform4(e,t,1)}inverseTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,-1);for(let t=0;t>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>2;for(o=0;o>>1,i>>>1)}else for(o=0,s=0;o>>1,i>>>1,n)}let l=this.table;for(i>>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>1,s=t>>>1,c=s>>>1;for(o=0;o>>1;for(let t=2;t>1;++t){let n=(t+1-e)**2/2,r=Math.sqrt(s**2+c**2)**n,o=n*Math.atan2(c,s),l=2*t;i[l]=r*Math.cos(o),i[l+1]=r*Math.sin(o),a[l]=i[l],a[l+1]=-i[l+1]}this._slicedChirpBuffer=i.subarray(t,n),this._f=new dl(r>>1),this._f.transform(this._chirpBuffer,a)}_transform(e,t,n){let r=this._buffer1,i=this._buffer2,a=this._outBuffer1,o=this._outBuffer2,s=this._chirpBuffer,c=this._slicedChirpBuffer,l=this._a;if(n)for(let e=0;e>1];r[e]=i*c[e],r[n]=i*c[n]}else for(let e=0;e=e.length&&(i=2*(e.length-1)-i),r[a++]=e[i]}r.sort(),n[t]=r[i]}return n}function hl(e,t){let n=10**t;return Math.round(e*n)/n}function gl(e){let t=Math.round(e);return Math.abs(e)%1==.5?t%2==0?t:t-1:t}function _l(e){let t=e.length,n=e[0].length,r=[t+1,n+1],i=Array.from({length:r[0]},()=>Array(r[1]).fill(1/0));i[0][0]=0;let a=Array.from({length:r[0]},()=>Array(r[1]).fill(-1));for(let t=1;t0||s>0;)switch(c.push(o-1),l.push(s-1),a[o][s]){case 0:--o,--s;break;case 1:--o;break;case 2:--s;break;default:throw Error(`Internal error in dynamic time warping. Unexpected trace[${o}, ${s}]. Please file a bug report.`)}return c.reverse(),l.reverse(),[c,l]}var vl=/* @__PURE__ */ (function(){let e=null;return function(t){if(!e){e=/* @__PURE__ */ new Float32Array(65536);let t=/* @__PURE__ */ new ArrayBuffer(4),n=new Uint32Array(t),r=new Float32Array(t);for(let t=0;t>10,s=t&1023;if(o===31)i=a|2139095040|s<<13;else if(o===0){if(s===0)i=a;else{let e=113;for(;!(s&1024);)s<<=1,--e;s&=-1025,i=a|e<<23|s<<13}}else i=a|o+112<<23|s<<13;n[0]=i,e[t]=r[0]}}let n=t.length,r=e,i=new Float32Array(n);for(let e=0;e[`webgpu`,`cuda`,`dml`,`webnn-gpu`].includes(e))}if(El.includes(e))return[Cl[e]??e];throw Error(`Unsupported device: "${e}". Should be one of: ${El.join(`, `)}.`)}var Ml=Promise.resolve(),Nl=null;async function Pl(){if(Nl)return Nl;if(!(k.useWasmCache&&typeof zl?.wasm?.wasmPaths==`object`&&zl?.wasm?.wasmPaths?.wasm&&zl?.wasm?.wasmPaths?.mjs)){if(O.IS_DENO_WEB_RUNTIME)throw Error(`env.useWasmCache=false is not supported in Deno's web runtime. Remove the useWasmCache override.`);return Nl=Promise.resolve(),Nl}return Nl=(async()=>{let e=zl.wasm.wasmPaths,t=!1;await Promise.all([e.wasm&&!Fc(e.wasm)?(async()=>{try{let n=await xl(Ic(e.wasm));n&&(zl.wasm.wasmBinary=n,t=!0)}catch(e){A.warn(`Failed to pre-load WASM binary:`,e)}})():Promise.resolve(),e.mjs&&!Fc(e.mjs)?(async()=>{try{let t=await Sl(Ic(e.mjs));t&&(zl.wasm.wasmPaths.mjs=t)}catch(e){A.warn(`Failed to pre-load WASM factory:`,e)}})():Promise.resolve()]),t||(zl.wasm.wasmPaths.mjs=e.mjs)})(),Nl}async function Fl(e,t,n){await Pl();let r=wl(k.logLevel??Xr.WARNING),i=()=>Al.create(e,{logSeverityLevel:r,...t}),a=await(O.IS_WEB_ENV?Ml=Ml.then(i):i());return a.config=n,a}var Il=Promise.resolve();async function Ll(e,t){let n=()=>e.run(t);return O.IS_WEB_ENV?Il=Il.then(n):n()}function Rl(e){return e instanceof Ol.Tensor}var zl=Ol?.env;function Bl(){return zl?.wasm?.proxy}if(zl){let e=function(e){zl.logLevel=Tl[wl(e)]};if(zl.wasm){if(!(typeof ServiceWorkerGlobalScope<`u`&&self instanceof ServiceWorkerGlobalScope)&&zl.versions?.web&&!zl.wasm.wasmPaths){let e=`https://cdn.jsdelivr.net/npm/onnxruntime-web@${zl.versions.web}/dist/`,t=`.asyncify`;O.IS_SAFARI_BELOW_26&&!O.IS_WEBGPU_AVAILABLE&&(t=``),zl.wasm.wasmPaths={mjs:`${e}ort-wasm-simd-threaded${t}.mjs`,wasm:`${e}ort-wasm-simd-threaded${t}.wasm`}}zl.wasm.proxy=!1}zl.webgpu&&(zl.webgpu.powerPreference=`high-performance`),e(k.logLevel??Xr.WARNING),k.backends.onnx={...zl,setLogLevel:e}}var Vl=async(e,t,n)=>{let r=await Fl(new Uint8Array(e),t);return(async e=>{let t=Bl(),i=Object.fromEntries(Object.entries(e).map(([e,n])=>[e,(t?n.clone():n).ort_tensor])),a=await Ll(r,i);return Array.isArray(n)?n.map(e=>new V(a[e])):new V(a[n])})},Hl=class{static session_options={};static get nearest_interpolate_4d(){return this._nearest_interpolate_4d||=Vl([8,10,18,0,58,129,1,10,41,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,18,10,4,109,111,100,101,34,7,110,101,97,114,101,115,116,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,21],this.session_options,`y`),this._nearest_interpolate_4d}static get bilinear_interpolate_4d(){return this._bilinear_interpolate_4d||=Vl([8,9,18,0,58,128,1,10,40,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,17,10,4,109,111,100,101,34,6,108,105,110,101,97,114,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bilinear_interpolate_4d}static get bicubic_interpolate_4d(){return this._bicubic_interpolate_4d||=Vl([8,9,18,0,58,127,10,39,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,16,10,4,109,111,100,101,34,5,99,117,98,105,99,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bicubic_interpolate_4d}static get matmul(){return this._matmul||=Vl([8,9,18,0,58,55,10,17,10,1,97,10,1,98,18,1,99,34,6,77,97,116,77,117,108,18,1,114,90,9,10,1,97,18,4,10,2,8,1,90,9,10,1,98,18,4,10,2,8,1,98,9,10,1,99,18,4,10,2,8,1,66,2,16,20],this.session_options,`c`),this._matmul}static get stft(){return this._stft||=Vl([8,7,18,0,58,148,1,10,38,10,1,115,10,1,106,10,1,119,10,1,108,18,1,111,34,4,83,84,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,115,90,26,10,1,115,18,21,10,19,8,1,18,15,10,3,18,1,98,10,3,18,1,115,10,3,18,1,99,90,11,10,1,106,18,6,10,4,8,7,18,0,90,16,10,1,119,18,11,10,9,8,1,18,5,10,3,18,1,119,90,11,10,1,108,18,6,10,4,8,7,18,0,98,31,10,1,111,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,102,10,3,18,1,100,10,3,18,1,99,66,2,16,17],this.session_options,`o`),this._stft}static get rfft(){return this._rfft||=Vl([8,9,58,93,10,33,10,1,120,10,0,10,1,97,18,1,121,34,3,68,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,100,90,19,10,1,120,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,1,90,11,10,1,97,18,6,10,4,8,7,18,0,98,19,10,1,121,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,2,66,2,16,20],this.session_options,`y`),this._rfft}static get top_k(){return this._top_k||=Vl([8,10,18,0,58,73,10,18,10,1,120,10,1,107,18,1,118,18,1,105,34,4,84,111,112,75,18,1,116,90,9,10,1,120,18,4,10,2,8,1,90,15,10,1,107,18,10,10,8,8,7,18,4,10,2,8,1,98,9,10,1,118,18,4,10,2,8,1,98,9,10,1,105,18,4,10,2,8,7,66,2,16,21],this.session_options,[`v`,`i`]),this._top_k}static get slice(){return this._slice||=Vl([8,7,18,0,58,96,10,25,10,1,120,10,1,115,10,1,101,10,1,97,10,1,116,18,1,121,34,5,83,108,105,99,101,18,1,114,90,9,10,1,120,18,4,10,2,8,1,90,9,10,1,115,18,4,10,2,8,7,90,9,10,1,101,18,4,10,2,8,7,90,9,10,1,97,18,4,10,2,8,7,90,9,10,1,116,18,4,10,2,8,7,98,9,10,1,121,18,4,10,2,8,1,66,2,16,13],this.session_options,`y`),this._slice}},Ul=Object.freeze({auto:`auto`,gpu:`gpu`,cpu:`cpu`,wasm:`wasm`,webgpu:`webgpu`,cuda:`cuda`,dml:`dml`,coreml:`coreml`,webnn:`webnn`,"webnn-npu":`webnn-npu`,"webnn-gpu":`webnn-gpu`,"webnn-cpu":`webnn-cpu`}),Wl=O.IS_NODE_ENV?`cpu`:`wasm`;function Gl(e,t,{warn:n}={}){return e?typeof e==`string`?e:e.hasOwnProperty(t)?e[t]:(n&&n(`device not specified for "${t}". Using the default device (${Wl}).`),Wl):Wl}var Kl=/* @__PURE__ */ (function(){let e;return async function(){if(e===void 0){if(!O.IS_WEBGPU_AVAILABLE)e=!1;else try{e=(await navigator.gpu.requestAdapter()).features.has(`shader-f16`)}catch{e=!1}}return e}})(),ql=Object.freeze({auto:`auto`,fp32:`fp32`,fp16:`fp16`,q8:`q8`,int8:`int8`,uint8:`uint8`,q4:`q4`,bnb4:`bnb4`,q4f16:`q4f16`,q2:`q2`,q2f16:`q2f16`,q1:`q1`,q1f16:`q1f16`}),Jl=ql.fp32,Yl=Object.freeze({[Ul.wasm]:ql.q8}),Xl=Object.freeze({[ql.fp32]:``,[ql.fp16]:`_fp16`,[ql.int8]:`_int8`,[ql.uint8]:`_uint8`,[ql.q8]:`_quantized`,[ql.q4]:`_q4`,[ql.q2]:`_q2`,[ql.q1]:`_q1`,[ql.q4f16]:`_q4f16`,[ql.q2f16]:`_q2f16`,[ql.q1f16]:`_q1f16`,[ql.bnb4]:`_bnb4`});function Zl(e,t,n,{configDtype:r=null,warn:i}={}){let a,o=!1;e&&typeof e!=`string`?e.hasOwnProperty(t)?a=e[t]:(a=null,o=!0):a=e;let s;if(a===ql.auto){if(r){let e=typeof r==`string`?r:r?.[t];if(e&&e!==ql.auto&&ql.hasOwnProperty(e))return e}s=Yl[n]??Jl}else s=a&&ql.hasOwnProperty(a)?a:Yl[n]??Jl;return o&&i&&i(`dtype not specified for "${t}". Using the default dtype (${s}) for this device (${n}).`),s}var Ql=Object.freeze({float32:Float32Array,float16:typeof Float16Array<`u`?Float16Array:Uint16Array,float64:Float64Array,string:Array,int8:Int8Array,uint8:Uint8Array,int16:Int16Array,uint16:Uint16Array,int32:Int32Array,uint32:Uint32Array,int64:BigInt64Array,uint64:BigUint64Array,bool:Uint8Array,uint4:Uint8Array,int4:Int8Array}),V=class e{get dims(){return this.ort_tensor.dims}set dims(e){this.ort_tensor.dims=e}get type(){return this.ort_tensor.type}get data(){return this.ort_tensor.data}get size(){return this.ort_tensor.size}get location(){return this.ort_tensor.location}ort_tensor;constructor(...e){return this.ort_tensor=Rl(e[0])?e[0]:new br(e[0],e[1],e[2]),new Proxy(this,{get:(e,t)=>{if(typeof t==`string`){let n=Number(t);if(Number.isInteger(n))return e._getitem(n)}return e[t]},set:(e,t,n)=>e[t]=n})}dispose(){this.ort_tensor.dispose()}*[Symbol.iterator](){let[e,...t]=this.dims;if(t.length>0){let n=t.reduce((e,t)=>e*t);for(let r=0;r0){let e=r.reduce((e,t)=>e*t);return this._subarray(t,e,r)}return new e(this.type,[this.data[t]],r)}_subarray(t,n,r){let i=t*n,a=(t+1)*n,o=`subarray`in this.data?this.data.subarray(i,a):this.data.slice(i,a);return new e(this.type,o,r)}item(){let e=this.data;if(e.length!==1)throw Error(`a Tensor with ${e.length} elements cannot be converted to Scalar`);return e[0]}tolist(){return $l(this.data,this.dims)}sigmoid(){return this.clone().sigmoid_()}sigmoid_(){let e=this.data;for(let t=0;t0||r>0&&n<0?r+n:r}return this}clone(){return new e(this.type,this.data.slice(),this.dims.slice())}slice(...t){let n=[],r=[];for(let e=0;ea)throw Error(`Invalid slice: ${i}`);let o=[Math.max(t,0),Math.min(a,this.dims[e])];r.push(o),n.push(o[1]-o[0])}else throw Error(`Invalid slice: ${i}`)}let i=r.map(([e,t])=>t-e),a=i.reduce((e,t)=>e*t),o=this.data,s=new o.constructor(a),c=this.stride(),l=!0;for(let e=1;e=0;--n){let e=i[n];t+=(a%e+r[n][0])*c[n],a=Math.floor(a/e)}s[e]=o[t]}return new e(this.type,s,n)}permute(...e){return eu(this,e)}transpose(...e){return this.permute(...e)}sum(e=null,t=!1){return this.norm(1,e,t)}norm(t=`fro`,n=null,r=!1){if(t===`fro`)t=2;else if(typeof t==`string`)throw Error(`Unsupported norm: ${t}`);let i=this.data,a=i instanceof BigInt64Array||i instanceof BigUint64Array;if(a&&t!==1)throw Error(`Expected a floating point tensor as input. Got ${this.type}`);let o,s;if(a?(o=(e,t)=>e+t,s=0n):(o=(e,n)=>e+n**t,s=0),n===null){let n=i.reduce(o,s);return t!==1&&(n**=1/t),new e(this.type,[n],[])}let[c,l,u]=fu(o,this,n,r);if(t!==1)for(let e=0;e=0;--r){let e=this.dims[r];if(r!==t){let t=i%e;n+=t*a,a*=this.dims[r]}i=Math.floor(i/e)}r[e]/=i[n]}return this}normalize(e=2,t=1){return this.clone().normalize_(e,t)}stride(){return hu(this.dims)}squeeze(t=null){return new e(this.type,this.data,cu(this.dims,t))}squeeze_(e=null){return this.dims=cu(this.dims,e),this}unsqueeze(t){return new e(this.type,this.data,lu(this.dims,t))}unsqueeze_(e){return this.dims=lu(this.dims,e),this}flatten_(e=0,t=-1){t=(t+this.dims.length)%this.dims.length;let n=this.dims.slice(0,e),r=this.dims.slice(e,t+1),i=this.dims.slice(t+1);return this.dims=[...n,r.reduce((e,t)=>e*t,1),...i],this}flatten(e=0,t=-1){return this.clone().flatten_(e,t)}view(...t){let n=-1;for(let e=0;er===n?e:e*t,1);t[n]=r.length/e}return new e(this.type,r,t)}neg_(){let e=this.data;for(let t=0;tt);return new e(`bool`,n,this.dims)}lt(t){let n=new Uint8Array(this.data.length),r=this.data;for(let e=0;eMath.min(e,t),this,t,n,1/0);return new e(r,i,a)}max(t=null,n=!1){if(t===null){let t=ll(this.data)[0];return new e(this.type,[t],[])}let[r,i,a]=fu((e,t)=>Math.max(e,t),this,t,n,-1/0);return new e(r,i,a)}argmin(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=cl(this.data)[1];return new e(`int64`,[BigInt(r)],[])}argmax(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=ll(this.data)[1];return new e(`int64`,[BigInt(r)],[])}repeat(...t){if(t.lengthe===1)){if(t.length===this.dims.length)return this.clone();let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims);return new e(this.type,this.data.slice(),r)}let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims),i=r.map((e,n)=>e*t[n]),a=i.reduce((e,t)=>e*t,1),o=this.data,s=new o.constructor(a),c=hu(r),l=hu(i);for(let e=0;eBigInt(Math.floor(e)):BigInt;else if(this.type===`float16`&&t==`float32`&&this.data instanceof Uint16Array)return new e(t,vl(this.data),this.dims);return new e(t,Ql[t].from(this.data,n),this.dims)}};function $l(e,t){let n=e.length;if(n!==(t.length===0?1:t.reduce((e,t)=>e*t)))throw Error(`cannot reshape array of size ${n} into shape (${t})`);let r=e;for(let e=t.length-1;e>=0;e--)r=r.reduce((n,r)=>{let i=n[n.length-1];return i.lengthnew V(`int64`,e,[e.length]);async function ou(e,t,n,r,i){return await(await Hl.slice)({x:e,s:au(t),e:au(n),a:au(r),t:au(i??Array(r.length).fill(1))})}function su(e,t){let n=e.data,r=t.data,i=[e.dims[0],e.dims[2]],a=new n.constructor(i[0]*i[1]),[o,s,c]=e.dims,l=0;for(let e=0;ee!==1):typeof t==`number`?e[t]===1&&e.splice(t,1):Array.isArray(t)&&(e=e.filter((e,n)=>e!==1||!t.includes(n))),e}function lu(e,t){return t=uu(t,e.length+1),e=e.slice(),e.splice(t,0,1),e}function uu(e,t,n=null,r=!0){if(e<-t||e>=t){if(r)throw Error(`IndexError: index ${e} is out of bounds for dimension${n===null?``:` `+n} with size ${t}`);return e<-t?0:t}return e<0&&(e=(e%t+t)%t),e}function H(e,t=0){t=uu(t,e[0].dims.length);let n=e[0].dims.slice();n[t]=e.reduce((e,n)=>e+n.dims[t],0);let r=n.reduce((e,t)=>e*t,1),i=new e[0].data.constructor(r),a=e[0].type;if(t===0){let t=0;for(let n of e){let e=n.data;i.set(e,t),t+=e.length}}else{let r=0;for(let a=0;a=0;--i){let e=s[i],l=o%e;i===t&&(l+=r),a+=l*c,c*=n[i],o=Math.floor(o/e)}i[a]=o[e]}r+=s[t]}}return new V(a,i,n)}function du(e,t=0){return H(e.map(e=>e.unsqueeze(t)),t)}function fu(e,t,n,r=!1,i=null){let a=t.data,o=t.dims;n=uu(n,o.length);let s=o.slice();s[n]=1;let c=new a.constructor(a.length/o[n]);i!==null&&c.fill(i);for(let t=0;t=0;--e){let t=o[e];if(e!==n){let n=i%t;r+=n*a,a*=s[e]}i=Math.floor(i/t)}c[r]=e(c[r],a[t],t,r)}return r||s.splice(n,1),[t.type,c,s]}function pu(e,t=null,n=1,r=!1){let i=e.data,a=e.dims;if(t===null){let t=i.reduce((e,t)=>e+t,0)/i.length,r=Math.sqrt(i.reduce((e,n)=>e+(n-t)**2,0)/(i.length-n)),a=new V(e.type,[t],[]);return[new V(e.type,[r],[]),a]}t=uu(t,a.length);let o=mu(e,t,r),s=o.data,[c,l,u]=fu((e,t,n,r)=>e+(t-s[r])**2,e,t,r);for(let e=0;ee+t,0);return new V(e.type,[t/i.length],[])}t=uu(t,r.length);let[a,o,s]=fu((e,t)=>e+t,e,t,n);if(r[t]!==1)for(let e=0;e=0;--n)t[n]=r,r*=e[n];return t}function gu(e,t,n,r){return new V(n,new r(e.reduce((e,t)=>e*t,1)).fill(t),e)}function _u(e,t){let n,r;if(typeof t==`number`)n=`float32`,r=Float32Array;else if(typeof t==`bigint`)n=`int64`,r=BigInt64Array;else if(typeof t==`boolean`)n=`bool`,r=Uint8Array;else throw Error(`Unsupported data type: ${typeof t}`);return gu(e,t,n,r)}function vu(e,t){return _u(e.dims,t)}function yu(e){return gu(e,1n,`int64`,BigInt64Array)}function bu(e){return yu(e.dims)}function xu(e){return gu(e,0n,`int64`,BigInt64Array)}function Su(e){return xu(e.dims)}function Cu(e){let t=e.reduce((e,t)=>e*t,1);return new V(`float32`,Float32Array.from({length:t},()=>bc.gauss()),e)}function wu(e,t){if(e.dims.length!==2)throw Error(`The tensor must have 2 dimensions`);if(e.dims.at(-1)%8!=0)throw Error(`The last dimension of the tensor must be a multiple of 8`);if(![`binary`,`ubinary`].includes(t))throw Error(`The precision must be either 'binary' or 'ubinary'`);let n=t===`binary`,r=n?`int8`:`uint8`,i=n?Int8Array:Uint8Array,a=e.data,o=new i(a.length/8);for(let e=0;e0),r=Math.floor(e/8),i=e%8;o[r]|=t<<7-i,n&&i===0&&(o[r]-=128)}return new V(r,o,[e.dims[0],e.dims[1]/8])}async function Tu(e){if(!e)throw Error(`modelId is required for get_tokenizer_files`);return(await Kc(e,`tokenizer_config.json`,{})).exists?[`tokenizer.json`,`tokenizer_config.json`]:[]}async function Eu(e,t){let n=await Tu(e);return await Promise.all(n.map(n=>rl(e,n,!0,t)))}function Du(e){let t=e.dims;switch(t.length){case 1:return e.tolist();case 2:if(t[0]!==1)throw Error("Unable to decode tensor with `batch size !== 1`. Use `tokenizer.batch_decode(...)` for batched inputs.");return e.tolist()[0];default:throw Error(`Expected tensor to have 1-2 dimensions, got ${t.length}.`)}}var Ou=[`bos_token`,`eos_token`,`unk_token`,`sep_token`,`pad_token`,`cls_token`,`mask_token`];function ku(e,t,n,r){for(let i of Object.keys(e)){let a=t-e[i].length,o=n(i),s=Array(a).fill(o);e[i]=r===`right`?ai(e[i],s):ai(s,e[i])}}function Au(e,t){for(let n of Object.keys(e))e[n].length=t}function ju(e,...t){for(let n of t){if(!Object.hasOwn(e,n))continue;let t=e[n];if(t){if(typeof t==`object`){if(t.__type===`AddedToken`)return t.content;throw Error(`Unknown token: ${t}`)}return t}}return null}function Mu(e){let t=[];for(let n of e.get_added_tokens_decoder().values())n.special&&t.push(n);return t}var U=class extends $r{return_token_type_ids=!1;padding_side=`right`;constructor(e,t){if(super(),this._tokenizerJSON=e,this._tokenizerConfig=t,this._tokenizer=new Do(e,t),this.config=t,this.padding_side=t.padding_side??this.padding_side,this.mask_token=ju(t,`mask_token`),this.mask_token_id=this._tokenizer.token_to_id(this.mask_token),this.pad_token=ju(t,`pad_token`,`eos_token`),this.pad_token_id=this._tokenizer.token_to_id(this.pad_token),this.sep_token=ju(t,`sep_token`),this.sep_token_id=this._tokenizer.token_to_id(this.sep_token),this.unk_token=ju(t,`unk_token`),this.unk_token_id=this._tokenizer.token_to_id(this.unk_token),this.bos_token=ju(t,`bos_token`),this.bos_token_id=this._tokenizer.token_to_id(this.bos_token),this.eos_token=ju(t,`eos_token`),this.eos_token_id=this._tokenizer.token_to_id(this.eos_token),this.chat_template=t.chat_template??null,Array.isArray(this.chat_template)){let e=/* @__PURE__ */ Object.create(null);for(let{name:t,template:n}of this.chat_template){if(typeof t!=`string`||typeof n!=`string`)throw Error(`Chat template must be a list of objects with "name" and "template" properties`);e[t]=n}this.chat_template=e}this._compiled_template_cache=/* @__PURE__ */ new Map;let n=Mu(this._tokenizer);this.all_special_ids=n.map(e=>e.id),this.all_special_tokens=n.map(e=>e.content)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let o=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a});return new this(...o)}get_vocab(){return this._tokenizer.get_vocab()}get model_max_length(){return this._tokenizerConfig.model_max_length??1/0}get add_eos_token(){return this._tokenizerConfig.add_eos_token}get add_bos_token(){return this._tokenizerConfig.add_bos_token}convert_tokens_to_ids(e){return typeof e==`string`?this._tokenizer.token_to_id(e):e.map(e=>this._tokenizer.token_to_id(e))}_call(e,t={}){let{text_pair:n=null,add_special_tokens:r=!0,padding:i=!1,return_token_type_ids:a=null}=t,{truncation:o=null,max_length:s=null}=t,c=t.return_tensor??!0,l=Array.isArray(e),u;if(l){if(e.length===0)throw Error(`text array must be non-empty`);if(n!==null){if(!Array.isArray(n))throw Error(`text_pair must also be an array`);if(e.length!==n.length)throw Error(`text and text_pair must have the same length`);u=e.map((e,t)=>this._encode_plus(e,{text_pair:n[t],add_special_tokens:r,return_token_type_ids:a}))}else u=e.map(e=>this._encode_plus(e,{add_special_tokens:r,return_token_type_ids:a}))}else{if(e==null)throw Error(`text may not be null or undefined`);if(Array.isArray(n))throw Error("When specifying `text_pair`, since `text` is a string, `text_pair` must also be a string (i.e., not an array).");u=[this._encode_plus(e,{text_pair:n,add_special_tokens:r,return_token_type_ids:a})]}if(s===null?s=this.model_max_length:o===null&&(i===!0?(A.warn("`max_length` is ignored when `padding: true` and there is no truncation strategy. To pad to max length, use `padding: 'max_length'`."),s=this.model_max_length):i===!1&&(A.warn("Truncation was not explicitly activated but `max_length` is provided a specific value, please use `truncation: true` to explicitly truncate examples to max length."),o=!0)),i===!0&&(s=Math.min(ll(u.map(e=>e.input_ids.length))[0],s??1/0)),s=Math.min(s,this.model_max_length??1/0),i||o)for(let e=0;es?o&&Au(u[e],s):i&&ku(u[e],s,e=>e===`input_ids`?this.pad_token_id:0,this.padding_side);let d={};if(c){if(!(i&&o)&&u.some(e=>{for(let t of Object.keys(e))if(e[t].length!==u[0][t]?.length)return!0;return!1}))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=true' and 'truncation=true' to have batched tensors with the same length.`);let e=[u.length,u[0].input_ids.length];for(let t of Object.keys(u[0]))d[t]=new V(`int64`,BigInt64Array.from(u.flatMap(e=>e[t]).map(BigInt)),e)}else{for(let e of Object.keys(u[0]))d[e]=u.map(t=>t[e]);if(!l)for(let e of Object.keys(d))d[e]=d[e][0]}return d}_encode_text(e){return e===null?null:this._tokenizer.encode(e).tokens}_encode_plus(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{ids:i,attention_mask:a,token_type_ids:o}=this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r??this.return_token_type_ids});return{input_ids:i,attention_mask:a,...o?{token_type_ids:o}:{}}}tokenize(e,{pair:t=null,add_special_tokens:n=!1}={}){return this._tokenizer.tokenize(e,{text_pair:t,add_special_tokens:n})}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){return this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r}).ids}batch_decode(e,t={}){return e instanceof V&&(e=e.tolist()),e.map(e=>this.decode(e,t))}decode(e,t={}){if(e instanceof V&&(e=Du(e)),!Array.isArray(e)||e.length===0||!ni(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);return this.decode_single(e,t)}decode_single(e,{skip_special_tokens:t=!1,clean_up_tokenization_spaces:n=null}){return this._tokenizer.decode(e,{skip_special_tokens:t,clean_up_tokenization_spaces:n})}get_chat_template({chat_template:e=null,tools:t=null}={}){if(this.chat_template&&typeof this.chat_template==`object`){let n=this.chat_template;if(e!==null&&Object.hasOwn(n,e))e=n[e];else if(e===null){if(t!==null&&`tool_use`in n)e=n.tool_use;else if(`default`in n)e=n.default;else throw Error(`This model has multiple chat templates with no default specified! Please either pass a chat template or the name of the template you wish to use to the 'chat_template' argument. Available template names are ${Object.keys(n).sort()}.`)}}else if(e===null){if(this.chat_template)e=this.chat_template;else throw Error(`Cannot use apply_chat_template() because tokenizer.chat_template is not set and no template argument was passed! For information about writing templates and setting the tokenizer.chat_template attribute, please see the documentation at https://huggingface.co/docs/transformers/main/en/chat_templating`)}return e}apply_chat_template(e,t={}){let{tools:n=null,documents:r=null,chat_template:i=null,add_generation_prompt:a=!1,tokenize:o=!0,padding:s=!1,truncation:c=!1,max_length:l=null,return_tensor:u=!0,return_dict:d=!0,tokenizer_kwargs:f={},...p}=t;if(i=this.get_chat_template({chat_template:i,tools:n}),typeof i!=`string`)throw Error(`chat_template must be a string, but got ${typeof i}`);let m=this._compiled_template_cache.get(i);m===void 0&&(m=new mc(i),this._compiled_template_cache.set(i,m));let h=/* @__PURE__ */ Object.create(null);for(let e of Ou){let t=ju(this.config,e);t&&(h[e]=t)}let g=m.render({messages:e,add_generation_prompt:a,tools:n,documents:r,...h,...p});if(o){let e=this._call(g,{add_special_tokens:!1,padding:s,truncation:c,max_length:l,return_tensor:u,...f});return d?e:e.input_ids}return g}};function Nu(e,t,n,r){if(!(`language_codes`in e)||!Array.isArray(e.language_codes))throw Error("Tokenizer must have `language_codes` attribute set and it should be an array of language ids.");if(!(`languageRegex`in e)||!(e.languageRegex instanceof RegExp))throw Error("Tokenizer must have `languageRegex` attribute set and it should be a regular expression.");if(!(`lang_to_token`in e)||typeof e.lang_to_token!=`function`)throw Error("Tokenizer must have `lang_to_token` attribute set and it should be a function.");let i=r.src_lang,a=r.tgt_lang;if(!e.language_codes.includes(a))throw Error(`Target language code "${a}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);if(i!==void 0){if(!e.language_codes.includes(i))throw Error(`Source language code "${i}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);let t=e._tokenizer.post_processor?.config;if(t&&`single`in t){for(let n of t.single)if(`SpecialToken`in n&&e.languageRegex.test(n.SpecialToken.id)){n.SpecialToken.id=e.lang_to_token(i);break}}}return r.forced_bos_token_id=e._tokenizer.token_to_id(e.lang_to_token(a)),e._call(t,n)}var Pu={};Sr(Pu,{AlbertTokenizer:()=>Fu,AutoTokenizer:()=>W,BartTokenizer:()=>Iu,BertTokenizer:()=>Lu,BlenderbotSmallTokenizer:()=>Ru,BlenderbotTokenizer:()=>zu,BloomTokenizer:()=>Bu,CLIPTokenizer:()=>Hu,CamembertTokenizer:()=>Vu,CodeGenTokenizer:()=>Wu,CodeLlamaTokenizer:()=>Uu,CohereAsrTokenizer:()=>Ku,CohereTokenizer:()=>Gu,ConvBertTokenizer:()=>qu,DebertaTokenizer:()=>Yu,DebertaV2Tokenizer:()=>Ju,DistilBertTokenizer:()=>Xu,ElectraTokenizer:()=>Zu,EsmTokenizer:()=>Qu,FalconTokenizer:()=>$u,GPT2Tokenizer:()=>nd,GPTNeoXTokenizer:()=>td,GemmaTokenizer:()=>ed,HerbertTokenizer:()=>rd,LlamaTokenizer:()=>id,M2M100Tokenizer:()=>ad,MBart50Tokenizer:()=>cd,MBartTokenizer:()=>sd,MPNetTokenizer:()=>dd,MarianTokenizer:()=>od,MgpstrTokenizer:()=>ld,MobileBertTokenizer:()=>ud,NllbTokenizer:()=>fd,NougatTokenizer:()=>pd,PreTrainedTokenizer:()=>U,Qwen2Tokenizer:()=>md,RoFormerTokenizer:()=>gd,RobertaTokenizer:()=>hd,SiglipTokenizer:()=>_d,SpeechT5Tokenizer:()=>vd,SqueezeBertTokenizer:()=>yd,T5Tokenizer:()=>bd,TokenizersBackend:()=>U,VitsTokenizer:()=>Sd,Wav2Vec2CTCTokenizer:()=>Cd,WhisperTokenizer:()=>Ad,XLMRobertaTokenizer:()=>jd,XLMTokenizer:()=>Md});var Fu=class extends U{return_token_type_ids=!0},Iu=class extends U{},Lu=class extends U{return_token_type_ids=!0},Ru=class extends U{},zu=class extends U{},Bu=class extends U{},Vu=class extends U{},Hu=class extends U{},Uu=class extends U{},Wu=class extends U{},Gu=class extends U{},Ku=class extends U{},qu=class extends U{return_token_type_ids=!0},Ju=class extends U{return_token_type_ids=!0},Yu=class extends U{return_token_type_ids=!0},Xu=class extends U{},Zu=class extends U{return_token_type_ids=!0},Qu=class extends U{},$u=class extends U{},ed=class extends U{},td=class extends U{},nd=class extends U{},rd=class extends U{return_token_type_ids=!0},id=class extends U{padding_side=`left`},ad=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^__[a-z]{2,3}__$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e.slice(2,-2)),this.lang_to_token=e=>`__${e}__`}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},od=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^(>>\w+<<)\s*/g,this.supported_language_codes=Array.from(this.get_vocab().keys()).filter(e=>this.languageRegex.test(e)),A.warn('WARNING: `MarianTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}_encode_text(e){if(e===null)return null;let[t,...n]=e.trim().split(this.languageRegex);if(n.length===0)return super._encode_text(t);if(n.length===2){let[e,t]=n;return this.supported_language_codes.includes(e)||A.warn(`Unsupported language code "${e}" detected, which may lead to unexpected behavior. Should be one of: ${JSON.stringify(this.supported_language_codes)}`),ai([e],super._encode_text(t))}}},sd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{2}_[A-Z]{2}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},cd=class extends sd{},ld=class extends U{},ud=class extends U{return_token_type_ids=!0},dd=class extends U{},fd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{3}_[A-Z][a-z]{3}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},pd=class extends U{},md=class extends U{},hd=class extends U{},gd=class extends U{return_token_type_ids=!0},_d=class extends U{},vd=class extends U{},yd=class extends U{return_token_type_ids=!0},bd=class extends U{},xd=class extends mo{decode_chain(e){let t=``;for(let n=1;n[t,e]),[`burmese`,`my`],[`valencian`,`ca`],[`flemish`,`nl`],[`haitian`,`ht`],[`letzeburgesch`,`lb`],[`pushto`,`ps`],[`panjabi`,`pa`],[`moldavian`,`ro`],[`moldovan`,`ro`],[`sinhalese`,`si`],[`castilian`,`es`]]);function Dd(e){e=e.toLowerCase();let t=Ed.get(e);if(t===void 0){let n=e.match(/^<\|([a-z]{2})\|>$/);if(n&&(e=n[1]),Td.has(e))t=e;else{let t=e.length===2?Td.keys():Td.values();throw Error(`Language "${e}" is not supported. Must be one of: ${JSON.stringify(Array.from(t))}`)}}return t}var Od=/* @__PURE__ */ RegExp(`^[\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E]+$`,`gu`),kd=.1,Ad=class extends U{get timestamp_begin(){return this._tokenizer.token_to_id(`<|notimestamps|>`)+1}_decode_asr(e,{return_timestamps:t=!1,return_language:n=!1,time_precision:r=null,force_full_sequences:i=!0}={}){if(r===null)throw Error(`Must specify time_precision`);let a=null,o=t===`word`;function s(){return{language:a,timestamp:[null,null],text:``}}let c=[],l=s(),u=0,d=this.timestamp_begin,f=d+1500,p=[],m=[],h=!1,g=null,_=new Set(this.all_special_ids);for(let n of e){let e=n.tokens,i=o?n.token_timestamps:null,v=null,y=d;if(`stride`in n){let[t,i,a]=n.stride;if(u-=i,g=t-a,i&&(y=i/r+d),a)for(let t=e.length-1;t>=0;--t){let n=Number(e[t]);if(n>=d){if(v!==null&&(n-d)*r=d&&g<=f){let e=hl((g-d)*r+u,2);if(v!==null&&g>=v)h=!0;else if(h||p.length>0&&g0&&l.timestamp[1]!==null))for(let e of l.words)e.timestamp[1]>l.timestamp[1]&&l.timestamp[1]>=e.timestamp[0]&&(e.timestamp[1]=l.timestamp[1]);c.push(l),p=[],b=[],m=[],x=[],l=s()}}else if(b.push(g),o){let e=hl(i[n]+u,2),t;if(n+10?(p.push(b),o&&m.push(x)):p.every(e=>e.length===0)&&(l=s(),p=[],b=[],m=[],x=[])}if(p.length>0){if(i&&t)throw Error(`Whisper did not predict an ending timestamp, which can happen if audio is cut off in the middle of a word. Also make sure WhisperTimeStampLogitsProcessor was used during generation.`);let[e,n]=this.findLongestCommonSequence(p,m),r=this.decode(e);l.text=r,o&&(l.words=this.collateWordTimestamps(e,n,a)),c.push(l)}let v=/* @__PURE__ */ Object.create(null),y=c.map(e=>e.text).join(``);if(t||n){for(let e=0;e0,o=a?[]:null,s=a?t[0]:null;for(let c=1;ce===g[n]&&s[i+n][0]-kd<=t[c][m+n][0]).length:p.filter((e,t)=>e===g[t]).length;let v=e/1e4,y=_/e+v;_>1&&y>u&&(u=y,d=[i,o,m,h])}let[p,m,h,g]=d,_=Math.floor((m+p)/2),v=Math.floor((g+h)/2);if(a&&u===0&&r>0){let e=s[r-1][0],n=t[c].findIndex(t=>t[0]>=e);v=n===-1?l.length:n}i.push(...n.slice(0,_)),n=l.slice(v),r=n.length,a&&(o.push(...s.slice(0,_)),s=t[c].slice(v))}return i.push(...n),a?(o.push(...s),[i,o]):[i,[]]}collateWordTimestamps(e,t,n){let[r,i,a]=this.combineTokensIntoWords(e,n),o=[];for(let e=0;e=r){let e=((t-r)*n).toFixed(2);i.push(`<|${e}|>`),i.push([])}else i[i.length-1].push(t);return i=i.map(e=>typeof e==`string`?e:super.decode(e,t)),i.join(``)}splitTokensOnUnicode(e){let t=this.decode(e,{decode_with_timestamps:!0}),n=[],r=[],i=[],a=[],o=[],s=0;for(let c=0;c=this._tokenizer.token_to_id(`<|endoftext|>`),d=s.startsWith(` `),f=s.trim(),p=Od.test(f);if(u||d||p||i.length===0)i.push(s),a.push(c),o.push(l);else{let e=i.length-1;i[e]+=s,a[e].push(...c),o[e].push(...l)}}return[i,a,o]}mergePunctuations(e,t,n,r,i){let a=structuredClone(e),o=structuredClone(t),s=structuredClone(n),c=a.length-2,l=a.length-1;for(;c>=0;)a[c].startsWith(` `)&&r.includes(a[c].trim())?(a[l]=a[c]+a[l],o[l]=ai(o[c],o[l]),s[l]=ai(s[c],s[l]),a[c]=``,o[c]=[],s[c]=[]):l=c,--c;for(c=0,l=1;le),o.filter(e=>e.length>0),s.filter(e=>e.length>0)]}},jd=class extends U{},Md=class extends U{return_token_type_ids=!0;constructor(e,t){super(e,t),A.warn('WARNING: `XLMTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}},W=class{static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let[o,s]=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a}),c=s.tokenizer_class?.replace(/Fast$/,``)??`PreTrainedTokenizer`,l=Pu[c];return l||=(A.warn(`Unknown tokenizer class "${c}", attempting to construct from base class.`),U),new l(o,s)}},Nd=`https://github.com/huggingface/transformers.js/issues/new/choose`,Pd=`preprocessor_config.json`,Fd=`preprocessor_config.json`,Id=`processor_config.json`,Ld=`chat_template.jinja`,G=class extends $r{static classes=[`image_processor_class`,`tokenizer_class`,`feature_extractor_class`];static uses_processor_config=!1;static uses_chat_template_file=!1;constructor(e,t,n){super(),this.config=e,this.components=t,this.chat_template=n}get image_processor(){return this.components.image_processor}get tokenizer(){return this.components.tokenizer}get feature_extractor(){return this.components.feature_extractor}apply_chat_template(e,t={}){if(!this.tokenizer)throw Error(`Unable to apply chat template without a tokenizer.`);return this.tokenizer.apply_chat_template(e,{tokenize:!1,chat_template:this.chat_template??void 0,...t})}batch_decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.batch_decode(...e)}decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.decode(...e)}async _call(e,...t){for(let n of[this.image_processor,this.feature_extractor,this.tokenizer])if(n)return n(e,...t);throw Error(`No image processor, feature extractor, or tokenizer found.`)}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([this.uses_processor_config?rl(e,Id,!0,t):{},Promise.all(this.classes.filter(e=>e in this).map(async n=>{let r=await this[n].from_pretrained(e,t);return[n.replace(/_class$/,``),r]})).then(Object.fromEntries),this.uses_chat_template_file?nl(e,Ld,!0,t):null]);return new this(n,r,i)}};Sr({},{ChatterboxProcessor:()=>Mf,CohereAsrProcessor:()=>Pf,Florence2Processor:()=>Sm,Gemma3Processor:()=>Cm,Gemma3nProcessor:()=>wm,Gemma4Processor:()=>Tm,Glm46VProcessor:()=>Dm,GraniteSpeechProcessor:()=>Om,GroundingDinoProcessor:()=>Am,Idefics3Processor:()=>Pm,JinaCLIPProcessor:()=>Im,Lfm2VlProcessor:()=>Lm,LlavaProcessor:()=>Rm,MgpstrProcessor:()=>Bm,MoonshineProcessor:()=>Vm,OwlViTProcessor:()=>Hm,PaliGemmaProcessor:()=>Gm,Phi3VProcessor:()=>Jm,PixtralProcessor:()=>Ym,Processor:()=>G,PyAnnoteProcessor:()=>Xm,Qwen2VLProcessor:()=>Em,Qwen2_5_VLProcessor:()=>Zm,Qwen3VLProcessor:()=>Qm,Sam2Processor:()=>eh,Sam2VideoProcessor:()=>th,SamProcessor:()=>$m,SmolVLMProcessor:()=>Pm,SpeechT5Processor:()=>nh,UltravoxProcessor:()=>rh,VLChatProcessor:()=>Fm,VoxtralProcessor:()=>ch,VoxtralRealtimeProcessor:()=>mh,Wav2Vec2Processor:()=>hh,Wav2Vec2ProcessorWithLM:()=>gh,WhisperProcessor:()=>_h});var Rd=class extends $r{constructor(e){super(),this.config=e}static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t);return new this(n)}};function zd(e,t){if(!(e instanceof Float32Array||e instanceof Float64Array))throw Error(`${t} expects input to be a Float32Array or a Float64Array, but got ${e?.constructor?.name??typeof e} instead. If using the feature extractor directly, remember to use \`load_audio(url, sampling_rate)\` to obtain the raw audio data of the file/url.`)}var Bd={};Sr(Bd,{ASTFeatureExtractor:()=>df,ChatterboxFeatureExtractor:()=>pf,ClapFeatureExtractor:()=>mf,CohereAsrFeatureExtractor:()=>_f,DacFeatureExtractor:()=>vf,EncodecFeatureExtractor:()=>ff,FeatureExtractor:()=>Rd,Gemma3nAudioFeatureExtractor:()=>yf,Gemma4AudioFeatureExtractor:()=>bf,GraniteSpeechFeatureExtractor:()=>xf,MoonshineFeatureExtractor:()=>Sf,ParakeetFeatureExtractor:()=>gf,PyAnnoteFeatureExtractor:()=>Cf,SeamlessM4TFeatureExtractor:()=>wf,SnacFeatureExtractor:()=>Tf,SpeechT5FeatureExtractor:()=>Ef,VoxtralRealtimeFeatureExtractor:()=>kf,Wav2Vec2FeatureExtractor:()=>Df,WeSpeakerFeatureExtractor:()=>Of,WhisperFeatureExtractor:()=>Af});var Vd={fromWeb:()=>{}};async function Hd(e,t){if(O.IS_BROWSER_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save a file from a Web Worker.`);let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e,r.click(),r.remove(),URL.revokeObjectURL(n)}else if(O.IS_FS_AVAILABLE){let n=t.stream();Vd.fromWeb(n),Cr.createWriteStream(e),await void 0}else throw Error(`Unable to save because filesystem is disabled in this environment.`)}async function Ud(e,t){if(typeof AudioContext>`u`)throw Error("Unable to load audio from path/URL since `AudioContext` is not available in your environment. Instead, audio data should be passed directly to the pipeline/processor. For more information and some example code, see https://huggingface.co/docs/transformers.js/guides/node-audio-processing.");let n=await(await Jc(e)).arrayBuffer(),r=new AudioContext({sampleRate:t});t===void 0&&A.warn(`No sampling rate provided, using default of ${r.sampleRate}Hz.`);let i=await r.decodeAudioData(n),a;if(i.numberOfChannels===2){let e=Math.sqrt(2),t=i.getChannelData(0),n=i.getChannelData(1);a=new Float32Array(t.length);for(let r=0;r2595*Math.log10(1+e/700),kaldi:e=>1127*Math.log(1+e/700),slaney:(e,t=1e3,n=15,r=27/Math.log(6.4))=>e>=t?n+Math.log(e/t)*r:3*e/200};function Yd(e,t=`htk`){let n=Jd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}var Xd={htk:e=>700*(10**(e/2595)-1),kaldi:e=>700*(Math.exp(e/1127)-1),slaney:(e,t=1e3,n=15,r=Math.log(6.4)/27)=>e>=n?t*Math.exp(r*(e-n)):200*e/3};function Zd(e,t=`htk`){let n=Xd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}function Qd(e,t){let n=Float64Array.from({length:t.length-1},(e,n)=>t[n+1]-t[n]),r=Array.from({length:e.length},()=>Array(t.length));for(let n=0;nArray(e.length));for(let t=0;te+r*n)}function ef(e,t,n,r,i,a=null,o=`htk`,s=!1){if(a!==null&&a!==`slaney`)throw Error(`norm must be one of null or "slaney"`);if(e<2)throw Error(`Require num_frequency_bins: ${e} >= 2`);if(n>r)throw Error(`Require min_frequency: ${n} <= max_frequency: ${r}`);let c=$d(Yd(n,o),Yd(r,o),t+2),l=Zd(c,o),u;if(s){let t=i/((e-1)*2);u=Yd(Float64Array.from({length:e},(e,n)=>n*t),o),l=c}else u=$d(0,Math.floor(i/2),e);let d=Qd(u,l);if(a!==null&&a===`slaney`)for(let n=0;ni)throw Error(`frame_length (${n}) may not be larger than fft_length (${i})`);if(w!==n)throw Error(`Length of the window (${w}) must equal frame_length (${n})`);if(r<=0)throw Error(`hop_length must be greater than zero`);if(a===null&&d!==null)throw Error("You have provided `mel_filters` but `power` is `None`. Mel spectrogram computation is not yet supported for complex-valued spectrogram. Specify `power` to fix this issue.");if(!u)throw Error("`preemphasis_htk_flavor=false` is not currently supported.");if(o){let t=Math.floor(n/2);switch(s){case`reflect`:e=tf(e,t,t);break;case`constant`:{let n=new e.constructor(e.length+2*t);n.set(e,t),e=n;break}case`semicausal`:{let n=new e.constructor(e.length+t);n.set(e,t),e=n;break}default:throw Error(`pad_mode="${s}" not implemented yet.`)}}let te=Math.floor(1+Math.floor((e.length-n)/r));y!==null&&tete?x&&(ie=b):ie=re=b);let ae=new pl(i),oe=new Float64Array(i),se=new Float64Array(ae.outputBufferSize),ce=new Float32Array(ne*ie);for(let i=0;i=1;--e)oe[e]-=l*oe[e-1];oe[0]*=1-l}for(let e=0;ee**.85);break;default:throw Error(`Unknown window type ${t}.`)}if(n&&(o=o.subarray(0,e)),r===null||e===r)return o;if(e>r)throw Error(`Length of the window (${e}) may not be larger than frame_length (${r})`);let s=new Float64Array(r),c=i?Math.floor((r-e)/2):0;return s.set(o,c),s}function cf(e,t){let n=e.reduce((e,t)=>e+t.length,0),r=/* @__PURE__ */ new ArrayBuffer(44),i=new DataView(r);return lf(i,0,`RIFF`),i.setUint32(4,36+n*4,!0),lf(i,8,`WAVE`),lf(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,3,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*4,!0),i.setUint16(32,4,!0),i.setUint16(34,32,!0),lf(i,36,`data`),i.setUint32(40,n*4,!0),new Blob([r,...e.map(e=>e.buffer instanceof ArrayBuffer?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e.slice())],{type:`audio/wav`})}function lf(e,t,n){for(let r=0;re+t.length,0),t=new Float32Array(e),n=0;for(let e of this.audio)t.set(e,n),n+=e.length;return t}return this.audio}toBlob(){let e=this.audio;return e instanceof Float32Array&&(e=[e]),cf(e,this.sampling_rate)}async save(e){return Hd(e,this.toBlob())}},df=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hann`,{periodic:!1}),this.mean=this.config.mean,this.std=this.config.std}async _extract_fbank_features(e,t){return of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e){zd(e,`ASTFeatureExtractor`);let t=await this._extract_fbank_features(e,this.config.max_length);if(this.config.do_normalize){let e=this.std*2,n=t.data;for(let t=0;t0){if(n===`rand_trunc`){let n=Math.floor(bc.random()*(a+1));e=e.subarray(n,n+t),i=await this._extract_fbank_features(e,this.mel_filters_slaney,this.config.nb_max_samples)}else throw Error(`Truncation strategy "${n}" not implemented`)}else{if(a<0){let n=new Float64Array(t);if(n.set(e),r===`repeat`)for(let r=e.length;r=1;--n)e[n]-=t*e[n-1];return await of(e,this.window,this.window.length,this.config.hop_length,{fft_length:this.config.n_fft,power:2,mel_filters:this.config.mel_filters,log_mel:`log`,mel_floor:-1/0,pad_mode:`constant`,center:!0,transpose:!0,mel_offset:2**-24})}async _call(e){zd(e,`ParakeetFeatureExtractor`);let t=await this._extract_fbank_features(e),n=Math.floor((e.length+Math.floor(this.config.n_fft/2)*2-this.config.n_fft)/this.config.hop_length),r=t.data;r.fill(0,n*t.dims[1]);let[i,a]=t.dims,o=new Float64Array(a),s=new Float64Array(a);for(let e=0;e1?n-1:1;for(let e=0;e=l){s.push(e.slice(c,l));break}let t=Math.max(c,c+a-o),n=Math.min(c+a,l),i;i=n<=t?c+a:this._find_split_point_energy(e,t,n,r),i=Math.max(c+1,Math.min(i,l)),s.push(e.slice(c,i)),c=i}return s}_find_split_point_energy(e,t,n,r){let i=n-t;if(i<=r)return Math.floor((t+n)/2);let a=1/0,o=t,s=i-r;for(let n=0;n<=s;n+=r){let i=0;for(let a=0;at&&(e=e.slice(0,t)),r&&e.length%i!==0){let t=i-e.length%i,n=new Float64Array(e.length+t);n.set(e),this.config.padding_value!==0&&n.fill(this.config.padding_value,e.length),e=n}let a=await this._extract_fbank_features(e,this.config.max_length),o=_u([1,a.dims[0]],!0);return{input_features:a.unsqueeze_(0),input_features_mask:o}}},bf=class extends yf{async _extract_fbank_features(e,t){let{frame_length:n,hop_length:r,fft_length:i}=this.config,a=Math.floor(n/2),o=Math.floor((e.length+a-(n+1))/r)+1;return of(e,this.window,n,r,{fft_length:i,center:!0,pad_mode:`semicausal`,onesided:!0,preemphasis:this.config.preemphasis,preemphasis_htk_flavor:this.config.preemphasis_htk_flavor,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:this.config.mel_floor,mel_floor_mode:`add`,remove_dc_offset:!1,transpose:!0,max_num_frames:o})}async _call(e,t={}){zd(e,`Gemma4AudioFeatureExtractor`);let n=e.length,r=await super._call(e,t),{input_features:i}=r,[,a,o]=i.dims,{frame_length:s,hop_length:c}=this.config,l=Math.floor(s/2),u=s+1,d=new Uint8Array(n+l+(t.pad_to_multiple_of??128));d.fill(1,l,l+n);let f=new Uint8Array(a);for(let e=0;e({id:e,start:t*n,end:r*n,confidence:i/(r-t)})))}return r}},wf=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`povey`,{periodic:!1})}async _extract_fbank_features(e,t){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e,{padding:t=!0,pad_to_multiple_of:n=2,do_normalize_per_mel_bins:r=!0,return_attention_mask:i=!0}={}){zd(e,`SeamlessM4TFeatureExtractor`);let a=await this._extract_fbank_features(e,this.config.max_length);if(r){let[e,t]=a.dims,n=a.data;for(let r=0;r0){let n=new Float32Array(t*(e+s));n.set(r),n.fill(this.config.padding_value,r.length);let c=e+s;a=new V(a.type,n,[c,t]),i&&(o=new V(`int64`,new BigInt64Array(c),[1,c]),o.data.fill(1n,0,e))}}let[s,c]=a.dims,l=this.config.stride;if(s%l!==0)throw Error(`The number of frames (${s}) must be a multiple of the stride (${l}).`);let u=a.view(1,Math.floor(s/l),c*l),d={input_features:u};if(i){let e=u.dims[1],t=new BigInt64Array(e);if(o){let e=o.data;for(let n=1,r=0;ne+t,0)/e.length,n=e.reduce((e,n)=>e+(n-t)**2,0)/e.length;return e.map(e=>(e-t)/Math.sqrt(n+1e-7))}async _call(e){zd(e,`Wav2Vec2FeatureExtractor`),e instanceof Float64Array&&(e=new Float32Array(e));let t=e;this.config.do_normalize&&(t=this._zero_mean_unit_var_norm(t));let n=[1,t.length];return{input_values:new V(`float32`,t,n),attention_mask:new V(`int64`,new BigInt64Array(t.length).fill(1n),n)}}},Of=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hamming`,{periodic:!1}),this.min_num_frames=this.config.min_num_frames}async _extract_fbank_features(e){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,transpose:!0,min_num_frames:this.min_num_frames})}async _call(e){zd(e,`WeSpeakerFeatureExtractor`);let t=(await this._extract_fbank_features(e)).unsqueeze_(0);if(this.config.fbank_centering_span===null){let e=t.mean(1).data,n=t.data,[r,i,a]=t.dims;for(let t=0;tr?(e.length>this.config.n_samples&&A.warn("Attempting to extract features for audio longer than 30 seconds. If using a pipeline to extract transcript from a long audio clip, remember to specify `chunk_length_s` and/or `stride_length_s`."),n=e.slice(0,r)):(n=new Float32Array(r),n.set(e)),{input_features:(await this._extract_fbank_features(n)).unsqueeze_(0)}}},jf=class{static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t),r=n.feature_extractor_type,i=Bd[r];if(!i)throw Error(`Unknown feature_extractor_type: '${r}'. Please report this at ${Nd}.`);return new i(n)}},Mf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;async _call(e,t=null){let n=this.tokenizer(e),r=t?await this.feature_extractor(t):{};return{...n,...r}}},Nf=/* @__PURE__ */ new Set([`ja`,`zh`]),Pf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;get_decoder_prompt_ids(e=`en`){let t=[`▁`,`<|startofcontext|>`,`<|startoftranscript|>`,`<|emo:undefined|>`,`<|${e}|>`,`<|${e}|>`,`<|pnc|>`,`<|noitn|>`,`<|notimestamp|>`,`<|nodiarize|>`];return this.tokenizer.convert_tokens_to_ids(t)}static join_chunks(e,t=`en`){let n=e.filter(e=>e&&e.trim());if(n.length===0)return``;let r=Nf.has(t)?``:` `;return[n[0].trimEnd(),...n.slice(1).map(e=>e.trim())].join(r)}async _call(e){return await this.feature_extractor(e)}},Ff={},If,Lf,Rf;if(O.IS_WEB_ENV)If=(e,t)=>{if(!self.OffscreenCanvas)throw Error(`OffscreenCanvas not supported by this environment.`);return new self.OffscreenCanvas(e,t)},Rf=self.createImageBitmap,Lf=self.ImageData;else if(Ff)Rf=async e=>{let t=(await e.metadata()).channels,{data:n,info:r}=await e.rotate().raw().toBuffer({resolveWithObject:!0}),i=new Vf(new Uint8ClampedArray(n),r.width,r.height,r.channels);return t!==void 0&&t!==r.channels&&i.convert(t),i};else throw Error(`Unable to load image processing library.`);var zf={0:`nearest`,1:`lanczos`,2:`bilinear`,3:`bicubic`,4:`box`,5:`hamming`},Bf=/* @__PURE__ */ new Map([[`png`,`image/png`],[`jpg`,`image/jpeg`],[`jpeg`,`image/jpeg`],[`gif`,`image/gif`]]),Vf=class e{constructor(e,t,n,r){this.data=e,this.width=t,this.height=n,this.channels=r}get size(){return[this.width,this.height]}static async read(t){if(t instanceof e)return t;if(typeof t==`string`||t instanceof URL)return await this.fromURL(t);if(t instanceof Blob)return await this.fromBlob(t);if(typeof HTMLCanvasElement<`u`&&t instanceof HTMLCanvasElement||typeof OffscreenCanvas<`u`&&t instanceof OffscreenCanvas)return this.fromCanvas(t);throw Error(`Unsupported input type: ${typeof t}`)}static fromCanvas(t){if(!O.IS_WEB_ENV)throw Error(`fromCanvas() is only supported in browser environments.`);let n=t.getContext(`2d`).getImageData(0,0,t.width,t.height).data;return new e(n,t.width,t.height,4)}static async fromURL(e){let t=await Jc(e);if(t.status!==200)throw Error(`Unable to read image from "${e}" (${t.status} ${t.statusText})`);let n=await t.blob();return this.fromBlob(n)}static async fromBlob(e){if(O.IS_WEB_ENV){let t=await Rf(e),n=If(t.width,t.height).getContext(`2d`);return n.drawImage(t,0,0),new this(n.getImageData(0,0,t.width,t.height).data,t.width,t.height,4)}{let t=Ff(await e.arrayBuffer());return await Rf(t)}}static fromTensor(t,n=`CHW`){if(t.dims.length!==3)throw Error(`Tensor should have 3 dimensions, but has ${t.dims.length} dimensions.`);if(n===`CHW`)t=t.permute(1,2,0);else if(n!==`HWC`)throw Error(`Unsupported channel format: ${n}`);if(!(t.data instanceof Uint8ClampedArray||t.data instanceof Uint8Array))throw Error(`Unsupported tensor type: ${t.type}`);switch(t.dims[2]){case 1:case 2:case 3:case 4:return new e(t.data,t.dims[1],t.dims[0],t.dims[2]);default:throw Error(`Unsupported number of channels: ${t.dims[2]}`)}}grayscale(){if(this.channels===1)return this;let e=new Uint8ClampedArray(this.width*this.height*1);switch(this.channels){case 3:case 4:for(let t=0,n=0;t=0?c=r:u=-r,i>=0?l=i:d=-i,s.drawImage(o,c,l,t,n,u,d,t,n),new e(s.getImageData(0,0,t,n).data,t,n,4).convert(a)}{let e=this.toSharp();if(r>=0&&i>=0)e=e.extract({left:Math.floor(r),top:Math.floor(i),width:t,height:n});else if(r<=0&&i<=0){let a=Math.floor(-i),o=Math.floor(-r);e=e.extend({top:a,left:o,right:t-this.width-o,bottom:n-this.height-a})}else{let a=[0,0],o=0;i<0?(a[0]=Math.floor(-i),a[1]=n-this.height-a[0]):o=Math.floor(i);let s=[0,0],c=0;r<0?(s[0]=Math.floor(-r),s[1]=t-this.width-s[0]):c=Math.floor(r),e=e.extend({top:a[0],bottom:a[1],left:s[0],right:s[1]}).extract({left:c,top:o,width:t,height:n})}return await Rf(e)}}async toBlob(e=`image/png`,t=1){if(!O.IS_WEB_ENV)throw Error(`toBlob() is only supported in browser environments.`);return await this.toCanvas().convertToBlob({type:e,quality:t})}toTensor(e=`CHW`){let t=new V(`uint8`,new Uint8Array(this.data),[this.height,this.width,this.channels]);if(e!==`HWC`){if(e===`CHW`)t=t.permute(2,0,1);else throw Error(`Unsupported channel format: ${e}`)}return t}toCanvas(){if(!O.IS_WEB_ENV)throw Error(`toCanvas() is only supported in browser environments.`);let e=this.clone().rgba(),t=If(e.width,e.height),n=new Lf(e.data,e.width,e.height);return t.getContext(`2d`).putImageData(n,0,0),t}split(){let{data:t,width:n,height:r,channels:i}=this,a=t.constructor,o=t.length/i,s=Array.from({length:i},()=>new a(o));for(let e=0;enew e(t,n,r,1))}_update(e,t,n,r=null){return this.data=e,this.width=t,this.height=n,r!==null&&(this.channels=r),this}clone(){return new e(this.data.slice(),this.width,this.height,this.channels)}convert(e){if(this.channels===e)return this;switch(e){case 1:this.grayscale();break;case 3:this.rgb();break;case 4:this.rgba();break;default:throw Error(`Conversion failed due to unsupported number of channels: ${this.channels}`)}return this}async save(e){if(O.IS_WEB_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save an image from a Web Worker.`);let t=e.split(`.`).pop().toLowerCase(),n=Bf.get(t)??`image/png`;return Hd(e,await this.toBlob(n))}if(O.IS_FS_AVAILABLE)await this.toSharp().toFile(e);else throw Error(`Unable to save the image because filesystem is disabled in this environment.`)}toSharp(){if(O.IS_WEB_ENV)throw Error(`toSharp() is only supported in server-side environments.`);return Ff(this.data,{raw:{width:this.width,height:this.height,channels:this.channels}})}};Vf.read.bind(Vf);function Hf(e,t,n=0,r=null){let i=e/t,a=gl(i)*t;return r!==null&&a>r&&(a=Math.floor(i)*t),at&&i.push(e)}else{let e=ll(n.data)[1];if(e===c-1||(a=ol(n.data),a[e]e*o[(t+1)%2])),u.boxes.push(n),u.classes.push(t),u.scores.push(a[t])}}l.push(u)}return l}function Kf(e,t=null){let n=e.logits,r=n.dims[0];if(t!==null&&t.length!==r)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let i=[];for(let e=0;el[n]&&(l[n]=t[n],u[n]=e)}let d=Array(a.dims[0]);for(let e=0;ee!==void 0);i.push({segmentation:c,labels:f})}return i}function qf(e,t,n,r){let i=[],a=[],o=[];for(let s=0;sn&&(i.push(l),a.push(d),o.push(u))}return[i,a,o]}function Jf(e,t,n,r=.5,i=.8){let a=[],o=0,s=0,c=t[n].data;for(let t=0;t=r&&++s;let l=o>0&&s>0;return l&&=o/s>i,[l,a]}function Yf(e,t,n,r,i,a=null,o=null){let[s,c]=o??e[0].dims,l=new V(`int32`,new Int32Array(s*c),[s,c]),u=[];if(o!==null)for(let t=0;tf[e]&&(d[e]=n,f[e]=i[e])}let p=0,m=l.data;for(let a=0;a200)throw Error(`absolute aspect ratio must be smaller than 200, got ${Math.max(e,t)/Math.min(e,t)}`);let o=Math.round(e/n)*n,s=Math.round(t/n)*n;if(a*o*s>i){let r=Math.sqrt(a*e*t/i);o=Math.max(n,Math.floor(e/r/n)*n),s=Math.max(n,Math.floor(t/r/n)*n)}else if(a*o*si?c=Math.floor(i*s/r):i>r&&(s=Math.floor(r*c/i)),await e.resize(c,s,{resample:n}))}async crop_margin(e,t=200){let n=e.clone().grayscale(),r=cl(n.data)[0],i=ll(n.data)[0]-r;if(i===0)return e;let a=t/255,o=n.width,s=n.height,c=0,l=0,u=n.data;for(let e=0;ethis.preprocess(e)));return{pixel_values:du(n.map(e=>e.pixel_values),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}static async from_pretrained(e,t={}){let n=await rl(e,Fd,!0,t);return new this(n)}},$f={};Sr($f,{BeitFeatureExtractor:()=>ep,BitImageProcessor:()=>tp,CHMv2ImageProcessor:()=>rp,CLIPFeatureExtractor:()=>ap,CLIPImageProcessor:()=>ip,ChineseCLIPFeatureExtractor:()=>np,ConvNextFeatureExtractor:()=>sp,ConvNextImageProcessor:()=>op,DINOv3ViTImageProcessor:()=>fp,DPTFeatureExtractor:()=>gp,DPTImageProcessor:()=>hp,DeiTFeatureExtractor:()=>lp,DeiTImageProcessor:()=>cp,DetrFeatureExtractor:()=>dp,DetrImageProcessor:()=>up,DonutFeatureExtractor:()=>mp,DonutImageProcessor:()=>pp,EfficientNetImageProcessor:()=>_p,GLPNFeatureExtractor:()=>wp,Gemma3ImageProcessor:()=>vp,Gemma4ImageProcessor:()=>xp,Glm46VImageProcessor:()=>Cp,GroundingDinoImageProcessor:()=>Tp,Idefics3ImageProcessor:()=>Ep,ImageFeatureExtractor:()=>K,ImageProcessor:()=>K,JinaCLIPImageProcessor:()=>Op,Lfm2VlImageProcessor:()=>Pp,LlavaOnevisionImageProcessor:()=>Fp,Mask2FormerImageProcessor:()=>Rp,MaskFormerFeatureExtractor:()=>Lp,MaskFormerImageProcessor:()=>Ip,MobileNetV1FeatureExtractor:()=>Bp,MobileNetV1ImageProcessor:()=>zp,MobileNetV2FeatureExtractor:()=>Hp,MobileNetV2ImageProcessor:()=>Vp,MobileNetV3FeatureExtractor:()=>Wp,MobileNetV3ImageProcessor:()=>Up,MobileNetV4FeatureExtractor:()=>Kp,MobileNetV4ImageProcessor:()=>Gp,MobileViTFeatureExtractor:()=>Jp,MobileViTImageProcessor:()=>qp,NougatImageProcessor:()=>Yp,OwlViTFeatureExtractor:()=>Zp,OwlViTImageProcessor:()=>Xp,Owlv2ImageProcessor:()=>Qp,Phi3VImageProcessor:()=>im,PixtralImageProcessor:()=>am,PvtImageProcessor:()=>om,Qwen2VLImageProcessor:()=>Sp,RTDetrImageProcessor:()=>sm,Sam2ImageProcessor:()=>cm,Sam3ImageProcessor:()=>cm,SamImageProcessor:()=>cm,SapiensFeatureExtractor:()=>um,SapiensImageProcessor:()=>lm,SegformerFeatureExtractor:()=>fm,SegformerImageProcessor:()=>dm,SiglipImageProcessor:()=>pm,SmolVLMImageProcessor:()=>Ep,Swin2SRImageProcessor:()=>mm,VLMImageProcessor:()=>Dp,ViTFeatureExtractor:()=>gm,ViTImageProcessor:()=>hm,VitMatteImageProcessor:()=>_m,VitPoseImageProcessor:()=>vm,YolosFeatureExtractor:()=>bm,YolosImageProcessor:()=>ym});var ep=class extends K{},tp=class extends K{},np=class extends K{},rp=class extends K{},ip=class extends K{},ap=class extends ip{},op=class extends K{constructor(e){super(e),this.crop_pct=this.config.crop_pct??224/256}async resize(e){let t=this.size?.shortest_edge;if(t===void 0)throw Error(`Size dictionary must contain 'shortest_edge' key.`);if(t<384){let n=Math.floor(t/this.crop_pct),[r,i]=this.get_resize_output_image_size(e,{shortest_edge:n});e=await e.resize(r,i,{resample:this.resample}),e=await e.center_crop(t,t)}else e=await e.resize(t,t,{resample:this.resample});return e}},sp=class extends op{},cp=class extends K{},lp=class extends cp{},up=class extends K{async _call(e){let t=await super._call(e),n=_u([t.pixel_values.dims[0],64,64],1n);return{...t,pixel_mask:n}}post_process_object_detection(...e){return Gf(...e)}post_process_panoptic_segmentation(...e){return Zf(...e)}post_process_instance_segmentation(...e){return Qf(...e)}},dp=class extends up{},fp=class extends K{},pp=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t,s=this.image_mean;Array.isArray(this.image_mean)||(s=Array(o).fill(s));let c=this.image_std;Array.isArray(c)||(c=Array(o).fill(s));let l=s.map((e,t)=>-e/c[t]);return super.pad_image(e,t,n,{center:!0,constant_values:l,...r})}},mp=class extends pp{},hp=class extends K{},gp=class extends hp{},_p=class extends K{constructor(e){super(e),this.include_top=this.config.include_top??!0,this.include_top&&(this.image_std=this.image_std.map(e=>e*e))}},vp=class extends K{};function yp(e,t,n,r,i){let a=r*n**2,o=Math.sqrt(a/(e*t)),s=i*n,c=Math.floor(o*e/s)*s,l=Math.floor(o*t/s)*s;if(c===0&&l===0)throw Error(`Attempting to resize to a 0 x 0 image. Resized height should be divisible by \`pooling_kernel_size * patch_size\`=${s}.`);let u=Math.floor(r/i**2)*s;return c===0?(c=s,l=Math.min(Math.floor(t/e)*s,u)):l===0&&(l=s,c=Math.min(Math.floor(e/t)*s,u)),[c,l]}function bp(e,t,n,r,i,a,o){let s=Math.floor(t/i),c=Math.floor(n/i),l=s*c,u=i*i*r,d=new Float32Array(a*u),f=0;for(let t=0;ta),0));let l=a.dims[0]/o,u=a.dims[1],d=Math.floor(a.dims[2]/c),f=Math.floor(a.dims[3]/c);return{pixel_values:a.view(l,o,u,Math.floor(d/s),s,c,Math.floor(f/s),s,c).permute(0,3,6,4,7,2,1,5,8).view(l*d*f,u*o*c*c),image_grid_thw:new V(`int64`,[l,d,f],[1,3]),original_sizes:r,reshaped_input_sizes:i}}},Cp=class extends Sp{get_resize_output_image_size(e,t){let n=this.patch_size*this.merge_size,r=this.config.temporal_patch_size??2;return Xf(e.height,e.width,n,this.min_pixels,this.max_pixels,r)}},wp=class extends K{},Tp=class extends K{async _call(e){let t=await super._call(e),n=t.pixel_values.dims,r=yu([n[0],n[2],n[3]]);return{...t,pixel_mask:r}}},Ep=class extends K{constructor(e){super(e),this.do_image_splitting=e.do_image_splitting??!0,this.max_image_size=e.max_image_size}get_resize_for_vision_encoder(e,t){let[n,r]=e.dims.slice(-2),i=r/n;return r>=n?(r=Math.ceil(r/t)*t,n=Math.floor(r/i),n=Math.ceil(n/t)*t):(n=Math.ceil(n/t)*t,r=Math.floor(n*i),r=Math.ceil(r/t)*t),{height:n,width:r}}async _call(e,{do_image_splitting:t=null,return_row_col_info:n=!1}={}){let r;if(!Array.isArray(e))r=[[e]];else{if(e.length===0||!e[0])throw Error(`No images provided.`);r=Array.isArray(e[0])?e:[e]}let i=[],a=[],o=[],s=[],c=[];for(let e of r){let n=await Promise.all(e.map(e=>this.preprocess(e)));s.push(...n.map(e=>e.original_size)),c.push(...n.map(e=>e.reshaped_input_size)),n.forEach(e=>e.pixel_values.unsqueeze_(0));let{longest_edge:r}=this.max_image_size,l;if(t??this.do_image_splitting){let e=Array(n.length),t=Array(n.length);l=await Promise.all(n.map(async(n,i)=>{let a=this.get_resize_for_vision_encoder(n.pixel_values,r),o=await nu(n.pixel_values,{size:[a.height,a.width]}),{frames:s,num_splits_h:c,num_splits_w:l}=await this.split_image(o,this.max_image_size);return e[i]=c,t[i]=l,H(s,0)})),a.push(e),o.push(t)}else{let e=[r,r];l=await Promise.all(n.map(t=>nu(t.pixel_values,{size:e}))),a.push(Array(n.length).fill(0)),o.push(Array(n.length).fill(0))}i.push(H(l,0))}let l=i.length,[u,d,f,p]=i[0].dims,m,h;if(l===1)m=i[0].unsqueeze_(0),h=_u([l,u,f,p],!0);else{let e=Math.max(...i.map(e=>e.dims.at(0)));h=_u([l,e,f,p],!0);let t=h.data,n=e*f*p;for(let r=0;rn||o>r){s=Math.ceil(a/n),c=Math.ceil(o/r);let t=Math.ceil(a/s),l=Math.ceil(o/c);for(let n=0;ne*this.rescale_factor)}pad_image(e,t,n,r){return super.pad_image(e,t,n,{constant_values:this.constant_values,center:!0,...r})}},Op=class extends K{constructor(e){let{resize_mode:t,fill_color:n,interpolation:r,size:i,...a}=e,o=t===`squash`?{width:i,height:i}:t===`shortest`?{shortest_edge:i}:{longest_edge:i},s=r===`bicubic`?3:2;super({...a,size:o,resample:s,do_center_crop:!0,crop_size:i,do_normalize:!0})}};function kp(e,t){return Math.round(e/t)*t}function Ap(e,t,n,r,i){let a=1/0,o=[1,1],s=n*r;for(let n of t){let t=Math.abs(e-n[0]/n[1]);t.5*i*i*n[0]*n[1]&&(o=n)}return o}function jp(e,t){let n=[],r=/* @__PURE__ */ new Set;for(let i=e;i<=t;++i)for(let a=1;a<=i;++a)for(let o=1;o<=i;++o){let i=a*o;if(i>=e&&i<=t){let e=a<<16|o;r.has(e)||(r.add(e),n.push([a,o]))}}return n.sort((e,t)=>e[0]*e[1]-t[0]*t[1])}function Mp(e,t){let[n,r,i,a]=e.dims,o=Math.floor(i/t),s=Math.floor(a/t),c=t*t*r,l=e.data,u=new Float32Array(n*o*s*c),d=i*a;for(let e=0;ethis.max_image_tokens*(this.encoder_patch_size*this.downsample_factor)**2*this.max_pixels_tolerance}_get_grid_layout(e,t){let n=jp(this.min_tiles,this.max_tiles),[r,i]=Ap(t/e,n,t,e,this.tile_size);return{grid_width:r,grid_height:i,target_width:this.tile_size*r,target_height:this.tile_size*i}}async _call(e,{return_row_col_info:t=null}={}){let n;n=Array.isArray(e)?Array.isArray(e[0])?e:[e]:[[e]];let r=[],i=[],a=[],o=[],s=[],c=[];for(let e of n){let t=await Promise.all(e.map(e=>this.preprocess(e,{do_pad:!1})));for(let{pixel_values:e}of t){let[,t,n]=e.dims,l=e.unsqueeze_(0),u=this.encoder_patch_size*this.downsample_factor,d=u**2,[f,p]=Xf(Math.max(u,t),Math.max(u,n),u,this.min_image_tokens*d,this.max_image_tokens*d).map(e=>Math.max(u,e)),m,h=1,g=1,_=this._is_image_too_large(t,n),v=this.do_image_splitting&&(this.min_tiles!==1||this.max_tiles!==1);if(_&&v){let{grid_width:e,grid_height:r,target_width:i,target_height:a}=this._get_grid_layout(t,n);h=r,g=e;let o=await nu(l,{size:[a,i]});m=[];for(let t=0;t(e-this.image_mean[t])/this.image_std[t]);return super.pad_image(e,t,{width:s,height:o},{center:!0,constant_values:c,...r})}async _call(e,{num_crops:t=null}={}){if(this._num_crops=t??=this.config.num_crops,t<4||rm(t)%1!=0)throw Error(`num_crops must be a square number >= 4`);Array.isArray(e)||(e=[e]);let n=e.length,r=await Promise.all(e.map(e=>this.preprocess(e))),i=r.map(e=>e.original_size),a=r.map(e=>e.reshaped_input_size),o=[];for(let{pixel_values:e}of r){e.unsqueeze_(0);let[n,r]=e.dims.slice(-2),i=await nu(e,{size:[$p,$p],mode:`bicubic`});if(t>0){let a=[],s=rm(t),c=nm(r/s),l=nm(n/s);for(let t=0;te.map(e=>$p*tm(e/$p)));return{pixel_values:s,original_sizes:i,reshaped_input_sizes:a,image_sizes:new V(`int64`,c.flat(),[n,2]),num_img_tokens:c.map(([e,t])=>this.calc_num_image_tokens_from_image_size(t,e))}}},am=class extends K{get_resize_output_image_size(e,t){let{longest_edge:n}=t;if(n===void 0)throw Error(`size must contain 'longest_edge'`);let[r,i]=e.size,a=Math.max(r,i)/n,o=r,s=i;a>1&&(o=Math.floor(r/a),s=Math.floor(i/a));let{patch_size:c,spatial_merge_size:l}=this.config;if(!l)throw Error(`config must contain 'spatial_merge_size'`);let u=c*l,d=Math.floor((o-1)/u)+1,f=Math.floor((s-1)/u)+1;return[d*u,f*u]}},om=class extends K{},sm=class extends K{post_process_object_detection(...e){return Gf(...e)}},cm=class extends K{reshape_input_points(e,t,n,r=!1){e=structuredClone(e);let i=ii(e);if(i.length===3)r||(i=[1,...i]),e=[e];else if(i.length!==4)throw Error("The input_points must be a 4D tensor of shape `batch_size`, `point_batch_size`, `nb_points_per_image`, `2`.");for(let r=0;re!==t.dims[n]))throw Error(`The first ${n.length} dimensions of 'input_points' and 'input_labels' must be the same.`);return new V(`int64`,e.flat(1/0).map(BigInt),n)}async _call(e,{input_points:t=null,input_labels:n=null,input_boxes:r=null}={}){let i=await super._call(e);if(t&&(i.input_points=this.reshape_input_points(t,i.original_sizes,i.reshaped_input_sizes)),n){if(!i.input_points)throw Error("`input_points` must be provided if `input_labels` are provided.");i.input_labels=this.add_input_labels(n,i.input_points)}return r&&(i.input_boxes=this.reshape_input_points(r,i.original_sizes,i.reshaped_input_sizes,!0)),i}async post_process_masks(e,t,n,{mask_threshold:r=0,binarize:i=!0,pad_size:a=null}={}){let o=[];a=a??this.pad_size??this.size;let s=[a.height,a.width];for(let a=0;ar&&(t[n]=1);u=new V(`bool`,t,u.dims)}o.push(u)}return o}generate_crop_boxes(e,t,{crop_n_layers:n=0,overlap_ratio:r=512/1500,points_per_crop:i=32,crop_n_points_downscale_factor:a=1}={}){}},lm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},um=class extends lm{},dm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},fm=class extends dm{},pm=class extends K{},mm=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t;return super.pad_image(e,t,{width:a+(n-a%n)%n,height:i+(n-i%n)%n},{mode:`symmetric`,center:!1,constant_values:-1,...r})}},hm=class extends K{},gm=class extends hm{},_m=class extends K{async _call(e,t){Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let n=await Promise.all(e.map(e=>this.preprocess(e))),r=await Promise.all(t.map(e=>this.preprocess(e,{do_normalize:!1,do_convert_rgb:!1,do_convert_grayscale:!0})));return{pixel_values:du(n.map((e,t)=>H([e.pixel_values,r[t].pixel_values],0)),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}},vm=class extends K{post_process_pose_estimation(e,t,{threshold:n=null}={}){let r=e.tolist(),[i,a,o,s]=e.dims,c=[];for(let e=0;e/gm,bboxes:/([^<]+)?/gm},this.size_per_bin=1e3}construct_prompts(e){typeof e==`string`&&(e=[e]);let t=[];for(let n of e)if(this.task_prompts_without_inputs.has(n))t.push(this.task_prompts_without_inputs.get(n));else{for(let[e,r]of this.task_prompts_with_input)if(n.includes(e)){t.push(r.replaceAll(`{input}`,n).replaceAll(e,``));break}t.length!==e.length&&t.push(n)}return t}post_process_generation(e,t,n){let r=this.tasks_answer_post_processing_type.get(t)??`pure_text`;e=e.replaceAll(``,``).replaceAll(``,``);let i;switch(r){case`pure_text`:i=e;break;case`description_with_bboxes`:case`bboxes`:case`phrase_grounding`:case`ocr`:let a=r===`ocr`?`quad_boxes`:`bboxes`,o=e.matchAll(this.regexes[a]),s=[],c=[];for(let[e,t,...r]of o)s.push(t?t.trim():s.at(-1)??``),c.push(r.map((e,t)=>(Number(e)+.5)/this.size_per_bin*n[t%2]));i={labels:s,[a]:c};break;default:throw Error(`Task "${t}" (of type "${r}") not yet implemented.`)}return{[t]:i}}async _call(e,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=await this.image_processor(e,n),i=t?this.tokenizer(this.construct_prompts(t),n):{};return{...r,...i}}},Cm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.image_seq_length=this.config.image_seq_length;let{boi_token:r,image_token:i,eoi_token:a}=this.tokenizer.config;this.boi_token=r,this.image_token=i,this.eoi_token=a;let o=i.repeat(this.image_seq_length);this.full_image_sequence=` - -${r}${o}${a} - -`}async _call(e,t=null,n={}){typeof e==`string`&&(e=[e]);let r;return t&&(r=await this.image_processor(t,n),e=e.map(e=>e.replaceAll(this.boi_token,this.full_image_sequence))),{...this.tokenizer(e,n),...r}}},wm=class extends G{static image_processor_class=xm;static feature_extractor_class=jf;static tokenizer_class=W;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_seq_length=this.config.audio_seq_length,this.image_seq_length=this.config.image_seq_length;let{audio_token_id:r,boa_token:i,audio_token:a,eoa_token:o,image_token_id:s,boi_token:c,image_token:l,eoi_token:u}=this.tokenizer.config;this.audio_token_id=r,this.boa_token=i,this.audio_token=a;let d=a.repeat(this.audio_seq_length);this.full_audio_sequence=` - -${i}${d}${o} - -`,this.image_token_id=s,this.boi_token=c,this.image_token=l;let f=l.repeat(this.image_seq_length);this.full_image_sequence=` - -${c}${f}${u} - -`}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;n&&(i=await this.feature_extractor(n,r),e=e.map(e=>e.replaceAll(this.audio_token,this.full_audio_sequence)));let a;return t&&(a=await this.image_processor(t,r),e=e.map(e=>e.replaceAll(this.image_token,this.full_image_sequence))),{...this.tokenizer(e,r),...a,...i}}},Tm=class extends G{static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_ms_per_token=this.config.audio_ms_per_token??40,this.audio_seq_length=this.config.audio_seq_length??750,this.image_seq_length=this.config.image_seq_length??280;let{audio_token:r,boa_token:i,eoa_token:a,image_token:o,boi_token:s,eoi_token:c}=this.tokenizer.config;this.audio_token=r,this.boa_token=i,this.eoa_token=a,this.image_token=o,this.boi_token=s,this.eoi_token=c}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([rl(e,Id,!0,t),W.from_pretrained(e,t),nl(e,Ld,!1,t)]),a={tokenizer:r};return n.image_processor&&(a.image_processor=new xp(n.image_processor)),n.feature_extractor&&(a.feature_extractor=new bf(n.feature_extractor)),new this(n,a,i)}_compute_audio_num_tokens(e,t){let n=Math.round(t*20/1e3),r=Math.round(t*10/1e3),i=Math.floor(n/2),a=Math.floor((e+i-n-1)/r)+1;if(a<=0)return 0;for(let e=0;e<2;++e)a=Math.floor((a-1)/2)+1;return Math.min(a,this.audio_seq_length)}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;if(t){i=await this.image_processor(t,r);let n=i.num_soft_tokens_per_image,a=0;e=e.map(e=>e.replaceAll(this.image_token,()=>` - -${this.boi_token}${this.image_token.repeat(n[a++])}${this.eoi_token} - -`))}let a;if(n){let t=Array.isArray(n)?n:[n];a=await this.feature_extractor(t[0],r);let i=this.feature_extractor.config.sampling_rate??16e3,o=0;e=e.map(e=>e.replaceAll(this.audio_token,()=>` - -${this.boa_token}${this.audio_token.repeat(this._compute_audio_num_tokens(t[o++].length,i))}${this.eoa_token} - -`))}return{...this.tokenizer(e,r),...i,...a}}},Em=class extends G{static image_processor_class=xm;static tokenizer_class=W;static image_token=`<|image_pad|>`;async _call(e,t=null,...n){Array.isArray(e)||(e=[e]);let r,i;if(t&&(r=await this.image_processor(t),i=r.image_grid_thw),i){let t=this.image_processor.config.merge_size**2,n=0,r=this.constructor.image_token,a=i.tolist();e=e.map(e=>{for(;e.includes(r);){let i=Number(a[n++].reduce((e,t)=>e*t,1n));e=e.replace(r,`<|placeholder|>`.repeat(Math.floor(i/t)))}return e.replaceAll(`<|placeholder|>`,r)})}return{...this.tokenizer(e),...r}}},Dm=class extends Em{static image_token=`<|image|>`},Om=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;_get_num_audio_features(e){let{hop_length:t}=this.feature_extractor.config.melspec_kwargs,{projector_window_size:n,projector_downsample_rate:r}=this.feature_extractor.config,i=Math.floor(n/r),a=Math.floor(e/t)+1,o=Math.floor(a/2);return Math.ceil(o/n)*i}async _call(e,t=null,n={}){if(Array.isArray(e))throw Error(`Batched inputs are not supported yet.`);let r={};if(t){let{input_features:n}=await this.feature_extractor(t);r.input_features=n;let i=this._get_num_audio_features(t.length);r.input_features_mask=new V(`bool`,new Uint8Array(i).fill(1),[1,i]);let a=this.config.audio_token??`<|audio|>`;if(!e.includes(a))throw Error(`The input text does not contain the audio token ${a}.`);e=e.replaceAll(a,a.repeat(i))}return{...this.tokenizer(e,{add_special_tokens:!1,...n}),...r}}};function km(e,t){let n=e.dims.at(-1)-1,r=e.tolist();r.fill(!1,0,1),r.fill(!1,n);let i=t.tolist();return r.map((e,t)=>e?t:null).filter(e=>e!==null).map(e=>i[e])}var Am=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t,n={}){let r=e?await this.image_processor(e,n):{};return{...t?this.tokenizer(t,n):{},...r}}post_process_grounded_object_detection(e,t,{box_threshold:n=.25,text_threshold:r=.25,target_sizes:i=null}={}){let{logits:a,pred_boxes:o}=e,s=a.dims[0];if(i!==null&&i.length!==s)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let c=a.dims.at(1),l=a.sigmoid(),u=l.max(-1).tolist(),d=o.tolist().map(e=>e.map(e=>Wf(e))),f=[];for(let e=0;ee.map((e,t)=>e*a[(t+1)%2])));let o=u[e],s=[],p=[],m=[];for(let i=0;i`+i.repeat(e);o+=` -`}return o+=` -${r}${a}`+i.repeat(e)+`${r}`,o}function Mm(e,t,n,r){return`${t}${r}`+n.repeat(e)+`${t}`}function Nm(e,t,n,r,i,a){return e===0&&t===0?Mm(n,r,i,a):jm(n,e,t,r,i,a)}var Pm=class extends G{static image_processor_class=xm;static tokenizer_class=W;static uses_processor_config=!0;fake_image_token=``;image_token=``;global_img_token=``;async _call(e,t=null,n={}){n.return_row_col_info??=!0;let r;t&&(r=await this.image_processor(t,n)),Array.isArray(e)||(e=[e]);let i=r.rows??[Array(e.length).fill(0)],a=r.cols??[Array(e.length).fill(0)],o=this.config.image_seq_len,s=[],c=[];for(let t=0;tNm(e,l[t],o,this.fake_image_token,this.image_token,this.global_img_token)),d=n.split(this.image_token);if(d.length===0)throw Error(`The image token should be present in the text.`);let f=d[0];for(let e=0;ee.images).flatMap(e=>e.images).map(e=>Vf.read(e)));let r=this.tokenizer,i=r.apply_chat_template(e,{tokenize:!1,add_generation_prompt:!0,chat_template:n}),a=e=>r.encode(e,{add_special_tokens:!1}),o=i.split(this.image_tag),s=o.length-1;if(t.length!==s)throw Error(`Number of images provided (${t.length}) does not match number of "${this.image_tag}" image tags (${s})`);let[c,l,u]=r.convert_tokens_to_ids([this.image_tag,this.image_start_tag,this.image_end_tag]),d=a(o[0]),f=Array(d.length).fill(!1);for(let e=1;e0){let e=await this.image_processor(t);return e.pixel_values.unsqueeze_(0),{...m,...e}}return m}},Im=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e=null,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=e?this.tokenizer(e,n):{},i=t?await this.image_processor(t,n):{};return{...r,...i}}},Lm=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t=null,n={}){let{image_rows:r,image_cols:i,image_sizes:a,...o}=await this.image_processor(e,{...n,return_row_col_info:!0});if(t){let e=this.config.image_token??``,{tile_size:n=512,downsample_factor:o=2,encoder_patch_size:s=16,use_thumbnail:c=!0}=this.image_processor.config,l=e=>Math.ceil(Math.floor(e/s)/o),u=l(n)**2,d=this.config.image_start_token??`<|image_start|>`,f=this.config.image_end_token??`<|image_end|>`,p=this.config.image_thumbnail??`<|img_thumbnail|>`;Array.isArray(t)||(t=[t]);let m=0;t=t.map(t=>{let n=t.split(e);return n[0]+n.slice(1).map(t=>{let n=m++,[o,s]=a[n],h=r[n],g=i[n],_=l(o)*l(s),v=d;if(h>1||g>1){let t=e.repeat(u);for(let e=0;e`+t;c&&(v+=p+e.repeat(_))}else v+=e.repeat(_);return v+f+t}).join(``)})}return{...o,...t?this.tokenizer(t,n):{}}}},Rm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,patch_size:a,num_additional_image_tokens:o}=this.config,s=Math.floor(e/a)*Math.floor(n/a)+o;t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;e0?i.reduce((e,t)=>e*t,1):0;c.push(n),s.push(a)}return[i(c),s]}char_decode(e){return this.char_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}bpe_decode(e){return this.bpe_tokenizer.batch_decode(e)}wp_decode(e){return this.wp_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}batch_decode([e,t,n]){let[r,i]=this._decode_helper(e,`char`),[a,o]=this._decode_helper(t,`bpe`),[s,c]=this._decode_helper(n,`wp`),l=[],u=[];for(let e=0;e`;function Wm(e,t,n,r,i){return`${r.repeat(n*i)}${t}${e} -`}var Gm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!1;async _call(e,t=null,n={}){t||=(A.warn(`You are using PaliGemma without a text prefix. It will perform as a picture-captioning model.`),``),Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let r=this.tokenizer.bos_token,i=this.image_processor.config.image_seq_length,a;t.some(e=>e.includes(Um))?a=t.map(e=>{let t=e.replaceAll(Um,Um.repeat(i)),n=t.lastIndexOf(Um),a=n===-1?0:n+Um.length;return t.slice(0,a)+r+t.slice(a)+` -`}):(A.warn("You are passing both `text` and `images` to `PaliGemmaProcessor`. The processor expects special image tokens in the text, as many tokens as there are images per each text. It is recommended to add `` tokens in the very beginning of your text. For this call, we will infer how many images each text has and add special tokens."),a=t.map(t=>Wm(t,r,i,Um,e.length)));let o=this.tokenizer(a,n);return{...await this.image_processor(e,n),...o}}},Km=`<|image|>`,qm=/<\|image_\d+\|>/g,Jm=class extends G{static image_processor_class=xm;static tokenizer_class=W;async _call(e,t=null,{padding:n=!0,truncation:r=!0,num_crops:i=null}={}){Array.isArray(e)||(e=[e]);let a,o;if(t){o=await this.image_processor(t,{num_crops:i});let{num_img_tokens:s}=o,c=e.map((e,t)=>e.split(qm).join(Km.repeat(s[t])));a=this.tokenizer(c,{padding:n,truncation:r});let l=this.tokenizer._tokenizer.token_to_id(Km);a.input_ids.map_(e=>e==l?-e:e)}else a=this.tokenizer(e);return{...a,...o}}},Ym=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,image_break_token:a,image_end_token:o,patch_size:s,spatial_merge_size:c}=this.config,l=s*c,u=Math.floor(e/l),d=Math.floor(n/l);t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;esh(e,o)),c=s.map(e=>e.length),l=s.flat(),u=(await Promise.all(l.map(e=>this.feature_extractor(e,n)))).map(e=>e.input_features);r.audio_values=u.length>1?H(u,0):u[0];let d=i[0];for(let e=0;e0){if(l>Tc)throw Error(`The number of external data chunks (${l}) exceeds the maximum allowed value (${Tc}).`);let t=Th(o,l);for(let n of t){let t=`${r.subfolder??``}/${n}`;c.push(new Promise(async(i,a)=>{let o=await tl(e,t,!0,r,s);i(o instanceof Uint8Array?{path:n,data:o}:n)}))}}else a.externalData!==void 0&&(c=a.externalData.map(async t=>{if(typeof t.data==`string`){let n=await tl(e,t.data,!0,r);return{...t,data:n}}return t}));return Promise.all(c)}async function Oh(e,t,n,r=!1,i=void 0){let a=n.config?.[`transformers.js_config`]??{},o=Gl(n.device??a.device,t,{warn:e=>A.info(e)}),s=jl(o),c=a.device_config??{};c.hasOwnProperty(o)&&(a={...a,...c[o]});let l=Zl(n.dtype??a.dtype,t,o,{configDtype:a.dtype,warn:e=>A.info(e)});if(!Xl.hasOwnProperty(l))throw Error(`Invalid dtype: ${l}. Should be one of: ${Object.keys(ql).join(`, `)}`);if(o===`webgpu`&&!O.IS_NODE_ENV&&l===ql.fp16&&!await Kl())throw Error(`The device (${o}) does not support fp16.`);let u=Xl[l],d={...n.session_options};d.executionProviders??=s;let f=a.free_dimension_overrides;f?d.freeDimensionOverrides??=f:o.startsWith(`webnn`)&&!d.freeDimensionOverrides&&A.warn(`WebNN does not currently support dynamic shapes and requires 'free_dimension_overrides' to be set in config.json, preferably as a field within config["transformers.js_config"]["device_config"]["${o}"]. When 'free_dimension_overrides' is not set, you may experience significant performance degradation.`);let p=Eh(e,t,n,u),m=await Dh(e,t,u,n,n.use_external_data_format??a.use_external_data_format,d);if(m.length>0&&(!O.IS_NODE_ENV||m.some(e=>typeof e!=`string`))&&(d.externalData=m),r&&o===`webgpu`){let e=bh(n.config,{prefix:`present`,session_name:i});if(e.size>0&&!Bl()){let t={};for(let n of e)t[n]=`gpu-buffer`;d.preferredOutputLocation=t}}return{buffer_or_path:await p,session_options:d,session_config:{dtype:l,device:o}}}async function kh(e,t,n,r=void 0){return Object.fromEntries(await Promise.all(Object.keys(t).map(async i=>{let a=r?.[i]??!1,{buffer_or_path:o,session_options:s,session_config:c}=await Oh(e,t[i],n,a,i);return[i,await Fl(o,s,c)]})))}function Ah(e){for(let t in e)Rl(e[t])?e[t]=new V(e[t]):typeof e[t]==`object`&&Ah(e[t]);return e}async function q(e,t){let n=jh(e,t);try{return Ah(await Ll(e,Object.fromEntries(Object.entries(n).map(([e,t])=>{let n=t.ort_tensor;return O.IS_NODE_ENV&&typeof Float16Array<`u`&&n.cpuData instanceof Float16Array&&(n.cpuData=new Uint16Array(n.cpuData.buffer)),[e,n]}))))}catch(e){let t=Object.fromEntries(Object.entries(n).map(([e,t])=>{let n={type:t.type,dims:t.dims,location:t.location};return n.location!==`gpu-buffer`&&(n.data=t.data),[e,n]}));throw A.error(`An error occurred during model execution: "${e}".`),A.error(`Inputs given to model:`,t),e}}function jh(e,t){let n=/* @__PURE__ */ Object.create(null),r=[];for(let i of e.inputNames){let e=t[i];if(!(e instanceof V)){r.push(i);continue}n[i]=Bl()?e.clone():e}if(r.length>0)throw Error(`An error occurred during model execution: "Missing the following inputs: ${r.join(`, `)}.`);let i=Object.keys(t).length,a=e.inputNames.length;if(i>a){let n=Object.keys(t).filter(t=>!e.inputNames.includes(t));A.warn(`WARNING: Too many inputs were provided (${i} > ${a}). The following inputs will be ignored: "${n.join(`, `)}".`)}return n}var Mh=class{},Nh=class extends Mh{constructor({last_hidden_state:e,hidden_states:t=null,attentions:n=null}){super(),this.last_hidden_state=e,this.hidden_states=t,this.attentions=n}},J=class extends Mh{constructor({logits:e,...t}){super(),this.logits=e;let n=Object.values(t);n.length>0&&(this.attentions=n)}},Ph=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Fh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Ih=class extends Mh{constructor({start_logits:e,end_logits:t}){super(),this.start_logits=e,this.end_logits=t}},Lh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Rh=class extends Mh{constructor({logits:e,past_key_values:t}){super(),this.logits=e,this.past_key_values=t}},zh=class extends Mh{constructor({logits:e,past_key_values:t,encoder_outputs:n,decoder_attentions:r=null,cross_attentions:i=null}){super(),this.logits=e,this.past_key_values=t,this.encoder_outputs=n,this.decoder_attentions=r,this.cross_attentions=i}},Bh=class extends Mh{constructor({alphas:e}){super(),this.alphas=e}},Vh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Hh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Uh=class extends $r{constructor(){super(),this.processors=[]}push(e){this.processors.push(e)}extend(e){this.processors.push(...e)}_call(e,t){let n=t;for(let t of this.processors)n=t(e,n);return n}[Symbol.iterator](){return this.processors.values()}},Wh=class extends Vh{constructor(e){super(),this.bos_token_id=e}_call(e,t){for(let n=0;n=1&&i[i.length-1]>=this.timestamp_begin,o=i.length<2||i[i.length-2]>=this.timestamp_begin;if(a&&(o?r.subarray(this.timestamp_begin).fill(-1/0):r.subarray(0,this.eos_token_id).fill(-1/0)),e[n].length===this.begin_index&&this.max_initial_timestamp_index!==null){let e=this.timestamp_begin+this.max_initial_timestamp_index;r.subarray(e+1).fill(-1/0)}let s=sl(r);Math.log(s.subarray(this.timestamp_begin).map(Math.exp).reduce((e,t)=>e+t))>ll(s.subarray(0,this.timestamp_begin))[0]&&r.subarray(0,this.timestamp_begin).fill(-1/0)}return t}},Yh=class extends Vh{constructor(e){super(),this.no_repeat_ngram_size=e}getNgrams(e){let t=e.length,n=[];for(let r=0;r1 to use the classifier-free guidance processor, got guidance scale ${e}.`);this.guidance_scale=e}_call(e,t){if(t.dims[0]!==2*e.length)throw Error(`Logits should have twice the batch size of the input ids, the first half of batches corresponding to the conditional inputs, and the second half of batches corresponding to the unconditional inputs. Got batch size ${t.dims[0]} for the logits and ${e.length} for the input ids.`);let n=e.length,r=t.slice([0,n],null),i=t.slice([n,t.dims[0]],null);for(let e=0;ee.length>=this.max_length)}},og=class extends rg{constructor(e){super(),Array.isArray(e)||(e=[e]),this.eos_token_id=e}_call(e,t){return e.map(e=>{let t=e.at(-1);return this.eos_token_id.some(e=>t==e)})}},sg=class extends $r{constructor(e){super(),this.generation_config=e}async _call(e){return this.sample(e)}async sample(e){throw Error(`sample should be implemented in subclasses.`)}getLogits(e,t){let n=e.dims.at(-1),r=e.data;if(t===-1)r=r.slice(-n);else{let e=t*n;r=r.slice(e,e+n)}return r}randomSelect(e){return xc(e)}static getSampler(e){if(e.do_sample)return new lg(e);if(e.num_beams>1)return new ug(e);if(e.num_return_sequences>1)throw Error(`num_return_sequences has to be 1 when doing greedy search, but is ${e.num_return_sequences}.`);return new cg(e)}},cg=class extends sg{async sample(e){let t=ll(e.data)[1];return[[BigInt(t),0]]}},lg=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},()=>{let e=this.randomSelect(i);return[r.data[e],Math.log(i[e])]})}},ug=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},(e,t)=>[r.data[t],Math.log(i[t])])}},dg=class{constructor(e){if(e)for(let t in e){if(t in this)throw TypeError(`Key "${t}" conflicts with an existing property on DynamicCache`);let n=e[t];if(!(n instanceof V))throw TypeError(`Expected a Tensor for key "${t}", got ${typeof n}`);this[t]=n}}get_seq_length(){let e=this;if(Object.keys(e).length===0)return 0;for(let t in e)if(t.startsWith(`past_key_values.`))return e[t].dims.at(-2);throw Error(`Unable to determine sequence length from the cache.`)}update(e){for(let t in e){let n=this[t],r=e[t];n&&n!==r&&n.location===`gpu-buffer`&&n.dispose(),this[t]=r}}async dispose(){let e=[];for(let t of Object.values(this))t.location===`gpu-buffer`&&e.push(t.dispose());await Promise.all(e)}},Y={EncoderOnly:0,EncoderDecoder:1,Seq2Seq:2,Vision2Seq:3,DecoderOnly:4,DecoderOnlyWithoutHead:5,MaskGeneration:6,ImageTextToText:7,Musicgen:8,MultiModality:9,Phi3V:10,AudioTextToText:11,AutoEncoder:12,ImageAudioTextToText:13,Supertonic:14,Chatterbox:15,VoxtralRealtime:16},fg={[Y.DecoderOnly]:{sessions:(e,t)=>({model:t.model_file_name??`model`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.DecoderOnlyWithoutHead]:{sessions:(e,t)=>({model:t.model_file_name??`model`})},[Y.Seq2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Vision2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Musicgen]:{sessions:()=>({model:`text_encoder`,decoder_model_merged:`decoder_model_merged`,encodec_decode:`encodec_decode`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.EncoderDecoder]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0}},[Y.MaskGeneration]:{sessions:()=>({model:`vision_encoder`,prompt_encoder_mask_decoder:`prompt_encoder_mask_decoder`})},[Y.ImageTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageTextToText].text_only_sessions};return n||(r.vision_encoder=`vision_encoder`),e.is_encoder_decoder&&(r.model=`encoder_model`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.AudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.ImageAudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageAudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`,r.vision_encoder=`vision_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Phi3V]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`model`,vision_encoder:`vision_encoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.MultiModality]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`language_model`,lm_head:`lm_head`,gen_head:`gen_head`,gen_img_embeds:`gen_img_embeds`,image_decode:`image_decode`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AutoEncoder]:{sessions:()=>({encoder_model:`encoder_model`,decoder_model:`decoder_model`})},[Y.Supertonic]:{sessions:()=>({text_encoder:`text_encoder`,latent_denoiser:`latent_denoiser`,voice_decoder:`voice_decoder`})},[Y.Chatterbox]:{sessions:()=>({embed_tokens:`embed_tokens`,speech_encoder:`speech_encoder`,model:`language_model`,conditional_decoder:`conditional_decoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.VoxtralRealtime]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.VoxtralRealtime].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0,audio_encoder:!0},optional_configs:{generation_config:`generation_config.json`}},default:{sessions:(e,t)=>({model:t.model_file_name??`model`})}};function pg(e,t,n={}){let r=fg[e]??fg.default;return{sessions:r.sessions(t,n,n.textOnly??!1),cache_sessions:r.cache_sessions,optional_configs:r.optional_configs}}function mg(e,{warn:t=!0}={}){let n=e.architectures||[];for(let e of n){let t=Cg.get(e);if(t!==void 0)return t}if(e.model_type){let t=Cg.get(e.model_type);if(t!==void 0)return t;for(let t of Object.values(_g))if(t.has(e.model_type)){let n=Cg.get(t.get(e.model_type));if(n!==void 0)return n}}if(t){let t=n.length>0?n.join(`, `):`(none)`;A.warn(`[resolve_model_type] Architecture(s) not found in MODEL_TYPE_MAPPING: [${t}] for model type '${e.model_type}'. Falling back to EncoderOnly (single model.onnx file). If you encounter issues, please report at: ${Nd}`)}return Y.EncoderOnly}function hg(e,{config:t=null,cache_dir:n=null,local_files_only:r=!1,revision:i=`main`}={}){return t===null?Wc(Ac(e,{cache_dir:n,local_files_only:r,revision:i}),()=>Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})):Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})}async function gg(e,{config:t=null,dtype:n=null,device:r=null,model_file_name:i=null}={}){t=await hg(e,{config:t});let a=[`config.json`],o=t[`transformers.js_config`]??{},s=o.use_external_data_format,c=`onnx`,l=r??o.device,u=n??o.dtype,d=mg(t),f=(e,t=null)=>{t??=e;let n=Gl(l,e),r=Xl[Zl(u,e,n)]??``,i=`${t}${r}.onnx`,o=`${c}/${i}`;a.push(o);let d=wh(s,i,e);for(let e of Th(i,d)){let t=`${c}/${e}`;a.push(t)}},{sessions:p,optional_configs:m}=pg(d,t,{model_file_name:i});for(let[e,t]of Object.entries(p))f(e,t);if(m)for(let e of Object.values(m))a.push(e);return a}var _g=null;function vg(e){_g=e}function yg(e){if(e instanceof V)return e;if(e.length===0)throw Error(`items must be non-empty`);if(Array.isArray(e[0])){if(e.some(t=>t.length!==e[0].length))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' and/or 'truncation=True' to have batched tensors with the same length.`);return new V(`int64`,BigInt64Array.from(e.flat().map(e=>BigInt(e))),[e.length,e[0].length])}return new V(`int64`,BigInt64Array.from(e.map(e=>BigInt(e))),[1,e.length])}function bg(e){return new V(`bool`,[e],[1])}var xg={[Y.DecoderOnly]:{can_generate:!0,forward:Pg,prepare_inputs:Bg},[Y.DecoderOnlyWithoutHead]:{can_generate:!1,forward:Pg,prepare_inputs:Bg},[Y.Seq2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Vision2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Musicgen]:{can_generate:!0,forward:Eg},[Y.EncoderDecoder]:{can_generate:!1,forward:Eg},[Y.ImageTextToText]:{can_generate:!0,forward:Lg,prepare_inputs:Hg},[Y.AudioTextToText]:{can_generate:!0,forward:Ig,prepare_inputs:Hg},[Y.ImageAudioTextToText]:{can_generate:!0,prepare_inputs:Hg},[Y.Phi3V]:{can_generate:!0,prepare_inputs:Hg},[Y.MultiModality]:{can_generate:!0},[Y.AutoEncoder]:{can_generate:!1,forward:Og},[Y.Chatterbox]:{can_generate:!0,forward:Dg},[Y.VoxtralRealtime]:{can_generate:!0,prepare_inputs:Bg},default:{can_generate:!1,forward:Dg}};function Sg(e,t){let n=Cg.get(e),r=!1,i=t?.architectures?.[0];if(i&&i!==e&&e?.endsWith(`ForCausalLM`)&&i.endsWith(`ForConditionalGeneration`)){let e=Cg.get(i);e!==void 0&&(n=e,r=!0)}let a=xg[n]??xg.default,o=fg[n]??fg.default;return{typeConfig:{...a,...o},textOnly:r,modelType:n}}var Cg=/* @__PURE__ */ new Map,wg=/* @__PURE__ */ new Map,Tg=/* @__PURE__ */ new Map,X=class extends $r{main_input_name=`input_ids`;forward_params=[`input_ids`,`attention_mask`];_return_dict_in_generate_keys=null;constructor(e,t,n){super(),this.config=e,this.sessions=t,this.configs=n;let{typeConfig:r}=Sg(Tg.get(this.constructor),e);this.can_generate=r.can_generate,this._forward=r.forward,this._prepare_inputs_for_generation=r.prepare_inputs,this.can_generate&&this.forward_params.push(`past_key_values`),this.custom_config=this.config[`transformers.js_config`]??{}}async dispose(){let e=[];for(let t of Object.values(this.sessions))e.push(t.release?.());return await Promise.all(e)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d},p=Tg.get(this);n=f.config=await Ch.from_pretrained(e,f);let{typeConfig:m,textOnly:h,modelType:g}=Sg(p,n);if(g===void 0){let e=p??n?.model_type;e!==`custom`&&A.warn(`Model type for '${e}' not found, assuming encoder-only architecture. Please report this at ${Nd}.`)}if(t&&!(t instanceof ti)){let r={};try{let t=await gg(e,{config:n,dtype:l,device:c,model_file_name:o});(await Promise.all(t.map(t=>Kc(e,t,f)))).forEach((e,n)=>{if(e.exists){let i=t[n]===`config.json`;r[t[n]]={loaded:i?e.size??0:0,total:e.size??0}}})}catch(e){A.warn(`Unable to fetch model file metadata for total progress tracking: ${e}`)}Object.keys(r).length>0&&(f.progress_callback=new ti(t,r))}let _=[kh(e,m.sessions(n,f,h),f,m.cache_sessions)];m.optional_configs&&_.push(Kg(e,m.optional_configs,f));let v=await Promise.all(_);return new this(n,...v)}async _call(e){return await this.forward(e)}async forward(e){return await this._forward(this,e)}get generation_config(){return this.configs?.generation_config??null}_get_logits_processor(e,t,n=null){let r=new Uh;if(e.repetition_penalty!==null&&e.repetition_penalty!==1&&r.push(new Xh(e.repetition_penalty)),e.no_repeat_ngram_size!==null&&e.no_repeat_ngram_size>0&&r.push(new Yh(e.no_repeat_ngram_size)),e.bad_words_ids!==null&&r.push(new $h(e.bad_words_ids,e.eos_token_id)),e.min_length!==null&&e.eos_token_id!==null&&e.min_length>0&&r.push(new Zh(e.min_length,e.eos_token_id)),e.min_new_tokens!==null&&e.eos_token_id!==null&&e.min_new_tokens>0&&r.push(new Qh(t,e.min_new_tokens,e.eos_token_id)),e.forced_bos_token_id!==null&&r.push(new Wh(e.forced_bos_token_id)),e.forced_eos_token_id!==null&&r.push(new Gh(e.max_length,e.forced_eos_token_id)),e.suppress_tokens!==null&&r.push(new Kh(e.suppress_tokens)),e.begin_suppress_tokens!==null){let n=t>1||e.forced_bos_token_id===null?t:t+1;r.push(new qh(e.begin_suppress_tokens,n))}return e.guidance_scale!==null&&e.guidance_scale>1&&r.push(new eg(e.guidance_scale)),e.temperature===0&&e.do_sample&&(A.warn("`do_sample` changed to false because `temperature: 0` implies greedy sampling (always selecting the most likely token), which is incompatible with `do_sample: true`."),e.do_sample=!1),e.do_sample&&e.temperature!==null&&e.temperature!==1&&r.push(new tg(e.temperature)),n!==null&&r.extend(n),r}_prepare_generation_config(e,t,n=ng){let r={...this.config};for(let e of[`decoder`,`generator`,`text_config`])e in r&&Object.assign(r,r[e]);let i=new n(r);return Object.assign(i,this.generation_config??{}),e&&Object.assign(i,e),t&&Object.assign(i,ci(t,Object.getOwnPropertyNames(i))),i}_get_stopping_criteria(e,t=null){let n=new ig;return e.max_length!==null&&n.push(new ag(e.max_length,this.config.max_position_embeddings??null)),e.eos_token_id!==null&&n.push(new og(e.eos_token_id)),t&&n.extend(t),n}_validate_model_class(){if(!this.can_generate){let e=[_g.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES,_g.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES].filter(Boolean),t=Tg.get(this.constructor),n=/* @__PURE__ */ new Set,r=this.config.model_type;for(let t of e){let e=t?.get(r);e&&n.add(e)}let i=`The current model class (${t}) is not compatible with \`.generate()\`, as it doesn't have a language model head.`;throw n.size>0&&(i+=` Please use the following class instead: ${[...n].join(`, `)}`),Error(i)}}prepare_inputs_for_generation(...e){if(!this._prepare_inputs_for_generation)throw Error(`prepare_inputs_for_generation is not implemented for this model.`);return this._prepare_inputs_for_generation(this,...e)}_update_model_kwargs_for_generation({generated_input_ids:e,outputs:t,model_inputs:n,is_encoder_decoder:r}){return n.past_key_values=kg(t,n.past_key_values),n.input_ids=new V(`int64`,e.flat(),[e.length,1]),r?`decoder_attention_mask`in n&&(n.decoder_attention_mask=H([n.decoder_attention_mask,yu([n.decoder_attention_mask.dims[0],1])],1)):n.attention_mask=H([n.attention_mask,yu([n.attention_mask.dims[0],1])],1),n.position_ids=null,n}_prepare_model_inputs({inputs:e,bos_token_id:t,model_kwargs:n}){let r=ci(n,this.forward_params),i=this.main_input_name;if(i in r){if(e)throw Error("`inputs`: {inputs}` were passed alongside {input_name} which is not allowed. Make sure to either pass {inputs} or {input_name}=...")}else r[i]=e;return{inputs_tensor:r[i],model_inputs:r,model_input_name:i}}async _prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:e,model_inputs:t,model_input_name:n,generation_config:r}){if(this.sessions.model.inputNames.includes(`inputs_embeds`)&&!t.inputs_embeds&&`_prepare_inputs_embeds`in this){let{input_ids:e,pixel_values:n,attention_mask:r,...i}=t,a=await this._prepare_inputs_embeds(t);t={...i,...ci(a,[`inputs_embeds`,`attention_mask`])}}let{last_hidden_state:i}=await Dg(this,t);if(r.guidance_scale!==null&&r.guidance_scale>1)i=H([i,vu(i,0)],0),`attention_mask`in t&&(t.attention_mask=H([t.attention_mask,Su(t.attention_mask)],0));else if(t.decoder_input_ids){let e=yg(t.decoder_input_ids).dims[0];if(e!==i.dims[0]){if(i.dims[0]!==1)throw Error(`The encoder outputs have a different batch size (${i.dims[0]}) than the decoder inputs (${e}).`);i=H(Array.from({length:e},()=>i),0)}}return t.encoder_outputs=i,t}_prepare_decoder_input_ids_for_generation({batch_size:e,model_input_name:t,model_kwargs:n,decoder_start_token_id:r,bos_token_id:i,generation_config:a}){let{decoder_input_ids:o,...s}=n;if(!(o instanceof V)){if(o)Array.isArray(o[0])||(o=Array.from({length:e},()=>o));else if(r??=i,this.config.model_type===`musicgen`)o=Array.from({length:e*this.config.decoder.num_codebooks},()=>[r]);else if(Array.isArray(r)){if(r.length!==e)throw Error(`\`decoder_start_token_id\` expected to have length ${e} but got ${r.length}`);o=r}else o=Array.from({length:e},()=>[r]);o=yg(o)}return s.decoder_attention_mask=bu(o),{input_ids:o,model_inputs:s}}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,streamer:i=null,...a}){this._validate_model_class(),t=this._prepare_generation_config(t,a);let{inputs_tensor:o,model_inputs:s,model_input_name:c}=this._prepare_model_inputs({inputs:e,model_kwargs:a}),l=this.config.is_encoder_decoder;l&&(`encoder_outputs`in s||(s=await this._prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:o,model_inputs:s,model_input_name:c,generation_config:t})));let u;l?{input_ids:u,model_inputs:s}=this._prepare_decoder_input_ids_for_generation({batch_size:s[c].dims.at(0),model_input_name:c,model_kwargs:s,decoder_start_token_id:t.decoder_start_token_id,bos_token_id:t.bos_token_id,generation_config:t}):u=s[c];let d=u.dims.at(-1);t.max_new_tokens!==null&&(t.max_length=d+t.max_new_tokens);let f=this._get_logits_processor(t,d,n),p=this._get_stopping_criteria(t,r),m=s[c].dims.at(0),h=sg.getSampler(t),g=Array(m).fill(0),_=u.tolist();i&&i.put(_);let v,y={},b={};for(;;){if(s=this.prepare_inputs_for_generation(_,s,t),v=await this.forward(s),t.return_dict_in_generate){if(t.output_attentions){let e=Ag(v);for(let t in e)t in y||(y[t]=[]),y[t].push(e[t])}else this._return_dict_in_generate_keys&&Object.assign(b,ci(v,this._return_dict_in_generate_keys))}let e=f(_,v.logits.slice(null,-1,null).to(`float32`)),n=[];for(let t=0;te))break;s=this._update_model_kwargs_for_generation({generated_input_ids:n,outputs:v,model_inputs:s,is_encoder_decoder:l})}i&&i.end();let x=new V(`int64`,_.flat(),[_.length,_[0].length]),S=kg(v,s.past_key_values),C=new Set(Object.values(S));for(let e of Object.values(v))e.location===`gpu-buffer`&&!C.has(e)&&e.dispose();return`past_key_values`in a||t.return_dict_in_generate||await S.dispose(),t.return_dict_in_generate?{sequences:x,past_key_values:S,...y,...b}:x}async _encode_input(e,t,n){if(!Object.hasOwn(this.sessions,e))throw Error(`Model does not have a ${e} session.`);let r=this.sessions[e];return(await q(r,ci(t,r.inputNames)))[n]}async encode_image(e){return this._encode_input(`vision_encoder`,e,`image_features`)}async encode_text(e){return this._encode_input(`embed_tokens`,e,`inputs_embeds`)}async encode_audio(e){return this._encode_input(`audio_encoder`,e,`audio_features`)}};async function Eg(e,t){let{encoder_outputs:n,input_ids:r,decoder_input_ids:i,decoder_attention_mask:a,...o}=t;return n||=(await Dg(e,ci(t,e.sessions.model.inputNames))).last_hidden_state,o.input_ids=i,o.encoder_hidden_states=n,e.sessions.decoder_model_merged.inputNames.includes(`encoder_attention_mask`)&&(o.encoder_attention_mask=t.attention_mask),a&&!o.attention_mask&&(o.attention_mask=a),await Pg(e,o,!0)}async function Dg(e,t){let n=e.sessions.model,r=ci(t,n.inputNames);if(n.inputNames.includes(`inputs_embeds`)&&!r.inputs_embeds){if(!t.input_ids)throw Error("Both `input_ids` and `inputs_embeds` are missing in the model inputs.");r.inputs_embeds=await e.encode_text({input_ids:t.input_ids})}if(n.inputNames.includes(`token_type_ids`)&&!r.token_type_ids){if(!r.input_ids)throw Error("Both `input_ids` and `token_type_ids` are missing in the model inputs.");r.token_type_ids=Su(r.input_ids)}if(n.inputNames.includes(`pixel_mask`)&&!r.pixel_mask){if(!r.pixel_values)throw Error("Both `pixel_values` and `pixel_mask` are missing in the model inputs.");let e=r.pixel_values.dims;r.pixel_mask=yu([e[0],e[2],e[3]])}return await q(n,r)}async function Og(e,t){let n=await e.encode(t);return await e.decode(n)}function kg(e,t){let n=/* @__PURE__ */ Object.create(null);for(let r in e)if(r.startsWith(`present`)){let i=r.replace(`present_ssm`,`past_ssm`).replace(`present_conv`,`past_conv`).replace(`present_recurrent`,`past_recurrent`).replace(`present_compressor`,`past_compressor`).replace(`present_indexer`,`past_indexer`).replace(`present`,`past_key_values`);n[i]=r.includes(`encoder`)&&t?t[i]:e[r]}return t?(t.update(n),t):new dg(n)}function Ag(e){let t={};for(let n of[`cross_attentions`,`encoder_attentions`,`decoder_attentions`])for(let r in e)r.startsWith(n)&&(n in t||(t[n]=[]),t[n].push(e[r]));return t}function jg(e,t){return e.map(e=>typeof e==`number`?e:t[e]??0)}function Mg(e,t,n){if(n&&Object.keys(n).length>0)return Object.assign(t,n),n;let r=e.sessions.decoder_model_merged??e.sessions.model,i=(t[e.main_input_name]??t.attention_mask)?.dims?.[0]??1,a=bh(e.config),o=e.config?.normalized_config?.num_heads,s={batch_size:i};typeof o==`number`&&(s[`batch_size x num_heads`]=i*o);let c=/* @__PURE__ */ Object.create(null);for(let e of r.inputMetadata){if(!a.has(e.name))continue;let n=jg(e.shape,s),r=n.reduce((e,t)=>e*t,1),i=Ql[e.type],o=new V(e.type,new i(r),n);t[e.name]=o,c[e.name]=o}return n?(n.update(c),n):new dg(c)}function Ng(e,t,n){t.num_logits_to_keep||(e.sessions.decoder_model_merged??e.sessions.model)?.inputNames.includes(`num_logits_to_keep`)&&(t.num_logits_to_keep=new V(`int64`,[n],[]))}async function Pg(e,t,n=!1){let r=e.sessions[n?`decoder_model_merged`:`model`],{past_key_values:i,...a}=t;return r.inputNames.includes(`use_cache_branch`)&&(a.use_cache_branch=bg(i!=null&&Object.keys(i).length>0)),r.inputNames.includes(`position_ids`)&&a.attention_mask&&!a.position_ids&&(a.position_ids=zg(a,i,+!![`paligemma`,`gemma3_text`,`gemma3`].includes(e.config.model_type))),Ng(e,a,0n),Mg(e,a,i),await q(r,ci(a,r.inputNames))}async function Fg(e,{encode_function:t,merge_function:n,modality_input_names:r,modality_output_name:i,input_ids:a=null,attention_mask:o=null,position_ids:s=null,inputs_embeds:c=null,past_key_values:l=null,generation_config:u=null,logits_processor:d=null,num_logits_to_keep:f=null,...p}){if(!c){c=await e.encode_text({input_ids:a,...p});let s=ci(p,r);if(Object.keys(s).length>0){if(a.dims[1]!==1){let e=await t({...s,...p});({inputs_embeds:c,attention_mask:o}=n({[i]:e,inputs_embeds:c,input_ids:a,attention_mask:o}))}else if(l&&a.dims[1]===1){let e=a.dims[1],t=l.get_seq_length();o=H([yu([a.dims[0],t]),o.slice(null,[o.dims[1]-e,o.dims[1]])],1)}}}if(!s&&[`qwen2_vl`,`qwen2_vl_text`,`qwen2_5_vl`,`qwen2_5_vl_text`,`qwen3_vl`,`qwen3_vl_text`,`qwen3_vl_moe`,`qwen3_vl_moe_text`,`qwen3_5`,`qwen3_5_text`,`qwen3_5_moe`,`qwen3_5_moe_text`,`glm_ocr`,`glm_ocr_text`].includes(e.config.model_type)){let{image_grid_thw:t,video_grid_thw:n}=p;[s]=e.get_rope_index(a,t,n,o)}return await Pg(e,{inputs_embeds:c,past_key_values:l,attention_mask:o,position_ids:s,generation_config:u,logits_processor:d,num_logits_to_keep:f},!0)}async function Ig(e,t){return await Fg(e,{...t,modality_input_names:[`audio_values`,`input_features`],modality_output_name:`audio_features`,encode_function:e.encode_audio.bind(e),merge_function:e._merge_input_ids_with_audio_features.bind(e)})}async function Lg(e,t){return await Fg(e,{...t,modality_input_names:[`pixel_values`],modality_output_name:`image_features`,encode_function:e.encode_image.bind(e),merge_function:e._merge_input_ids_with_image_features.bind(e)})}function Rg(e,t=0){let[n,r]=e.dims,i=e.data,a=new BigInt64Array(i.length);for(let e=0;ee.dims[1]||i[e.at(-1)])),Ng(e,n,1n),{...n,decoder_input_ids:yg(t)}}function Hg(e,...t){return e.config.is_encoder_decoder?Vg(e,...t):Bg(e,...t)}function Ug({modality_token_id:e,inputs_embeds:t,modality_features:n,input_ids:r,attention_mask:i}){let a=r.tolist().map(t=>t.reduce((t,n,r)=>(n==e&&t.push(r),t),[])),o=a.reduce((e,t)=>e+t.length,0),s=n.dims[0];if(o!==s)throw Error(`Number of tokens and features do not match: tokens: ${o}, features ${s}`);let c=0;for(let e=0;e[r,await rl(e,t[r],!1,n)])))}var qg={};Sr(qg,{ASTForAudioClassification:()=>u_,ASTModel:()=>l_,ASTPreTrainedModel:()=>c_,AfmoeForCausalLM:()=>i_,AfmoeModel:()=>r_,AfmoePreTrainedModel:()=>n_,AlbertForMaskedLM:()=>Qg,AlbertForQuestionAnswering:()=>Zg,AlbertForSequenceClassification:()=>Xg,AlbertModel:()=>Yg,AlbertPreTrainedModel:()=>Jg,ApertusForCausalLM:()=>t_,ApertusModel:()=>e_,ApertusPreTrainedModel:()=>$g,ArceeForCausalLM:()=>s_,ArceeModel:()=>o_,ArceePreTrainedModel:()=>a_,BartForConditionalGeneration:()=>p_,BartForSequenceClassification:()=>m_,BartModel:()=>f_,BartPretrainedModel:()=>d_,BaseModelOutput:()=>Nh,BeitForImageClassification:()=>__,BeitModel:()=>g_,BeitPreTrainedModel:()=>h_,BertForMaskedLM:()=>b_,BertForQuestionAnswering:()=>C_,BertForSequenceClassification:()=>x_,BertForTokenClassification:()=>S_,BertModel:()=>y_,BertPreTrainedModel:()=>v_,BlenderbotForConditionalGeneration:()=>E_,BlenderbotModel:()=>T_,BlenderbotPreTrainedModel:()=>w_,BlenderbotSmallForConditionalGeneration:()=>k_,BlenderbotSmallModel:()=>O_,BlenderbotSmallPreTrainedModel:()=>D_,BloomForCausalLM:()=>M_,BloomModel:()=>j_,BloomPreTrainedModel:()=>A_,CHMv2ForDepthEstimation:()=>K_,CHMv2PreTrainedModel:()=>G_,CLIPModel:()=>Q_,CLIPPreTrainedModel:()=>Z_,CLIPSegForImageSegmentation:()=>av,CLIPSegModel:()=>iv,CLIPSegPreTrainedModel:()=>rv,CLIPTextModel:()=>$_,CLIPTextModelWithProjection:()=>ev,CLIPVisionModel:()=>tv,CLIPVisionModelWithProjection:()=>nv,CamembertForMaskedLM:()=>F_,CamembertForQuestionAnswering:()=>R_,CamembertForSequenceClassification:()=>I_,CamembertForTokenClassification:()=>L_,CamembertModel:()=>P_,CamembertPreTrainedModel:()=>N_,CausalLMOutput:()=>Lh,CausalLMOutputWithPast:()=>Rh,ChatterboxModel:()=>H_,ChatterboxPreTrainedModel:()=>V_,ChineseCLIPModel:()=>W_,ChineseCLIPPreTrainedModel:()=>U_,ClapAudioModelWithProjection:()=>X_,ClapModel:()=>J_,ClapPreTrainedModel:()=>q_,ClapTextModelWithProjection:()=>Y_,CodeGenForCausalLM:()=>cv,CodeGenModel:()=>sv,CodeGenPreTrainedModel:()=>ov,Cohere2ForCausalLM:()=>mv,Cohere2Model:()=>pv,Cohere2PreTrainedModel:()=>fv,CohereAsrForConditionalGeneration:()=>_v,CohereAsrModel:()=>gv,CohereAsrPreTrainedModel:()=>hv,CohereForCausalLM:()=>dv,CohereModel:()=>uv,CoherePreTrainedModel:()=>lv,ConvBertForMaskedLM:()=>bv,ConvBertForQuestionAnswering:()=>Cv,ConvBertForSequenceClassification:()=>xv,ConvBertForTokenClassification:()=>Sv,ConvBertModel:()=>yv,ConvBertPreTrainedModel:()=>vv,ConvNextForImageClassification:()=>Ev,ConvNextModel:()=>Tv,ConvNextPreTrainedModel:()=>wv,ConvNextV2ForImageClassification:()=>kv,ConvNextV2Model:()=>Ov,ConvNextV2PreTrainedModel:()=>Dv,DFineForObjectDetection:()=>Iv,DFineModel:()=>Fv,DFinePreTrainedModel:()=>Pv,DINOv3ConvNextModel:()=>ky,DINOv3ConvNextPreTrainedModel:()=>Oy,DINOv3ViTModel:()=>jy,DINOv3ViTPreTrainedModel:()=>Ay,DPTForDepthEstimation:()=>Hy,DPTModel:()=>Vy,DPTPreTrainedModel:()=>By,DacDecoderModel:()=>Hv,DacDecoderOutput:()=>Rv,DacEncoderModel:()=>Vv,DacEncoderOutput:()=>Lv,DacModel:()=>Bv,DacPreTrainedModel:()=>zv,DebertaForMaskedLM:()=>Gv,DebertaForQuestionAnswering:()=>Jv,DebertaForSequenceClassification:()=>Kv,DebertaForTokenClassification:()=>qv,DebertaModel:()=>Wv,DebertaPreTrainedModel:()=>Uv,DebertaV2ForMaskedLM:()=>ry,DebertaV2ForQuestionAnswering:()=>oy,DebertaV2ForSequenceClassification:()=>iy,DebertaV2ForTokenClassification:()=>ay,DebertaV2Model:()=>ny,DebertaV2PreTrainedModel:()=>ty,DecisionTransformerModel:()=>cy,DecisionTransformerPreTrainedModel:()=>sy,DeepseekV3ForCausalLM:()=>Zv,DeepseekV3Model:()=>Xv,DeepseekV3PreTrainedModel:()=>Yv,DeepseekV4ForCausalLM:()=>ey,DeepseekV4Model:()=>$v,DeepseekV4PreTrainedModel:()=>Qv,DeiTForImageClassification:()=>dy,DeiTModel:()=>uy,DeiTPreTrainedModel:()=>ly,DepthAnythingForDepthEstimation:()=>py,DepthAnythingPreTrainedModel:()=>fy,DepthProForDepthEstimation:()=>hy,DepthProPreTrainedModel:()=>my,DetrForObjectDetection:()=>vy,DetrForSegmentation:()=>yy,DetrModel:()=>_y,DetrObjectDetectionOutput:()=>by,DetrPreTrainedModel:()=>gy,DetrSegmentationOutput:()=>xy,Dinov2ForImageClassification:()=>wy,Dinov2Model:()=>Cy,Dinov2PreTrainedModel:()=>Sy,Dinov2WithRegistersForImageClassification:()=>Dy,Dinov2WithRegistersModel:()=>Ey,Dinov2WithRegistersPreTrainedModel:()=>Ty,DistilBertForMaskedLM:()=>Ly,DistilBertForQuestionAnswering:()=>Iy,DistilBertForSequenceClassification:()=>Py,DistilBertForTokenClassification:()=>Fy,DistilBertModel:()=>Ny,DistilBertPreTrainedModel:()=>My,DonutSwinModel:()=>zy,DonutSwinPreTrainedModel:()=>Ry,EdgeTamModel:()=>kE,EfficientNetForImageClassification:()=>Gy,EfficientNetModel:()=>Wy,EfficientNetPreTrainedModel:()=>Uy,ElectraForMaskedLM:()=>Jy,ElectraForQuestionAnswering:()=>Zy,ElectraForSequenceClassification:()=>Yy,ElectraForTokenClassification:()=>Xy,ElectraModel:()=>qy,ElectraPreTrainedModel:()=>Ky,Ernie4_5ForCausalLM:()=>eb,Ernie4_5Model:()=>$y,Ernie4_5PretrainedModel:()=>Qy,EsmForMaskedLM:()=>rb,EsmForSequenceClassification:()=>ib,EsmForTokenClassification:()=>ab,EsmModel:()=>nb,EsmPreTrainedModel:()=>tb,EuroBertForMaskedLM:()=>cb,EuroBertForSequenceClassification:()=>lb,EuroBertForTokenClassification:()=>ub,EuroBertModel:()=>sb,EuroBertPreTrainedModel:()=>ob,ExaoneForCausalLM:()=>pb,ExaoneModel:()=>fb,ExaonePreTrainedModel:()=>db,FalconForCausalLM:()=>gb,FalconH1ForCausalLM:()=>yb,FalconH1Model:()=>vb,FalconH1PreTrainedModel:()=>_b,FalconModel:()=>hb,FalconPreTrainedModel:()=>mb,FastViTForImageClassification:()=>Sb,FastViTModel:()=>xb,FastViTPreTrainedModel:()=>bb,Florence2ForConditionalGeneration:()=>wb,Florence2PreTrainedModel:()=>Cb,GLPNForDepthEstimation:()=>ix,GLPNModel:()=>rx,GLPNPreTrainedModel:()=>nx,GPT2LMHeadModel:()=>yx,GPT2Model:()=>vx,GPT2PreTrainedModel:()=>_x,GPTBigCodeForCausalLM:()=>sx,GPTBigCodeModel:()=>ox,GPTBigCodePreTrainedModel:()=>ax,GPTJForCausalLM:()=>Sx,GPTJModel:()=>xx,GPTJPreTrainedModel:()=>bx,GPTNeoForCausalLM:()=>ux,GPTNeoModel:()=>lx,GPTNeoPreTrainedModel:()=>cx,GPTNeoXForCausalLM:()=>px,GPTNeoXModel:()=>fx,GPTNeoXPreTrainedModel:()=>dx,Gemma2ForCausalLM:()=>Ab,Gemma2Model:()=>kb,Gemma2PreTrainedModel:()=>Ob,Gemma3ForCausalLM:()=>Rb,Gemma3ForConditionalGeneration:()=>Lb,Gemma3Model:()=>Ib,Gemma3PreTrainedModel:()=>Fb,Gemma3nForCausalLM:()=>Vb,Gemma3nForConditionalGeneration:()=>Bb,Gemma3nPreTrainedModel:()=>zb,Gemma4ForCausalLM:()=>Ub,Gemma4ForConditionalGeneration:()=>Hb,GemmaForCausalLM:()=>Db,GemmaModel:()=>Eb,GemmaPreTrainedModel:()=>Tb,GlmForCausalLM:()=>Kb,GlmModel:()=>Gb,GlmMoeDsaForCausalLM:()=>Yb,GlmMoeDsaModel:()=>Jb,GlmMoeDsaPreTrainedModel:()=>qb,GlmOcrForConditionalGeneration:()=>tx,GlmPreTrainedModel:()=>Wb,GptOssForCausalLM:()=>gx,GptOssModel:()=>hx,GptOssPreTrainedModel:()=>mx,GraniteForCausalLM:()=>Tx,GraniteModel:()=>wx,GraniteMoeHybridForCausalLM:()=>Ox,GraniteMoeHybridModel:()=>Dx,GraniteMoeHybridPreTrainedModel:()=>Ex,GranitePreTrainedModel:()=>Cx,GraniteSpeechForConditionalGeneration:()=>jx,GroundingDinoForObjectDetection:()=>Nx,GroundingDinoPreTrainedModel:()=>Mx,GroupViTModel:()=>Fx,GroupViTPreTrainedModel:()=>Px,HeliumForCausalLM:()=>Rx,HeliumModel:()=>Lx,HeliumPreTrainedModel:()=>Ix,HieraForImageClassification:()=>Vx,HieraModel:()=>Bx,HieraPreTrainedModel:()=>zx,HrmTextForCausalLM:()=>Wx,HrmTextModel:()=>Ux,HrmTextPreTrainedModel:()=>Hx,HubertForCTC:()=>Qx,HubertForSequenceClassification:()=>$x,HubertModel:()=>Zx,HubertPreTrainedModel:()=>Xx,HunYuanDenseV1ForCausalLM:()=>nS,HunYuanDenseV1Model:()=>tS,HunYuanDenseV1PreTrainedModel:()=>eS,IJepaForImageClassification:()=>oS,IJepaModel:()=>aS,IJepaPreTrainedModel:()=>iS,Idefics3ForConditionalGeneration:()=>rS,ImageMattingOutput:()=>Bh,JAISLMHeadModel:()=>lS,JAISModel:()=>cS,JAISPreTrainedModel:()=>sS,JinaCLIPModel:()=>dS,JinaCLIPPreTrainedModel:()=>uS,JinaCLIPTextModel:()=>fS,JinaCLIPVisionModel:()=>pS,Lfm2ForCausalLM:()=>gS,Lfm2Model:()=>hS,Lfm2MoeForCausalLM:()=>bS,Lfm2MoeModel:()=>yS,Lfm2MoePreTrainedModel:()=>vS,Lfm2PreTrainedModel:()=>mS,Lfm2VlForConditionalGeneration:()=>xS,LightOnOcrForConditionalGeneration:()=>_S,LiteWhisperForConditionalGeneration:()=>RO,Llama4ForCausalLM:()=>ES,Llama4PreTrainedModel:()=>TS,LlamaForCausalLM:()=>wS,LlamaModel:()=>CS,LlamaPreTrainedModel:()=>SS,LlavaForConditionalGeneration:()=>Mb,LlavaOnevisionForConditionalGeneration:()=>Mb,LlavaPreTrainedModel:()=>jb,LlavaQwen2ForCausalLM:()=>Pb,LongT5ForConditionalGeneration:()=>kS,LongT5Model:()=>OS,LongT5PreTrainedModel:()=>DS,M2M100ForConditionalGeneration:()=>MS,M2M100Model:()=>jS,M2M100PreTrainedModel:()=>AS,MBartForCausalLM:()=>US,MBartForConditionalGeneration:()=>VS,MBartForSequenceClassification:()=>HS,MBartModel:()=>BS,MBartPreTrainedModel:()=>zS,MPNetForMaskedLM:()=>aw,MPNetForQuestionAnswering:()=>cw,MPNetForSequenceClassification:()=>ow,MPNetForTokenClassification:()=>sw,MPNetModel:()=>iw,MPNetPreTrainedModel:()=>rw,MT5ForConditionalGeneration:()=>mw,MT5Model:()=>pw,MT5PreTrainedModel:()=>fw,MarianMTModel:()=>FS,MarianModel:()=>PS,MarianPreTrainedModel:()=>NS,MaskFormerForInstanceSegmentation:()=>RS,MaskFormerModel:()=>LS,MaskFormerPreTrainedModel:()=>IS,MaskedLMOutput:()=>Fh,Metric3DForDepthEstimation:()=>GS,Metric3DPreTrainedModel:()=>WS,Metric3Dv2ForDepthEstimation:()=>qS,Metric3Dv2PreTrainedModel:()=>KS,MgpstrForSceneTextRecognition:()=>XS,MgpstrModelOutput:()=>JS,MgpstrPreTrainedModel:()=>YS,MimiDecoderModel:()=>nC,MimiDecoderOutput:()=>QS,MimiEncoderModel:()=>tC,MimiEncoderOutput:()=>ZS,MimiModel:()=>eC,MimiPreTrainedModel:()=>$S,Ministral3ForCausalLM:()=>cC,Ministral3Model:()=>sC,Ministral3PreTrainedModel:()=>oC,MinistralForCausalLM:()=>aC,MinistralModel:()=>iC,MinistralPreTrainedModel:()=>rC,Mistral3ForConditionalGeneration:()=>fC,Mistral4ForCausalLM:()=>hC,Mistral4Model:()=>mC,Mistral4PreTrainedModel:()=>pC,MistralForCausalLM:()=>dC,MistralModel:()=>uC,MistralPreTrainedModel:()=>lC,MobileBertForMaskedLM:()=>vC,MobileBertForQuestionAnswering:()=>bC,MobileBertForSequenceClassification:()=>yC,MobileBertModel:()=>_C,MobileBertPreTrainedModel:()=>gC,MobileLLMForCausalLM:()=>CC,MobileLLMModel:()=>SC,MobileLLMPreTrainedModel:()=>xC,MobileNetV1ForImageClassification:()=>EC,MobileNetV1ForSemanticSegmentation:()=>DC,MobileNetV1Model:()=>TC,MobileNetV1PreTrainedModel:()=>wC,MobileNetV2ForImageClassification:()=>AC,MobileNetV2ForSemanticSegmentation:()=>jC,MobileNetV2Model:()=>kC,MobileNetV2PreTrainedModel:()=>OC,MobileNetV3ForImageClassification:()=>PC,MobileNetV3ForSemanticSegmentation:()=>FC,MobileNetV3Model:()=>NC,MobileNetV3PreTrainedModel:()=>MC,MobileNetV4ForImageClassification:()=>RC,MobileNetV4ForSemanticSegmentation:()=>zC,MobileNetV4Model:()=>LC,MobileNetV4PreTrainedModel:()=>IC,MobileViTForImageClassification:()=>HC,MobileViTModel:()=>VC,MobileViTPreTrainedModel:()=>BC,MobileViTV2ForImageClassification:()=>GC,MobileViTV2Model:()=>WC,MobileViTV2PreTrainedModel:()=>UC,ModelOutput:()=>Mh,ModernBertDecoderForCausalLM:()=>$C,ModernBertDecoderModel:()=>QC,ModernBertDecoderPreTrainedModel:()=>ZC,ModernBertForMaskedLM:()=>JC,ModernBertForSequenceClassification:()=>YC,ModernBertForTokenClassification:()=>XC,ModernBertModel:()=>qC,ModernBertPreTrainedModel:()=>KC,Moondream1ForConditionalGeneration:()=>Nb,MoonshineForConditionalGeneration:()=>nw,MoonshineModel:()=>tw,MoonshinePreTrainedModel:()=>ew,MptForCausalLM:()=>dw,MptModel:()=>uw,MptPreTrainedModel:()=>lw,MultiModalityCausalLM:()=>gw,MultiModalityPreTrainedModel:()=>hw,MusicgenForCausalLM:()=>yw,MusicgenForConditionalGeneration:()=>bw,MusicgenModel:()=>vw,MusicgenPreTrainedModel:()=>_w,NanoChatForCausalLM:()=>Cw,NanoChatModel:()=>Sw,NanoChatPreTrainedModel:()=>xw,NemotronHForCausalLM:()=>Ew,NemotronHModel:()=>Tw,NemotronHPreTrainedModel:()=>ww,NeoBertForMaskedLM:()=>kw,NeoBertForQuestionAnswering:()=>Mw,NeoBertForSequenceClassification:()=>Aw,NeoBertForTokenClassification:()=>jw,NeoBertModel:()=>Ow,NeoBertPreTrainedModel:()=>Dw,NomicBertModel:()=>Pw,NomicBertPreTrainedModel:()=>Nw,OPTForCausalLM:()=>tT,OPTModel:()=>eT,OPTPreTrainedModel:()=>$w,Olmo2ForCausalLM:()=>Bw,Olmo2Model:()=>zw,Olmo2PreTrainedModel:()=>Rw,Olmo3ForCausalLM:()=>Uw,Olmo3Model:()=>Hw,Olmo3PreTrainedModel:()=>Vw,OlmoForCausalLM:()=>Lw,OlmoHybridForCausalLM:()=>Kw,OlmoHybridModel:()=>Gw,OlmoHybridPreTrainedModel:()=>Ww,OlmoModel:()=>Iw,OlmoPreTrainedModel:()=>Fw,OpenAIPrivacyFilterForTokenClassification:()=>Yw,OpenAIPrivacyFilterModel:()=>Jw,OpenAIPrivacyFilterPreTrainedModel:()=>qw,OpenELMForCausalLM:()=>Qw,OpenELMModel:()=>Zw,OpenELMPreTrainedModel:()=>Xw,OwlViTForObjectDetection:()=>sT,OwlViTModel:()=>oT,OwlViTPreTrainedModel:()=>aT,Owlv2ForObjectDetection:()=>iT,Owlv2Model:()=>rT,Owlv2PreTrainedModel:()=>nT,PaliGemmaForConditionalGeneration:()=>cT,ParakeetForCTC:()=>uT,ParakeetPreTrainedModel:()=>lT,PatchTSMixerForPrediction:()=>pT,PatchTSMixerModel:()=>fT,PatchTSMixerPreTrainedModel:()=>dT,PatchTSTForPrediction:()=>gT,PatchTSTModel:()=>hT,PatchTSTPreTrainedModel:()=>mT,Phi3ForCausalLM:()=>ST,Phi3Model:()=>xT,Phi3PreTrainedModel:()=>bT,Phi3VForCausalLM:()=>wT,Phi3VPreTrainedModel:()=>CT,PhiForCausalLM:()=>yT,PhiModel:()=>vT,PhiPreTrainedModel:()=>_T,PreTrainedModel:()=>X,PvtForImageClassification:()=>DT,PvtModel:()=>ET,PvtPreTrainedModel:()=>TT,PyAnnoteForAudioFrameClassification:()=>AT,PyAnnoteModel:()=>kT,PyAnnotePreTrainedModel:()=>OT,QuestionAnsweringModelOutput:()=>Ih,Qwen2ForCausalLM:()=>NT,Qwen2Model:()=>MT,Qwen2MoeForCausalLM:()=>IT,Qwen2MoeModel:()=>FT,Qwen2MoePreTrainedModel:()=>PT,Qwen2PreTrainedModel:()=>jT,Qwen2VLForCausalLM:()=>Qb,Qwen2VLForConditionalGeneration:()=>Zb,Qwen2VLPreTrainedModel:()=>Xb,Qwen2_5_VLForCausalLM:()=>ex,Qwen2_5_VLForConditionalGeneration:()=>$b,Qwen3ForCausalLM:()=>zT,Qwen3Model:()=>RT,Qwen3MoeForCausalLM:()=>HT,Qwen3MoeModel:()=>VT,Qwen3MoePreTrainedModel:()=>BT,Qwen3NextForCausalLM:()=>GT,Qwen3NextModel:()=>WT,Qwen3NextPreTrainedModel:()=>UT,Qwen3PreTrainedModel:()=>LT,Qwen3VLForCausalLM:()=>qT,Qwen3VLForConditionalGeneration:()=>KT,Qwen3VLMoeForCausalLM:()=>YT,Qwen3VLMoeForConditionalGeneration:()=>JT,Qwen3_5ForCausalLM:()=>ZT,Qwen3_5ForConditionalGeneration:()=>XT,Qwen3_5MoeForCausalLM:()=>$T,Qwen3_5MoeForConditionalGeneration:()=>QT,RFDetrForObjectDetection:()=>aE,RFDetrModel:()=>iE,RFDetrObjectDetectionOutput:()=>oE,RFDetrPreTrainedModel:()=>rE,RTDetrForObjectDetection:()=>Mv,RTDetrModel:()=>jv,RTDetrObjectDetectionOutput:()=>Nv,RTDetrPreTrainedModel:()=>Av,RTDetrV2ForObjectDetection:()=>xE,RTDetrV2Model:()=>bE,RTDetrV2ObjectDetectionOutput:()=>SE,RTDetrV2PreTrainedModel:()=>yE,ResNetForImageClassification:()=>nE,ResNetModel:()=>tE,ResNetPreTrainedModel:()=>eE,RoFormerForMaskedLM:()=>hE,RoFormerForQuestionAnswering:()=>vE,RoFormerForSequenceClassification:()=>gE,RoFormerForTokenClassification:()=>_E,RoFormerModel:()=>mE,RoFormerPreTrainedModel:()=>pE,RobertaForMaskedLM:()=>lE,RobertaForQuestionAnswering:()=>fE,RobertaForSequenceClassification:()=>uE,RobertaForTokenClassification:()=>dE,RobertaModel:()=>cE,RobertaPreTrainedModel:()=>sE,Sam2ImageSegmentationOutput:()=>EE,Sam2Model:()=>OE,Sam2PreTrainedModel:()=>DE,Sam3TrackerModel:()=>AE,SamImageSegmentationOutput:()=>CE,SamModel:()=>TE,SamPreTrainedModel:()=>wE,SapiensForDepthEstimation:()=>NE,SapiensForNormalEstimation:()=>PE,SapiensForSemanticSegmentation:()=>ME,SapiensPreTrainedModel:()=>jE,SegformerForImageClassification:()=>LE,SegformerForSemanticSegmentation:()=>RE,SegformerModel:()=>IE,SegformerPreTrainedModel:()=>FE,Seq2SeqLMOutput:()=>zh,SequenceClassifierOutput:()=>J,SiglipModel:()=>BE,SiglipPreTrainedModel:()=>zE,SiglipTextModel:()=>VE,SiglipVisionModel:()=>HE,SmolLM3ForCausalLM:()=>GE,SmolLM3Model:()=>WE,SmolLM3PreTrainedModel:()=>UE,SmolVLMForConditionalGeneration:()=>KE,SnacDecoderModel:()=>XE,SnacEncoderModel:()=>YE,SnacModel:()=>JE,SnacPreTrainedModel:()=>qE,SolarOpenForCausalLM:()=>$E,SolarOpenModel:()=>QE,SolarOpenPreTrainedModel:()=>ZE,SpeechT5ForSpeechToText:()=>nD,SpeechT5ForTextToSpeech:()=>rD,SpeechT5HifiGan:()=>iD,SpeechT5Model:()=>tD,SpeechT5PreTrainedModel:()=>eD,SqueezeBertForMaskedLM:()=>sD,SqueezeBertForQuestionAnswering:()=>lD,SqueezeBertForSequenceClassification:()=>cD,SqueezeBertModel:()=>oD,SqueezeBertPreTrainedModel:()=>aD,StableLmForCausalLM:()=>fD,StableLmModel:()=>dD,StableLmPreTrainedModel:()=>uD,Starcoder2ForCausalLM:()=>hD,Starcoder2Model:()=>mD,Starcoder2PreTrainedModel:()=>pD,StyleTextToSpeech2Model:()=>_D,StyleTextToSpeech2PreTrainedModel:()=>gD,SupertonicForConditionalGeneration:()=>yD,SupertonicPreTrainedModel:()=>vD,Swin2SRForImageSuperResolution:()=>ED,Swin2SRModel:()=>TD,Swin2SRPreTrainedModel:()=>wD,SwinForImageClassification:()=>SD,SwinForSemanticSegmentation:()=>CD,SwinModel:()=>xD,SwinPreTrainedModel:()=>bD,T5ForConditionalGeneration:()=>kD,T5Model:()=>OD,T5PreTrainedModel:()=>DD,TableTransformerForObjectDetection:()=>MD,TableTransformerModel:()=>jD,TableTransformerObjectDetectionOutput:()=>ND,TableTransformerPreTrainedModel:()=>AD,TokenClassifierOutput:()=>Ph,TrOCRForCausalLM:()=>FD,TrOCRPreTrainedModel:()=>PD,UltravoxModel:()=>Ax,UltravoxPreTrainedModel:()=>kx,UniSpeechForCTC:()=>RD,UniSpeechForSequenceClassification:()=>zD,UniSpeechModel:()=>LD,UniSpeechPreTrainedModel:()=>ID,UniSpeechSatForAudioFrameClassification:()=>WD,UniSpeechSatForCTC:()=>HD,UniSpeechSatForSequenceClassification:()=>UD,UniSpeechSatModel:()=>VD,UniSpeechSatPreTrainedModel:()=>BD,VaultGemmaForCausalLM:()=>qD,VaultGemmaModel:()=>KD,VaultGemmaPreTrainedModel:()=>GD,ViTForImageClassification:()=>ZD,ViTMAEModel:()=>$D,ViTMAEPreTrainedModel:()=>QD,ViTMSNForImageClassification:()=>nO,ViTMSNModel:()=>tO,ViTMSNPreTrainedModel:()=>eO,ViTModel:()=>XD,ViTPreTrainedModel:()=>YD,VisionEncoderDecoderModel:()=>JD,VitMatteForImageMatting:()=>iO,VitMattePreTrainedModel:()=>rO,VitPoseForPoseEstimation:()=>oO,VitPosePreTrainedModel:()=>aO,VitsModel:()=>lO,VitsModelOutput:()=>sO,VitsPreTrainedModel:()=>cO,VoxtralForConditionalGeneration:()=>uO,VoxtralRealtimeForConditionalGeneration:()=>bO,VoxtralRealtimePreTrainedModel:()=>yO,Wav2Vec2BertForCTC:()=>CO,Wav2Vec2BertForSequenceClassification:()=>wO,Wav2Vec2BertModel:()=>SO,Wav2Vec2BertPreTrainedModel:()=>xO,Wav2Vec2ForAudioFrameClassification:()=>Yx,Wav2Vec2ForCTC:()=>qx,Wav2Vec2ForSequenceClassification:()=>Jx,Wav2Vec2Model:()=>Kx,Wav2Vec2PreTrainedModel:()=>Gx,WavLMForAudioFrameClassification:()=>jO,WavLMForCTC:()=>OO,WavLMForSequenceClassification:()=>kO,WavLMForXVector:()=>AO,WavLMModel:()=>DO,WavLMPreTrainedModel:()=>EO,WeSpeakerResNetModel:()=>NO,WeSpeakerResNetPreTrainedModel:()=>MO,WhisperForConditionalGeneration:()=>LO,WhisperModel:()=>IO,WhisperPreTrainedModel:()=>FO,XLMForQuestionAnswering:()=>WO,XLMForSequenceClassification:()=>HO,XLMForTokenClassification:()=>UO,XLMModel:()=>BO,XLMPreTrainedModel:()=>zO,XLMRobertaForMaskedLM:()=>qO,XLMRobertaForQuestionAnswering:()=>XO,XLMRobertaForSequenceClassification:()=>JO,XLMRobertaForTokenClassification:()=>YO,XLMRobertaModel:()=>KO,XLMRobertaPreTrainedModel:()=>GO,XLMWithLMHeadModel:()=>VO,XVectorOutput:()=>TO,YolosForObjectDetection:()=>$O,YolosModel:()=>QO,YolosObjectDetectionOutput:()=>ek,YolosPreTrainedModel:()=>ZO,YoutuForCausalLM:()=>rk,YoutuModel:()=>nk,YoutuPreTrainedModel:()=>tk,ZayaForCausalLM:()=>ok,ZayaModel:()=>ak,ZayaPreTrainedModel:()=>ik});var Jg=class extends X{},Yg=class extends Jg{},Xg=class extends Jg{async _call(e){return new J(await super._call(e))}},Zg=class extends Jg{async _call(e){return new Ih(await super._call(e))}},Qg=class extends Jg{async _call(e){return new Fh(await super._call(e))}},$g=class extends X{},e_=class extends $g{},t_=class extends $g{},n_=class extends X{},r_=class extends n_{},i_=class extends n_{},a_=class extends X{},o_=class extends a_{},s_=class extends a_{},c_=class extends X{},l_=class extends c_{},u_=class extends c_{},d_=class extends X{},f_=class extends d_{},p_=class extends d_{},m_=class extends d_{async _call(e){return new J(await super._call(e))}},h_=class extends X{},g_=class extends h_{},__=class extends h_{async _call(e){return new J(await super._call(e))}},v_=class extends X{},y_=class extends v_{},b_=class extends v_{async _call(e){return new Fh(await super._call(e))}},x_=class extends v_{async _call(e){return new J(await super._call(e))}},S_=class extends v_{async _call(e){return new Ph(await super._call(e))}},C_=class extends v_{async _call(e){return new Ih(await super._call(e))}},w_=class extends X{},T_=class extends w_{},E_=class extends w_{},D_=class extends X{},O_=class extends D_{},k_=class extends D_{},A_=class extends X{},j_=class extends A_{},M_=class extends A_{},N_=class extends X{},P_=class extends N_{},F_=class extends N_{async _call(e){return new Fh(await super._call(e))}},I_=class extends N_{async _call(e){return new J(await super._call(e))}},L_=class extends N_{async _call(e){return new Ph(await super._call(e))}},R_=class extends N_{async _call(e){return new Ih(await super._call(e))}},z_=4299n,B_=6561n,V_=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`audio_values`,`exaggeration`,`audio_features`,`audio_tokens`,`speaker_embeddings`,`speaker_features`,`past_key_values`];main_input_name=`input_ids`;_return_dict_in_generate_keys=[`audio_tokens`,`speaker_embeddings`,`speaker_features`]},H_=class extends V_{async encode_speech(e){return q(this.sessions.speech_encoder,{audio_values:e})}async forward({input_ids:e=null,attention_mask:t=null,audio_values:n=null,exaggeration:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,audio_features:u=null,audio_tokens:d=null,speaker_embeddings:f=null,speaker_features:p=null,...m}){let h;if(!a){let s=this.sessions.embed_tokens.inputNames,c={input_ids:e};if(s.includes(`exaggeration`)){if(!(r instanceof V)){let t=e.dims[0];if(r==null)r=_u([t],.5);else if(typeof r==`number`)r=_u([t],r);else if(Array.isArray(r))r=new V(`float32`,r,[t]);else throw Error("Unsupported type for `exaggeration` input")}c.exaggeration=r}if(s.includes(`position_ids`)&&(c.position_ids=i),{inputs_embeds:a}=await q(this.sessions.embed_tokens,c),u&&d&&f&&p&&(h={audio_features:u,audio_tokens:d,speaker_embeddings:f,speaker_features:p}),h||n)h??=await this.encode_speech(n),a=H([h.audio_features,a],1),t=yu([a.dims[0],a.dims[1]]);else{let e=a.dims[1];if(!o||e!==1)throw Error(`Incorrect state encountered during generation.`);let n=o.get_seq_length();t=yu([a.dims[0],n+e])}}return{...await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1),...h}}prepare_inputs_for_generation(e,t,n){return!t.position_ids&&this.sessions.embed_tokens.inputNames.includes(`position_ids`)&&(t.position_ids=t.input_ids.dims[1]===1?new V(`int64`,Array.from({length:e.length},(t,n)=>e[n].length-e[n].findLastIndex(e=>e==B_)-1),[e.length,1]):new V(`int64`,t.input_ids.tolist().map(e=>{let t=0;return e.map(e=>e>=B_?0:t++)}).flat(),t.input_ids.dims)),t.input_ids.dims[1]===1&&(delete t.audio_values,delete t.audio_features,delete t.audio_tokens,delete t.speaker_embeddings,delete t.speaker_features),Bg(this,e,t,n)}async generate(e){let t=e.past_key_values,{sequences:n,audio_tokens:r,speaker_embeddings:i,speaker_features:a,past_key_values:o}=await super.generate({...e,return_dict_in_generate:!0});try{let t=n.slice(null,[e.input_ids.dims[1],-1]),o=H([r,t,_u([t.dims[0],3],z_)],1),{waveform:s}=await q(this.sessions.conditional_decoder,{speech_tokens:o,speaker_features:a,speaker_embeddings:i});return s}finally{o!==t&&await o?.dispose()}}},U_=class extends X{},W_=class extends U_{},G_=class extends X{},K_=class extends G_{},q_=class extends X{},J_=class extends q_{},Y_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},X_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`audio_model`})}},Z_=class extends X{},Q_=class extends Z_{},$_=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},ev=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},tv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},nv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},rv=class extends X{},iv=class extends rv{},av=class extends rv{},ov=class extends X{},sv=class extends ov{},cv=class extends ov{},lv=class extends X{},uv=class extends lv{},dv=class extends lv{},fv=class extends X{},pv=class extends fv{},mv=class extends fv{},hv=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},gv=class extends hv{},_v=class extends hv{},vv=class extends X{},yv=class extends vv{},bv=class extends vv{async _call(e){return new Fh(await super._call(e))}},xv=class extends vv{async _call(e){return new J(await super._call(e))}},Sv=class extends vv{async _call(e){return new Ph(await super._call(e))}},Cv=class extends vv{async _call(e){return new Ih(await super._call(e))}},wv=class extends X{},Tv=class extends wv{},Ev=class extends wv{async _call(e){return new J(await super._call(e))}},Dv=class extends X{},Ov=class extends Dv{},kv=class extends Dv{async _call(e){return new J(await super._call(e))}},Av=class extends X{},jv=class extends Av{},Mv=class extends Av{async _call(e){return new Nv(await super._call(e))}},Nv=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},Pv=class extends X{},Fv=class extends Pv{},Iv=class extends Pv{async _call(e){return new Nv(await super._call(e))}},Lv=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},Rv=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},zv=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},Bv=class extends zv{async encode(e){return new Lv(await q(this.sessions.encoder_model,e))}async decode(e){return new Rv(await q(this.sessions.decoder_model,e))}},Vv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},Hv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},Uv=class extends X{},Wv=class extends Uv{},Gv=class extends Uv{async _call(e){return new Fh(await super._call(e))}},Kv=class extends Uv{async _call(e){return new J(await super._call(e))}},qv=class extends Uv{async _call(e){return new Ph(await super._call(e))}},Jv=class extends Uv{async _call(e){return new Ih(await super._call(e))}},Yv=class extends X{},Xv=class extends Yv{},Zv=class extends Yv{},Qv=class extends X{},$v=class extends Qv{},ey=class extends Qv{},ty=class extends X{},ny=class extends ty{},ry=class extends ty{async _call(e){return new Fh(await super._call(e))}},iy=class extends ty{async _call(e){return new J(await super._call(e))}},ay=class extends ty{async _call(e){return new Ph(await super._call(e))}},oy=class extends ty{async _call(e){return new Ih(await super._call(e))}},sy=class extends X{},cy=class extends sy{},ly=class extends X{},uy=class extends ly{},dy=class extends ly{async _call(e){return new J(await super._call(e))}},fy=class extends X{},py=class extends fy{},my=class extends X{},hy=class extends my{},gy=class extends X{},_y=class extends gy{},vy=class extends gy{async _call(e){return new by(await super._call(e))}},yy=class extends gy{async _call(e){return new xy(await super._call(e))}},by=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},xy=class extends Mh{constructor({logits:e,pred_boxes:t,pred_masks:n}){super(),this.logits=e,this.pred_boxes=t,this.pred_masks=n}},Sy=class extends X{},Cy=class extends Sy{},wy=class extends Sy{async _call(e){return new J(await super._call(e))}},Ty=class extends X{},Ey=class extends Ty{},Dy=class extends Ty{async _call(e){return new J(await super._call(e))}},Oy=class extends X{},ky=class extends Oy{},Ay=class extends X{},jy=class extends Ay{},My=class extends X{},Ny=class extends My{},Py=class extends My{async _call(e){return new J(await super._call(e))}},Fy=class extends My{async _call(e){return new Ph(await super._call(e))}},Iy=class extends My{async _call(e){return new Ih(await super._call(e))}},Ly=class extends My{async _call(e){return new Fh(await super._call(e))}},Ry=class extends X{},zy=class extends Ry{},By=class extends X{},Vy=class extends By{},Hy=class extends By{},Uy=class extends X{},Wy=class extends Uy{},Gy=class extends Uy{async _call(e){return new J(await super._call(e))}},Ky=class extends X{},qy=class extends Ky{},Jy=class extends Ky{async _call(e){return new Fh(await super._call(e))}},Yy=class extends Ky{async _call(e){return new J(await super._call(e))}},Xy=class extends Ky{async _call(e){return new Ph(await super._call(e))}},Zy=class extends Ky{async _call(e){return new Ih(await super._call(e))}},Qy=class extends X{},$y=class extends Qy{},eb=class extends Qy{},tb=class extends X{},nb=class extends tb{},rb=class extends tb{async _call(e){return new Fh(await super._call(e))}},ib=class extends tb{async _call(e){return new J(await super._call(e))}},ab=class extends tb{async _call(e){return new Ph(await super._call(e))}},ob=class extends X{},sb=class extends ob{},cb=class extends ob{async _call(e){return new Fh(await super._call(e))}},lb=class extends ob{async _call(e){return new J(await super._call(e))}},ub=class extends ob{async _call(e){return new Ph(await super._call(e))}},db=class extends X{},fb=class extends db{},pb=class extends db{},mb=class extends X{},hb=class extends mb{},gb=class extends mb{},_b=class extends X{},vb=class extends _b{},yb=class extends _b{},bb=class extends X{},xb=class extends bb{},Sb=class extends bb{async _call(e){return new J(await super._call(e))}},Cb=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`pixel_values`,`encoder_outputs`,`decoder_input_ids`,`decoder_inputs_embeds`,`decoder_attention_mask`,`past_key_values`];main_input_name=`inputs_embeds`},wb=class extends Cb{_merge_input_ids_with_image_features({inputs_embeds:e,image_features:t,input_ids:n,attention_mask:r}){return{inputs_embeds:H([t,e],1),attention_mask:H([yu(t.dims.slice(0,2)),r],1)}}async _prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:n,attention_mask:r}){if(!e&&!t)throw Error("Either `input_ids` or `pixel_values` should be provided.");let i,a;return e&&(i=await this.encode_text({input_ids:e})),t&&(a=await this.encode_image({pixel_values:t})),i&&a?{inputs_embeds:n,attention_mask:r}=this._merge_input_ids_with_image_features({inputs_embeds:i,image_features:a,input_ids:e,attention_mask:r}):n=i||a,{inputs_embeds:n,attention_mask:r}}async forward({input_ids:e,pixel_values:t,attention_mask:n,decoder_input_ids:r,decoder_attention_mask:i,encoder_outputs:a,past_key_values:o,inputs_embeds:s,decoder_inputs_embeds:c,num_logits_to_keep:l=null}){if(s||({inputs_embeds:s,attention_mask:n}=await this._prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:s,attention_mask:n})),!a){let{last_hidden_state:e}=await Dg(this,{inputs_embeds:s,attention_mask:n});a=e}if(!c){if(!r)throw Error("Either `decoder_input_ids` or `decoder_inputs_embeds` should be provided.");c=await this.encode_text({input_ids:r})}let u={inputs_embeds:c,attention_mask:i,encoder_attention_mask:n,encoder_hidden_states:a,past_key_values:o,num_logits_to_keep:l};return await Pg(this,u,!0)}},Tb=class extends X{},Eb=class extends Tb{},Db=class extends Tb{},Ob=class extends X{},kb=class extends Ob{},Ab=class extends Ob{},jb=class extends X{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`position_ids`,`past_key_values`]},Mb=class extends jb{_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_index??this.config.image_token_id,...e,image_features:n})}},Nb=class extends Mb{},Pb=class extends Mb{},Fb=class extends X{},Ib=class extends Fb{},Lb=class extends Mb{},Rb=class extends Lb{},zb=class extends X{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`input_features`,`input_features_mask`,`past_key_values`]},Bb=class extends zb{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,input_features:r=null,input_features_mask:i=null,position_ids:a=null,inputs_embeds:o=null,per_layer_inputs:s=null,past_key_values:c=null,generation_config:l=null,logits_processor:u=null,num_logits_to_keep:d=null,...f}){if((!o||!s)&&({inputs_embeds:o,per_layer_inputs:s}=await q(this.sessions.embed_tokens,{input_ids:e}),e.dims[1]!==1)){if(n){let{image_features:r}=await this._encode_vision({pixel_values:n,...f});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_image_features({image_features:r,inputs_embeds:o,input_ids:e,attention_mask:t}))}if(r){let{audio_features:n}=await q(this.sessions.audio_encoder,{input_features:r,input_features_mask:i});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_audio_features({audio_features:n,inputs_embeds:o,input_ids:e,attention_mask:t}))}}return await Pg(this,{inputs_embeds:o,per_layer_inputs:s,past_key_values:c,attention_mask:t,position_ids:a,generation_config:l,logits_processor:u,num_logits_to_keep:d},!0)}_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values})}_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_id,...e,image_features:n})}_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.audio_token_id,...e,audio_features:n})}},Vb=class extends Bb{},Hb=class extends Bb{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`image_position_ids`,`input_features`,`input_features_mask`,`past_key_values`];_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values,pixel_position_ids:e.image_position_ids})}},Ub=class extends Hb{},Wb=class extends X{},Gb=class extends Wb{},Kb=class extends Wb{},qb=class extends X{},Jb=class extends qb{},Yb=class extends qb{},Xb=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`,`pixel_values`,`image_grid_thw`]},Zb=class extends Xb{image_grid_thw_name=`grid_thw`;_get_text_only_rope_index(e,t){if(t){let{data:e,dims:n}=Rg(t),r=BigInt64Array.from({length:3*e.length},(t,n)=>e[n%e.length]),i=Array.from({length:n[0]},(t,r)=>ll(e.subarray(n[1]*r,n[1]*(r+1)))[0]+1n+BigInt(n[1]));return[new V(`int64`,r,[3,...n]),new V(`int64`,i,[i.length,1])]}{let[t,n]=e.dims;return[new V(`int64`,BigInt64Array.from({length:3*t*n},(e,r)=>BigInt(Math.floor(r%n/t))),[3,...e.dims]),xu([t,1])]}}_reorder_and_write_positions(e,t,n,r){let i=e.reduce((e,t)=>e+t.length,0),a=Array(i),o=0;for(let t=0;t<3;++t)for(let n of e){let e=n.length/3;for(let r=t*e;r<(t+1)*e;++r)a[o++]=n[r]}let s=0;for(let e=0;e(t==s&&e.push(n),e),[]).map(e=>c[e+1]),u=l.filter(e=>e==a).length,d=l.filter(e=>e==o).length,f=[],p=0,m=u,h=d;for(let e=0;et>p&&e==a),s=c.findIndex((e,t)=>t>p&&e==o),l=m>0&&e!==-1?e:c.length+1,u=h>0&&s!==-1?s:c.length+1,d,g,_,v;l0?ll(f.at(-1))[0]+1:0;f.push(Array.from({length:3*S},(e,t)=>C+t%S));let ee=S+C,w=y*b*x,te=Array.from({length:w},(e,t)=>ee+Math.floor(t/(b*x))),ne=Array.from({length:w},(e,t)=>ee+Math.floor(t/x)%b),re=Array.from({length:w},(e,t)=>ee+t%x);f.push([te,ne,re].flat()),p=d+w}if(p0?ll(f.at(-1))[0]+1:0,t=c.length-p;f.push(Array.from({length:3*t},(n,r)=>e+r%t))}return f}get_rope_index(e,t,n,r){let{vision_config:i}=this.config,a=i.spatial_merge_size??2;if(t||n){let i=e.tolist();r||=bu(e);let o=r.tolist(),s=Array.from({length:3},()=>Array.from({length:e.dims[0]},()=>Array.from({length:e.dims[1]},()=>0))),c=t?t.tolist():[],l=n?n.tolist():[],u={image_index:0,video_index:0},d=[];for(let e=0;eo[e][n]==1),n=this._get_multimodal_rope_positions({filtered_ids:t,image_grid_thw_list:c,video_grid_thw_list:l,spatial_merge_size:a,state:u}),r=this._reorder_and_write_positions(n,o[e],s,e);d.push(ll(r)[0]+1-i[e].length)}return[new V(`int64`,s.flat(1/0),[3,e.dims[0],e.dims[1]]),new V(`int64`,d,[d.length,1])]}return this._get_text_only_rope_index(e,r)}async encode_image({pixel_values:e,image_grid_thw:t}){return(await q(this.sessions.vision_encoder,{pixel_values:e,[this.image_grid_thw_name]:t})).image_features}_merge_input_ids_with_image_features(e){return Wg({image_token_id:this.config.image_token_id,...e})}prepare_inputs_for_generation(e,t,n){if(Ng(this,t,1n),!t.attention_mask||t.position_ids||!(this.sessions.decoder_model_merged??this.sessions.model).inputNames.includes(`position_ids`))return t;if(!t.past_key_values)[t.position_ids,t.rope_deltas]=this.get_rope_index(t.input_ids,t.image_grid_thw,t.video_grid_thw,t.attention_mask);else{t.pixel_values=null;let e=t.past_key_values.get_seq_length();if(en+e);t.position_ids=du([r,r,r],0)}}return t}},Qb=class extends Zb{},$b=class extends Zb{image_grid_thw_name=`image_grid_thw`},ex=class extends Qb{image_grid_thw_name=`image_grid_thw`},tx=class extends $b{get_vision_position_ids(e,t,n,r){let i=Math.floor(t[0]/n),a=Math.floor(t[1]/r),o=Math.floor(t[2]/r),s=a*o*i,c=Array.from({length:s},()=>e),l=Array.from({length:s},(t,n)=>e+Math.floor(n/(o*i))),u=Array.from({length:s},(t,n)=>e+n%o);return[...c,...l,...u]}_get_multimodal_rope_positions({filtered_ids:e,image_grid_thw_list:t,video_grid_thw_list:n,spatial_merge_size:r,state:i}){let{image_token_id:a}=this.config,o=[],s=0,c=+(e[0]==a);for(let t=1;t<=e.length;++t){let n=tl+n%e)),l+=e}else{let e=t[i.image_index++].map(Number),n=e[0];u.push(this.get_vision_position_ids(l,e,n,r)),l+=Math.max(e[1],e[2])/r}return u}},nx=class extends X{},rx=class extends nx{},ix=class extends nx{},ax=class extends X{},ox=class extends ax{},sx=class extends ax{},cx=class extends X{},lx=class extends cx{},ux=class extends cx{},dx=class extends X{},fx=class extends dx{},px=class extends dx{},mx=class extends X{},hx=class extends mx{},gx=class extends mx{},_x=class extends X{},vx=class extends _x{},yx=class extends _x{},bx=class extends X{},xx=class extends bx{},Sx=class extends bx{},Cx=class extends X{},wx=class extends Cx{},Tx=class extends Cx{},Ex=class extends X{},Dx=class extends Ex{},Ox=class extends Ex{},kx=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`audio_values`,`past_key_values`]},Ax=class extends kx{_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.ignore_index??this.config.audio_token_id??this.config.audio_token_index,...e,audio_features:n})}},jx=class extends Ax{forward_params=[`input_ids`,`attention_mask`,`input_features`,`past_key_values`]},Mx=class extends X{},Nx=class extends Mx{},Px=class extends X{},Fx=class extends Px{},Ix=class extends X{},Lx=class extends Ix{},Rx=class extends Ix{},zx=class extends X{},Bx=class extends zx{},Vx=class extends zx{async _call(e){return new J(await super._call(e))}},Hx=class extends X{},Ux=class extends Hx{},Wx=class extends Hx{forward_params=[`input_ids`,`attention_mask`,`token_type_ids`,`past_key_values`];prepare_inputs_for_generation(e,t,n){let r=Bg(this,e,t,n);return r.token_type_ids=(r.past_key_values?Su:bu)(r.input_ids),r}},Gx=class extends X{},Kx=class extends Gx{},qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},Jx=class extends Gx{async _call(e){return new J(await super._call(e))}},Yx=class extends Gx{async _call(e){return new Ph(await super._call(e))}},Xx=class extends X{},Zx=class extends Gx{},Qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},$x=class extends Gx{async _call(e){return new J(await super._call(e))}},eS=class extends X{},tS=class extends eS{},nS=class extends eS{},rS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`position_ids`,`past_key_values`]},iS=class extends X{},aS=class extends iS{},oS=class extends iS{async _call(e){return new J(await super._call(e))}},sS=class extends X{},cS=class extends sS{},lS=class extends sS{},uS=class extends X{},dS=class extends uS{async forward(e){let t=!e.input_ids,n=!e.pixel_values;if(t&&n)throw Error("Either `input_ids` or `pixel_values` should be provided.");if(t&&(e.input_ids=yu([e.pixel_values.dims[0],1])),n){let{image_size:t}=this.config.vision_config;e.pixel_values=_u([0,3,t,t],0)}let{text_embeddings:r,image_embeddings:i,l2norm_text_embeddings:a,l2norm_image_embeddings:o}=await super.forward(e),s={};return t||(s.text_embeddings=r,s.l2norm_text_embeddings=a),n||(s.image_embeddings=i,s.l2norm_image_embeddings=o),s}},fS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},pS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},mS=class extends X{},hS=class extends mS{},gS=class extends mS{},_S=class extends Mb{},vS=class extends X{},yS=class extends vS{},bS=class extends vS{},xS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`spatial_shapes`,`position_ids`,`past_key_values`]},SS=class extends X{},CS=class extends SS{},wS=class extends SS{},TS=class extends X{},ES=class extends TS{},DS=class extends X{},OS=class extends DS{},kS=class extends DS{},AS=class extends X{},jS=class extends AS{},MS=class extends AS{},NS=class extends X{},PS=class extends NS{},FS=class extends NS{},IS=class extends X{},LS=class extends IS{},RS=class extends IS{},zS=class extends X{},BS=class extends zS{},VS=class extends zS{},HS=class extends zS{async _call(e){return new J(await super._call(e))}},US=class extends zS{},WS=class extends X{},GS=class extends WS{},KS=class extends X{},qS=class extends KS{},JS=class extends Mh{constructor({char_logits:e,bpe_logits:t,wp_logits:n}){super(),this.char_logits=e,this.bpe_logits=t,this.wp_logits=n}get logits(){return[this.char_logits,this.bpe_logits,this.wp_logits]}},YS=class extends X{},XS=class extends YS{async _call(e){return new JS(await super._call(e))}},ZS=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},QS=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},$S=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},eC=class extends $S{async encode(e){return new ZS(await q(this.sessions.encoder_model,e))}async decode(e){return new QS(await q(this.sessions.decoder_model,e))}},tC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},nC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},rC=class extends X{},iC=class extends rC{},aC=class extends rC{},oC=class extends X{},sC=class extends oC{},cC=class extends oC{},lC=class extends X{},uC=class extends lC{},dC=class extends lC{},fC=class extends Mb{},pC=class extends X{},mC=class extends pC{},hC=class extends pC{},gC=class extends X{},_C=class extends gC{},vC=class extends gC{async _call(e){return new Fh(await super._call(e))}},yC=class extends gC{async _call(e){return new J(await super._call(e))}},bC=class extends gC{async _call(e){return new Ih(await super._call(e))}},xC=class extends X{},SC=class extends xC{},CC=class extends xC{},wC=class extends X{},TC=class extends wC{},EC=class extends wC{async _call(e){return new J(await super._call(e))}},DC=class extends wC{},OC=class extends X{},kC=class extends OC{},AC=class extends OC{async _call(e){return new J(await super._call(e))}},jC=class extends OC{},MC=class extends X{},NC=class extends MC{},PC=class extends MC{async _call(e){return new J(await super._call(e))}},FC=class extends MC{},IC=class extends X{},LC=class extends IC{},RC=class extends IC{async _call(e){return new J(await super._call(e))}},zC=class extends IC{},BC=class extends X{},VC=class extends BC{},HC=class extends BC{async _call(e){return new J(await super._call(e))}},UC=class extends X{},WC=class extends UC{},GC=class extends UC{async _call(e){return new J(await super._call(e))}},KC=class extends X{},qC=class extends KC{},JC=class extends KC{async _call(e){return new Fh(await super._call(e))}},YC=class extends KC{async _call(e){return new J(await super._call(e))}},XC=class extends KC{async _call(e){return new Ph(await super._call(e))}},ZC=class extends X{},QC=class extends ZC{},$C=class extends ZC{},ew=class extends X{requires_attention_mask=!1;main_input_name=`input_values`;forward_params=[`input_values`,`decoder_input_ids`,`past_key_values`]},tw=class extends ew{},nw=class extends ew{},rw=class extends X{},iw=class extends rw{},aw=class extends rw{async _call(e){return new Fh(await super._call(e))}},ow=class extends rw{async _call(e){return new J(await super._call(e))}},sw=class extends rw{async _call(e){return new Ph(await super._call(e))}},cw=class extends rw{async _call(e){return new Ih(await super._call(e))}},lw=class extends X{},uw=class extends lw{},dw=class extends lw{},fw=class extends X{},pw=class extends fw{},mw=class extends fw{},hw=class extends X{},gw=class extends hw{forward_params=[`input_ids`,`pixel_values`,`images_seq_mask`,`images_emb_mask`,`attention_mask`,`position_ids`,`past_key_values`];constructor(...e){super(...e),this._generation_mode=`text`}async forward(e){let t=this._generation_mode??`text`,n;if(t===`text`||!e.past_key_values){let t=this.sessions.prepare_inputs_embeds;n=await q(t,ci(e,t.inputNames))}else{let t=this.sessions.gen_img_embeds;n=await q(t,ci({image_ids:e.input_ids},t.inputNames))}let r={...e,...n},i=await Pg(this,r),a=this.sessions[t===`text`?`lm_head`:`gen_head`];if(!a)throw Error(`Unable to find "${a}" generation head`);let o=await q(a,ci(i,a.inputNames));return{...n,...i,...o}}prepare_inputs_for_generation(e,t,n){let r=!!t.past_key_values;return Ng(this,t,1n),n.guidance_scale!==null&&n.guidance_scale>1&&(r?t.input_ids=H([t.input_ids,t.input_ids],0):(t.input_ids=H([t.input_ids,vu(t.input_ids,BigInt(n.pad_token_id))],0),t.attention_mask=H([t.attention_mask,vu(t.attention_mask,0n)],0))),(r||!t.pixel_values)&&(t.pixel_values=_u([0,0,3,384,384],1)),r&&(t.images_seq_mask=new V(`bool`,[,].fill(!0).fill(!1,0,1),[1,1]),t.images_emb_mask=new V(`bool`,[].fill(!1),[1,1,0])),t}async generate(e){return this._generation_mode=`text`,super.generate(e)}async generate_images(e){this._generation_mode=`image`;let t=(e.inputs??e[this.main_input_name]).dims[1],n=(await super.generate(e)).slice(null,[t,null]),r=this.sessions.image_decode,{decoded_image:i}=await q(r,{generated_tokens:n}),a=i.add_(1).mul_(255/2).clamp_(0,255).to(`uint8`),o=[];for(let e of a){let t=Vf.fromTensor(e);o.push(t)}return o}},_w=class extends X{},vw=class extends _w{},yw=class extends _w{},bw=class extends X{forward_params=[`input_ids`,`attention_mask`,`encoder_outputs`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`];_apply_and_filter_by_delay_pattern_mask(e){let[t,n]=e.dims,r=this.config.decoder.num_codebooks,i=n-r,a=0;for(let t=0;t0&&o<=i&&(e.data[a++]=e.data[t])}let o=Math.floor(t/r),s=a/(o*r);return new V(e.type,e.data.slice(0,a),[o,r,s])}prepare_inputs_for_generation(e,t,n){let r=BigInt(this.config.decoder.pad_token_id),i=structuredClone(e);for(let e=0;e=t&&(i[e][t]=r);return n.guidance_scale!==null&&n.guidance_scale>1&&(i=i.concat(i)),Vg(this,i,t,n)}async generate(e){let t=await super.generate(e),n=this._apply_and_filter_by_delay_pattern_mask(t).unsqueeze_(0),{audio_values:r}=await q(this.sessions.encodec_decode,{audio_codes:n});return r}},xw=class extends X{},Sw=class extends xw{},Cw=class extends xw{},ww=class extends X{},Tw=class extends ww{},Ew=class extends ww{},Dw=class extends X{},Ow=class extends Dw{},kw=class extends Dw{async _call(e){return new Fh(await super._call(e))}},Aw=class extends Dw{async _call(e){return new J(await super._call(e))}},jw=class extends Dw{async _call(e){return new Ph(await super._call(e))}},Mw=class extends Dw{async _call(e){return new Ih(await super._call(e))}},Nw=class extends X{},Pw=class extends Nw{},Fw=class extends X{},Iw=class extends Fw{},Lw=class extends Fw{},Rw=class extends X{},zw=class extends Rw{},Bw=class extends Rw{},Vw=class extends X{},Hw=class extends Vw{},Uw=class extends Vw{},Ww=class extends X{},Gw=class extends Ww{},Kw=class extends Ww{},qw=class extends X{},Jw=class extends qw{},Yw=class extends qw{async _call(e){return new J(await super._call(e))}},Xw=class extends X{},Zw=class extends Xw{},Qw=class extends Xw{},$w=class extends X{},eT=class extends $w{},tT=class extends $w{},nT=class extends X{},rT=class extends nT{},iT=class extends nT{},aT=class extends X{},oT=class extends aT{},sT=class extends aT{},cT=class extends Mb{},lT=class extends X{},uT=class extends lT{async _call(e){return new Lh(await super._call(e))}},dT=class extends X{},fT=class extends dT{},pT=class extends dT{},mT=class extends X{},hT=class extends mT{},gT=class extends mT{},_T=class extends X{},vT=class extends _T{},yT=class extends _T{},bT=class extends X{},xT=class extends bT{},ST=class extends bT{},CT=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`pixel_values`,`image_sizes`,`past_key_values`]},wT=class extends CT{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,image_sizes:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,...u}){if(!a){let t;if(n&&e.dims[1]!==1){if(!r)throw Error("`image_sizes` must be provided when `pixel_values` is provided.");({image_features:t}=await q(this.sessions.vision_encoder,{pixel_values:n,image_sizes:r}))}else{let e=this.config.normalized_config.hidden_size;t=new V(`float32`,[],[0,e])}({inputs_embeds:a}=await q(this.sessions.prepare_inputs_embeds,{input_ids:e,image_features:t}))}return await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,position_ids:i,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1)}},TT=class extends X{},ET=class extends TT{},DT=class extends TT{async _call(e){return new J(await super._call(e))}},OT=class extends X{},kT=class extends OT{},AT=class extends OT{async _call(e){return new Ph(await super._call(e))}},jT=class extends X{},MT=class extends jT{},NT=class extends jT{},PT=class extends X{},FT=class extends PT{},IT=class extends PT{},LT=class extends X{},RT=class extends LT{},zT=class extends LT{},BT=class extends X{},VT=class extends BT{},HT=class extends BT{},UT=class extends X{},WT=class extends UT{},GT=class extends UT{},KT=class extends $b{},qT=class extends ex{},JT=class extends KT{},YT=class extends qT{},XT=class extends KT{},ZT=class extends XT{},QT=class extends XT{},$T=class extends ZT{},eE=class extends X{},tE=class extends eE{},nE=class extends eE{async _call(e){return new J(await super._call(e))}},rE=class extends X{},iE=class extends rE{},aE=class extends rE{async _call(e){return new oE(await super._call(e))}},oE=class extends Nv{},sE=class extends X{},cE=class extends sE{},lE=class extends sE{async _call(e){return new Fh(await super._call(e))}},uE=class extends sE{async _call(e){return new J(await super._call(e))}},dE=class extends sE{async _call(e){return new Ph(await super._call(e))}},fE=class extends sE{async _call(e){return new Ih(await super._call(e))}},pE=class extends X{},mE=class extends pE{},hE=class extends pE{async _call(e){return new Fh(await super._call(e))}},gE=class extends pE{async _call(e){return new J(await super._call(e))}},_E=class extends pE{async _call(e){return new Ph(await super._call(e))}},vE=class extends pE{async _call(e){return new Ih(await super._call(e))}},yE=class extends X{},bE=class extends yE{},xE=class extends yE{async _call(e){return new SE(await super._call(e))}},SE=class extends Nv{},CE=class extends Mh{constructor({iou_scores:e,pred_masks:t}){super(),this.iou_scores=e,this.pred_masks=t}},wE=class extends X{},TE=class extends wE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){e=!e.image_embeddings||!e.image_positional_embeddings?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_labels??=yu(e.input_points.dims.slice(0,-1));let t={image_embeddings:e.image_embeddings,image_positional_embeddings:e.image_positional_embeddings};return e.input_points&&(t.input_points=e.input_points),e.input_labels&&(t.input_labels=e.input_labels),e.input_boxes&&(t.input_boxes=e.input_boxes),await q(this.sessions.prompt_encoder_mask_decoder,t)}async _call(e){return new CE(await super._call(e))}},EE=class extends Mh{constructor({iou_scores:e,pred_masks:t,object_score_logits:n}){super(),this.iou_scores=e,this.pred_masks=t,this.object_score_logits=n}},DE=class extends X{},OE=class extends DE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){let{num_feature_levels:t}=this.config.vision_config;if(e=Array.from({length:t},(e,t)=>`image_embeddings.${t}`).some(t=>!e[t])?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_points){if(e.input_boxes&&e.input_boxes.dims[1]!==1)throw Error("When both `input_points` and `input_boxes` are provided, the number of boxes per image must be 1.");let t=e.input_points.dims;e.input_labels??=yu(t.slice(0,-1)),e.input_boxes??=_u([t[0],0,4],0)}else if(e.input_boxes){let t=e.input_boxes.dims;e.input_labels=_u([t[0],t[1],0],-1n),e.input_points=_u([t[0],1,0,2],0)}else throw Error("At least one of `input_points` or `input_boxes` must be provided.");let n=this.sessions.prompt_encoder_mask_decoder;return await q(n,ci(e,n.inputNames))}async _call(e){return new EE(await super._call(e))}},kE=class extends OE{},AE=class extends OE{},jE=class extends X{},ME=class extends jE{},NE=class extends jE{},PE=class extends jE{},FE=class extends X{},IE=class extends FE{},LE=class extends FE{},RE=class extends FE{},zE=class extends X{},BE=class extends zE{},VE=class extends zE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},HE=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},UE=class extends X{},WE=class extends UE{},GE=class extends UE{},KE=class extends rS{},qE=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},JE=class extends qE{async encode(e){return await q(this.sessions.encoder_model,e)}async decode(e){return await q(this.sessions.decoder_model,e)}},YE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},XE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},ZE=class extends X{},QE=class extends ZE{},$E=class extends ZE{},eD=class extends X{},tD=class extends eD{},nD=class extends eD{},rD=class extends eD{async generate_speech(e,t,{threshold:n=.5,minlenratio:r=0,maxlenratio:i=20,vocoder:a=null}={}){let o={input_ids:e},{encoder_outputs:s,encoder_attention_mask:c}=await Dg(this,o),l=s.dims[1]/this.config.reduction_factor,u=Math.floor(l*i),d=Math.floor(l*r),f=this.config.num_mel_bins,p=[],m=null,h=null,g=0;for(;;){++g;let e=bg(!!h),r;r=h?h.output_sequence_out:new V(`float32`,new Float32Array(f),[1,1,f]);let i={use_cache_branch:e,output_sequence:r,encoder_attention_mask:c,speaker_embeddings:t,encoder_hidden_states:s};Mg(this,i,m),h=await q(this.sessions.decoder_model_merged,i),m=kg(h,m);let{prob:a,spectrum:o}=h;if(p.push(o),g>=d&&(Array.from(a.data).filter(e=>e>=n).length>0||g>=u))break}let _=H(p),{waveform:v}=await q(a.sessions.model,{spectrogram:_});return{spectrogram:_,waveform:v}}},iD=class extends X{main_input_name=`spectrogram`},aD=class extends X{},oD=class extends aD{},sD=class extends aD{async _call(e){return new Fh(await super._call(e))}},cD=class extends aD{async _call(e){return new J(await super._call(e))}},lD=class extends aD{async _call(e){return new Ih(await super._call(e))}},uD=class extends X{},dD=class extends uD{},fD=class extends uD{},pD=class extends X{},mD=class extends pD{},hD=class extends pD{},gD=class extends X{},_D=class extends gD{},vD=class extends X{},yD=class extends vD{async generate_speech({input_ids:e,attention_mask:t,style:n,num_inference_steps:r=5,speed:i=1.05}){let{sampling_rate:a,chunk_compress_factor:o,base_chunk_size:s,latent_dim:c}=this.config,{last_hidden_state:l,durations:u}=await q(this.sessions.text_encoder,{input_ids:e,attention_mask:t,style:n}),d=u.div(i).mul_(a),f=s*o,p=d.data,m=Int32Array.from(p,e=>Math.ceil(e/f)),h=Math.max(...m),g=e.dims[0],_=new BigInt64Array(g*h);for(let e=0;ee*t,1),r=Ql[e.type];c[e.name]=new V(e.type,new r(n),t)}let f=Ql[d],p=new V(d,new f(s*dO),[1,s,dO]),m=t[Symbol.asyncIterator]?.()??t[Symbol.iterator]?.();if(!m)throw Error(`input_features must be iterable or async iterable`);return{encoder_session:i,enc_kv_cache:c,enc_padding_cache:p,enc_past_seq_len:0,audio_embed_queue:[],audio_embed_total_tokens:0,audio_queue_offset:0,audio_consumed:0,stream_exhausted:!1,chunks_iter:m,text_hidden_size:n.hidden_size}}async function hO(e,t){let n=t.dims[2],r=Math.floor((fO+n-3)/2)+1,i=new V(`int64`,BigInt64Array.from({length:r},(t,n)=>BigInt(e.enc_past_seq_len+n)),[1,r]),a=e.enc_past_seq_len+r,o=yu([1,a]),{audio_embeds:s,present_padding_cache:c,...l}=await q(e.encoder_session,{input_features:t,attention_mask:o,position_ids:i,past_padding_cache:e.enc_padding_cache,...e.enc_kv_cache});e.enc_padding_cache.location===`gpu-buffer`&&e.enc_padding_cache.dispose(),e.enc_padding_cache=c;for(let t in l)if(t.startsWith(`present.`)){let n=t.replace(`present`,`past_key_values`),r=e.enc_kv_cache[n];r?.location===`gpu-buffer`&&r.dispose(),e.enc_kv_cache[n]=l[t]}return e.enc_past_seq_len=a,s}async function gO(e,t){for(;e.audio_embed_total_tokens0&&e.audio_embed_queue.length>0;){let t=e.audio_embed_queue[0],n=t.tokens-e.audio_queue_offset,o=Math.min(a,n),s=e.audio_queue_offset*e.text_hidden_size;for(let n=0;n=t.tokens&&(e.audio_embed_queue.shift(),e.audio_queue_offset=0)}e.audio_consumed+=n-a}var vO=class extends rg{constructor(e){super(),this._s=e}_call(e){let t=this._s.stream_exhausted&&this._s.audio_embed_queue.length===0;return e.map(()=>t)}},yO=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`]},bO=class extends yO{async forward({input_ids:e,past_key_values:t,...n}){let r=e.dims[1],i=pO.get(this);i&&await gO(i,i.audio_consumed+r);let{inputs_embeds:a}=await q(this.sessions.embed_tokens,{input_ids:e});i&&_O(i,a,r);let o={inputs_embeds:a,...n};Mg(this,o,t);let s=this.sessions.decoder_model_merged;return await q(s,ci(o,s.inputNames))}async generate({input_features:e,stopping_criteria:t,...n}){if(!e)throw Error(`input_features (generator/iterable) must be provided`);let r=mO(this,e);pO.set(this,r);let i=new ig;i.push(new vO(r)),t&&i.extend(t);try{return await super.generate({...n,stopping_criteria:i})}finally{r.enc_kv_cache.dispose(),pO.delete(this)}}},xO=class extends X{},SO=class extends xO{},CO=class extends xO{async _call(e){return new Lh(await super._call(e))}},wO=class extends xO{async _call(e){return new J(await super._call(e))}},TO=class extends Mh{constructor({logits:e,embeddings:t}){super(),this.logits=e,this.embeddings=t}},EO=class extends X{},DO=class extends EO{},OO=class extends EO{async _call(e){return new Lh(await super._call(e))}},kO=class extends EO{async _call(e){return new J(await super._call(e))}},AO=class extends EO{async _call(e){return new TO(await super._call(e))}},jO=class extends EO{async _call(e){return new Ph(await super._call(e))}},MO=class extends X{},NO=class extends MO{},PO=class extends ng{return_timestamps=null;return_token_timestamps=null;num_frames=null;alignment_heads=null;task=null;language=null;no_timestamps_token_id=null;prompt_ids=null;is_multilingual=null;lang_to_id=null;task_to_id=null;max_initial_timestamp_index=1},FO=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`attention_mask`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},IO=class extends FO{},LO=class extends FO{_prepare_generation_config(e,t){return super._prepare_generation_config(e,t,PO)}_retrieve_init_tokens(e){let t=[e.decoder_start_token_id],n=e.language,r=e.task;if(e.is_multilingual){n||=(A.warn(`No language specified - defaulting to English (en).`),`en`);let i=`<|${Dd(n)}|>`;t.push(e.lang_to_id[i]),t.push(e.task_to_id[r??`transcribe`])}else if(n||r)throw Error("Cannot specify `task` or `language` for an English-only model. If the model is intended to be multilingual, pass `is_multilingual=true` to generate, or update the generation config.");return!e.return_timestamps&&e.no_timestamps_token_id&&t.at(-1)!==e.no_timestamps_token_id?t.push(e.no_timestamps_token_id):e.return_timestamps&&t.at(-1)===e.no_timestamps_token_id&&(A.warn("<|notimestamps|> prompt token is removed from generation_config since `return_timestamps` is set to `true`."),t.pop()),t.filter(e=>e!=null)}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,...i}){t=this._prepare_generation_config(t,i);let a=i.decoder_input_ids instanceof V?Du(i.decoder_input_ids):i.decoder_input_ids??this._retrieve_init_tokens(t);if(t.return_timestamps&&(n??=new Uh,n.push(new Jh(t,a))),t.begin_suppress_tokens&&(n??=new Uh,n.push(new qh(t.begin_suppress_tokens,a.length))),t.return_token_timestamps){if(!t.alignment_heads)throw Error("Model generation config has no `alignment_heads`, token-level timestamps not available. See https://gist.github.com/hollance/42e32852f24243b748ae6bc1f985b13a on how to add this property to the generation config.");t.task===`translate`&&A.warn(`Token-level timestamps may not be reliable for task 'translate'.`),t.output_attentions=!0,t.return_dict_in_generate=!0}if(t.return_timestamps&&!i.max_new_tokens)return this._generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:a,kwargs:i});let o=await super.generate({inputs:e,generation_config:t,logits_processor:n,decoder_input_ids:a,...i});return t.return_token_timestamps&&(o.token_timestamps=this._extract_token_timestamps(o,t.alignment_heads,t.num_frames,.02,a.length)),o}async _generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:r,kwargs:i}){let a=t.no_timestamps_token_id+1,o=Array.isArray(t.eos_token_id)?t.eos_token_id[0]:t.eos_token_id,s=t.return_token_timestamps,c=e,l=c.dims[2],u=2*this.config.max_source_positions,d=0,f=[],p=[];for(;de+n)}if(v.length>0&&v.at(-1)===o&&v.pop(),v.length===0)break;let b=v.map(e=>e>=a),x=v.length>=2&&b[v.length-1]&&!b[v.length-2],S=[];for(let e=0;e0){if(x)C=e-d;else{let e=S.at(-1);C=(v[e-1]-a)*2,ee=e}}else C=e-d;let w=Math.floor(d/2),te=a+1500;for(let e=0;e=a&&(v[e]=Math.min(v[e]+w,te));f.push(...v.slice(0,ee)),y&&p.push(...y.slice(0,ee)),d+=C}f.push(o);let m=[...r,...f];if(s){let e=new V(`int64`,m.map(BigInt),[1,m.length]),t=[...Array(r.length).fill(0),...p,0];return{sequences:e,token_timestamps:new V(`float32`,new Float32Array(t),[1,t.length])}}return new V(`int64`,m.map(BigInt),[1,m.length])}_extract_token_timestamps(e,t,n=null,r=.02,i=0){if(!e.cross_attentions)throw Error("Model outputs must contain cross attentions to extract timestamps. This is most likely because the model was not exported with `output_attentions=True`.");n??A.warn("`num_frames` has not been set, meaning the entire audio will be analyzed. This may lead to inaccurate token-level timestamps for short audios (< 30 seconds).");let a=this.config.median_filter_width;a===void 0&&(A.warn("Model config has no `median_filter_width`, using default value of 7."),a=7);let o=e.cross_attentions,s=Array.from({length:this.config.decoder_layers},(e,t)=>H(o.map(e=>e[t]),2)),c=du(t.map(([e,t])=>{if(e>=s.length)throw Error(`Layer index ${e} is out of bounds for cross attentions (length ${s.length}).`);return n?s[e].slice(null,t,null,[0,n]):s[e].slice(null,t)})).permute(1,0,2,3),[l,u]=pu(c,-2,0,!0),d=c.clone();for(let e=0;e0?d.slice(null,null,[i,d.dims[2]],null):d,1)],p=e.sequences.dims,m=new V(`float32`,new Float32Array(p[0]*p[1]),p);for(let e=0;et[n+1]-t[n])).map(e=>!!e),o=[];for(let e=0;e0&&s.push(o.at(-1)),m[e].data.set(s)}return m}},RO=class extends LO{},zO=class extends X{},BO=class extends zO{},VO=class extends zO{async _call(e){return new Fh(await super._call(e))}},HO=class extends zO{async _call(e){return new J(await super._call(e))}},UO=class extends zO{async _call(e){return new Ph(await super._call(e))}},WO=class extends zO{async _call(e){return new Ih(await super._call(e))}},GO=class extends X{},KO=class extends GO{},qO=class extends GO{async _call(e){return new Fh(await super._call(e))}},JO=class extends GO{async _call(e){return new J(await super._call(e))}},YO=class extends GO{async _call(e){return new Ph(await super._call(e))}},XO=class extends GO{async _call(e){return new Ih(await super._call(e))}},ZO=class extends X{},QO=class extends ZO{},$O=class extends ZO{async _call(e){return new ek(await super._call(e))}},ek=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},tk=class extends X{},nk=class extends tk{},rk=class extends tk{},ik=class extends X{},ak=class extends ik{},ok=class extends ik{},sk=/* @__PURE__ */ new Map([[`bert`,`BertModel`],[`eurobert`,`EuroBertModel`],[`neobert`,`NeoBertModel`],[`modernbert`,`ModernBertModel`],[`nomic_bert`,`NomicBertModel`],[`roformer`,`RoFormerModel`],[`electra`,`ElectraModel`],[`esm`,`EsmModel`],[`convbert`,`ConvBertModel`],[`camembert`,`CamembertModel`],[`deberta`,`DebertaModel`],[`deberta-v2`,`DebertaV2Model`],[`mpnet`,`MPNetModel`],[`albert`,`AlbertModel`],[`distilbert`,`DistilBertModel`],[`roberta`,`RobertaModel`],[`xlm`,`XLMModel`],[`xlm-roberta`,`XLMRobertaModel`],[`clap`,`ClapModel`],[`clip`,`CLIPModel`],[`clipseg`,`CLIPSegModel`],[`chinese_clip`,`ChineseCLIPModel`],[`siglip`,`SiglipModel`],[`jina_clip`,`JinaCLIPModel`],[`mobilebert`,`MobileBertModel`],[`squeezebert`,`SqueezeBertModel`],[`wav2vec2`,`Wav2Vec2Model`],[`wav2vec2-bert`,`Wav2Vec2BertModel`],[`unispeech`,`UniSpeechModel`],[`unispeech-sat`,`UniSpeechSatModel`],[`hubert`,`HubertModel`],[`wavlm`,`WavLMModel`],[`audio-spectrogram-transformer`,`ASTModel`],[`vits`,`VitsModel`],[`pyannote`,`PyAnnoteModel`],[`wespeaker-resnet`,`WeSpeakerResNetModel`],[`detr`,`DetrModel`],[`rt_detr`,`RTDetrModel`],[`rt_detr_v2`,`RTDetrV2Model`],[`rf_detr`,`RFDetrModel`],[`d_fine`,`DFineModel`],[`table-transformer`,`TableTransformerModel`],[`vit`,`ViTModel`],[`ijepa`,`IJepaModel`],[`pvt`,`PvtModel`],[`vit_msn`,`ViTMSNModel`],[`vit_mae`,`ViTMAEModel`],[`groupvit`,`GroupViTModel`],[`fastvit`,`FastViTModel`],[`mobilevit`,`MobileViTModel`],[`mobilevitv2`,`MobileViTV2Model`],[`owlvit`,`OwlViTModel`],[`owlv2`,`Owlv2Model`],[`beit`,`BeitModel`],[`deit`,`DeiTModel`],[`hiera`,`HieraModel`],[`convnext`,`ConvNextModel`],[`convnextv2`,`ConvNextV2Model`],[`dinov2`,`Dinov2Model`],[`dinov2_with_registers`,`Dinov2WithRegistersModel`],[`dinov3_vit`,`DINOv3ViTModel`],[`dinov3_convnext`,`DINOv3ConvNextModel`],[`resnet`,`ResNetModel`],[`swin`,`SwinModel`],[`swin2sr`,`Swin2SRModel`],[`donut-swin`,`DonutSwinModel`],[`yolos`,`YolosModel`],[`dpt`,`DPTModel`],[`glpn`,`GLPNModel`],[`hifigan`,`SpeechT5HifiGan`],[`efficientnet`,`EfficientNetModel`],[`decision_transformer`,`DecisionTransformerModel`],[`patchtst`,`PatchTSTModel`],[`patchtsmixer`,`PatchTSMixerModel`],[`mobilenet_v1`,`MobileNetV1Model`],[`mobilenet_v2`,`MobileNetV2Model`],[`mobilenet_v3`,`MobileNetV3Model`],[`mobilenet_v4`,`MobileNetV4Model`],[`maskformer`,`MaskFormerModel`],[`mgp-str`,`MgpstrForSceneTextRecognition`],[`style_text_to_speech_2`,`StyleTextToSpeech2Model`],[`openai_privacy_filter`,`OpenAIPrivacyFilterModel`]]),ck=/* @__PURE__ */ new Map([[`t5`,`T5Model`],[`longt5`,`LongT5Model`],[`mt5`,`MT5Model`],[`bart`,`BartModel`],[`mbart`,`MBartModel`],[`marian`,`MarianModel`],[`whisper`,`WhisperModel`],[`cohere_asr`,`CohereAsrModel`],[`m2m_100`,`M2M100Model`],[`blenderbot`,`BlenderbotModel`],[`blenderbot-small`,`BlenderbotSmallModel`]]),lk=/* @__PURE__ */ new Map([[`mimi`,`MimiModel`],[`dac`,`DacModel`],[`snac`,`SnacModel`]]),uk=/* @__PURE__ */ new Map([[`bloom`,`BloomModel`],[`jais`,`JAISModel`],[`gpt2`,`GPT2Model`],[`gpt_oss`,`GptOssModel`],[`gptj`,`GPTJModel`],[`gpt_bigcode`,`GPTBigCodeModel`],[`gpt_neo`,`GPTNeoModel`],[`gpt_neox`,`GPTNeoXModel`],[`codegen`,`CodeGenModel`],[`llama`,`LlamaModel`],[`apertus`,`ApertusModel`],[`nanochat`,`NanoChatModel`],[`arcee`,`ArceeModel`],[`afmoe`,`AfmoeModel`],[`lfm2`,`Lfm2Model`],[`lfm2_moe`,`Lfm2MoeModel`],[`smollm3`,`SmolLM3Model`],[`exaone`,`ExaoneModel`],[`olmo`,`OlmoModel`],[`olmo2`,`Olmo2Model`],[`olmo3`,`Olmo3Model`],[`olmo_hybrid`,`OlmoHybridModel`],[`mobilellm`,`MobileLLMModel`],[`granite`,`GraniteModel`],[`granitemoehybrid`,`GraniteMoeHybridModel`],[`cohere`,`CohereModel`],[`cohere2`,`Cohere2Model`],[`gemma`,`GemmaModel`],[`gemma2`,`Gemma2Model`],[`vaultgemma`,`VaultGemmaModel`],[`gemma3_text`,`Gemma3Model`],[`helium`,`HeliumModel`],[`glm`,`GlmModel`],[`glm_moe_dsa`,`GlmMoeDsaModel`],[`openelm`,`OpenELMModel`],[`qwen2`,`Qwen2Model`],[`qwen2_moe`,`Qwen2MoeModel`],[`qwen3`,`Qwen3Model`],[`qwen3_moe`,`Qwen3MoeModel`],[`qwen3_next`,`Qwen3NextModel`],[`phi`,`PhiModel`],[`phi3`,`Phi3Model`],[`mpt`,`MptModel`],[`opt`,`OPTModel`],[`mistral`,`MistralModel`],[`mistral4`,`Mistral4Model`],[`ministral`,`MinistralModel`],[`ministral3`,`Ministral3Model`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2Model`],[`deepseek_v3`,`DeepseekV3Model`],[`deepseek_v4`,`DeepseekV4Model`],[`falcon`,`FalconModel`],[`falcon_h1`,`FalconH1Model`],[`nemotron_h`,`NemotronHModel`],[`solar_open`,`SolarOpenModel`],[`stablelm`,`StableLmModel`],[`modernbert-decoder`,`ModernBertDecoderModel`],[`hunyuan_v1_dense`,`HunYuanDenseV1Model`],[`youtu`,`YoutuModel`],[`zaya`,`ZayaModel`],[`hrm_text`,`HrmTextModel`]]),dk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForSpeechToText`],[`whisper`,`WhisperForConditionalGeneration`],[`lite-whisper`,`LiteWhisperForConditionalGeneration`],[`moonshine`,`MoonshineForConditionalGeneration`],[`cohere_asr`,`CohereAsrForConditionalGeneration`]]),fk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForTextToSpeech`]]),pk=/* @__PURE__ */ new Map([[`vits`,`VitsModel`],[`musicgen`,`MusicgenForConditionalGeneration`],[`supertonic`,`SupertonicForConditionalGeneration`]]),mk=/* @__PURE__ */ new Map([[`bert`,`BertForSequenceClassification`],[`eurobert`,`EuroBertForSequenceClassification`],[`neobert`,`NeoBertForSequenceClassification`],[`modernbert`,`ModernBertForSequenceClassification`],[`roformer`,`RoFormerForSequenceClassification`],[`electra`,`ElectraForSequenceClassification`],[`esm`,`EsmForSequenceClassification`],[`convbert`,`ConvBertForSequenceClassification`],[`camembert`,`CamembertForSequenceClassification`],[`deberta`,`DebertaForSequenceClassification`],[`deberta-v2`,`DebertaV2ForSequenceClassification`],[`mpnet`,`MPNetForSequenceClassification`],[`albert`,`AlbertForSequenceClassification`],[`distilbert`,`DistilBertForSequenceClassification`],[`roberta`,`RobertaForSequenceClassification`],[`xlm`,`XLMForSequenceClassification`],[`xlm-roberta`,`XLMRobertaForSequenceClassification`],[`bart`,`BartForSequenceClassification`],[`mbart`,`MBartForSequenceClassification`],[`mobilebert`,`MobileBertForSequenceClassification`],[`squeezebert`,`SqueezeBertForSequenceClassification`]]),hk=/* @__PURE__ */ new Map([[`bert`,`BertForTokenClassification`],[`eurobert`,`EuroBertForTokenClassification`],[`neobert`,`NeoBertForTokenClassification`],[`modernbert`,`ModernBertForTokenClassification`],[`roformer`,`RoFormerForTokenClassification`],[`electra`,`ElectraForTokenClassification`],[`esm`,`EsmForTokenClassification`],[`convbert`,`ConvBertForTokenClassification`],[`camembert`,`CamembertForTokenClassification`],[`deberta`,`DebertaForTokenClassification`],[`deberta-v2`,`DebertaV2ForTokenClassification`],[`mpnet`,`MPNetForTokenClassification`],[`distilbert`,`DistilBertForTokenClassification`],[`roberta`,`RobertaForTokenClassification`],[`xlm`,`XLMForTokenClassification`],[`xlm-roberta`,`XLMRobertaForTokenClassification`],[`openai_privacy_filter`,`OpenAIPrivacyFilterForTokenClassification`]]),gk=/* @__PURE__ */ new Map([[`t5`,`T5ForConditionalGeneration`],[`longt5`,`LongT5ForConditionalGeneration`],[`mt5`,`MT5ForConditionalGeneration`],[`bart`,`BartForConditionalGeneration`],[`mbart`,`MBartForConditionalGeneration`],[`marian`,`MarianMTModel`],[`m2m_100`,`M2M100ForConditionalGeneration`],[`blenderbot`,`BlenderbotForConditionalGeneration`],[`blenderbot-small`,`BlenderbotSmallForConditionalGeneration`]]),_k=/* @__PURE__ */ new Map([[`bloom`,`BloomForCausalLM`],[`gpt2`,`GPT2LMHeadModel`],[`gpt_oss`,`GptOssForCausalLM`],[`jais`,`JAISLMHeadModel`],[`gptj`,`GPTJForCausalLM`],[`gpt_bigcode`,`GPTBigCodeForCausalLM`],[`gpt_neo`,`GPTNeoForCausalLM`],[`gpt_neox`,`GPTNeoXForCausalLM`],[`codegen`,`CodeGenForCausalLM`],[`llama`,`LlamaForCausalLM`],[`nanochat`,`NanoChatForCausalLM`],[`apertus`,`ApertusForCausalLM`],[`llama4_text`,`Llama4ForCausalLM`],[`arcee`,`ArceeForCausalLM`],[`afmoe`,`AfmoeForCausalLM`],[`lfm2`,`Lfm2ForCausalLM`],[`lfm2_moe`,`Lfm2MoeForCausalLM`],[`smollm3`,`SmolLM3ForCausalLM`],[`exaone`,`ExaoneForCausalLM`],[`olmo`,`OlmoForCausalLM`],[`olmo2`,`Olmo2ForCausalLM`],[`olmo3`,`Olmo3ForCausalLM`],[`olmo_hybrid`,`OlmoHybridForCausalLM`],[`mobilellm`,`MobileLLMForCausalLM`],[`granite`,`GraniteForCausalLM`],[`granitemoehybrid`,`GraniteMoeHybridForCausalLM`],[`cohere`,`CohereForCausalLM`],[`cohere2`,`Cohere2ForCausalLM`],[`gemma`,`GemmaForCausalLM`],[`gemma2`,`Gemma2ForCausalLM`],[`vaultgemma`,`VaultGemmaForCausalLM`],[`gemma3_text`,`Gemma3ForCausalLM`],[`gemma3`,`Gemma3ForCausalLM`],[`helium`,`HeliumForCausalLM`],[`glm`,`GlmForCausalLM`],[`glm_moe_dsa`,`GlmMoeDsaForCausalLM`],[`openelm`,`OpenELMForCausalLM`],[`qwen2`,`Qwen2ForCausalLM`],[`qwen2_moe`,`Qwen2MoeForCausalLM`],[`qwen3`,`Qwen3ForCausalLM`],[`qwen3_moe`,`Qwen3MoeForCausalLM`],[`qwen3_next`,`Qwen3NextForCausalLM`],[`qwen2_vl`,`Qwen2VLForCausalLM`],[`qwen2_5_vl`,`Qwen2_5_VLForCausalLM`],[`qwen3_vl`,`Qwen3VLForCausalLM`],[`qwen3_vl_moe`,`Qwen3VLMoeForCausalLM`],[`qwen3_5`,`Qwen3_5ForCausalLM`],[`qwen3_5_text`,`Qwen3_5ForCausalLM`],[`qwen3_5_moe`,`Qwen3_5MoeForCausalLM`],[`gemma3n`,`Gemma3nForCausalLM`],[`gemma4`,`Gemma4ForCausalLM`],[`phi`,`PhiForCausalLM`],[`phi3`,`Phi3ForCausalLM`],[`mpt`,`MptForCausalLM`],[`opt`,`OPTForCausalLM`],[`mbart`,`MBartForCausalLM`],[`mistral`,`MistralForCausalLM`],[`mistral4`,`Mistral4ForCausalLM`],[`ministral`,`MinistralForCausalLM`],[`ministral3`,`Ministral3ForCausalLM`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2ForCausalLM`],[`deepseek_v3`,`DeepseekV3ForCausalLM`],[`deepseek_v4`,`DeepseekV4ForCausalLM`],[`falcon`,`FalconForCausalLM`],[`falcon_h1`,`FalconH1ForCausalLM`],[`nemotron_h`,`NemotronHForCausalLM`],[`trocr`,`TrOCRForCausalLM`],[`solar_open`,`SolarOpenForCausalLM`],[`stablelm`,`StableLmForCausalLM`],[`modernbert-decoder`,`ModernBertDecoderForCausalLM`],[`hunyuan_v1_dense`,`HunYuanDenseV1ForCausalLM`],[`youtu`,`YoutuForCausalLM`],[`zaya`,`ZayaForCausalLM`],[`hrm_text`,`HrmTextForCausalLM`],[`phi3_v`,`Phi3VForCausalLM`]]),vk=/* @__PURE__ */ new Map([[`multi_modality`,`MultiModalityCausalLM`]]),yk=/* @__PURE__ */ new Map([[`bert`,`BertForMaskedLM`],[`eurobert`,`EuroBertForMaskedLM`],[`neobert`,`NeoBertForMaskedLM`],[`modernbert`,`ModernBertForMaskedLM`],[`roformer`,`RoFormerForMaskedLM`],[`electra`,`ElectraForMaskedLM`],[`esm`,`EsmForMaskedLM`],[`convbert`,`ConvBertForMaskedLM`],[`camembert`,`CamembertForMaskedLM`],[`deberta`,`DebertaForMaskedLM`],[`deberta-v2`,`DebertaV2ForMaskedLM`],[`mpnet`,`MPNetForMaskedLM`],[`albert`,`AlbertForMaskedLM`],[`distilbert`,`DistilBertForMaskedLM`],[`roberta`,`RobertaForMaskedLM`],[`xlm`,`XLMWithLMHeadModel`],[`xlm-roberta`,`XLMRobertaForMaskedLM`],[`mobilebert`,`MobileBertForMaskedLM`],[`squeezebert`,`SqueezeBertForMaskedLM`]]),bk=/* @__PURE__ */ new Map([[`bert`,`BertForQuestionAnswering`],[`neobert`,`NeoBertForQuestionAnswering`],[`roformer`,`RoFormerForQuestionAnswering`],[`electra`,`ElectraForQuestionAnswering`],[`convbert`,`ConvBertForQuestionAnswering`],[`camembert`,`CamembertForQuestionAnswering`],[`deberta`,`DebertaForQuestionAnswering`],[`deberta-v2`,`DebertaV2ForQuestionAnswering`],[`mpnet`,`MPNetForQuestionAnswering`],[`albert`,`AlbertForQuestionAnswering`],[`distilbert`,`DistilBertForQuestionAnswering`],[`roberta`,`RobertaForQuestionAnswering`],[`xlm`,`XLMForQuestionAnswering`],[`xlm-roberta`,`XLMRobertaForQuestionAnswering`],[`mobilebert`,`MobileBertForQuestionAnswering`],[`squeezebert`,`SqueezeBertForQuestionAnswering`]]),xk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`]]),Sk=/* @__PURE__ */ new Map([[`llava`,`LlavaForConditionalGeneration`],[`llava_onevision`,`LlavaOnevisionForConditionalGeneration`],[`moondream1`,`Moondream1ForConditionalGeneration`],[`florence2`,`Florence2ForConditionalGeneration`],[`qwen2_vl`,`Qwen2VLForConditionalGeneration`],[`qwen2_5_vl`,`Qwen2_5_VLForConditionalGeneration`],[`qwen3_vl`,`Qwen3VLForConditionalGeneration`],[`qwen3_vl_moe`,`Qwen3VLMoeForConditionalGeneration`],[`qwen3_5`,`Qwen3_5ForConditionalGeneration`],[`qwen3_5_moe`,`Qwen3_5MoeForConditionalGeneration`],[`lfm2_vl`,`Lfm2VlForConditionalGeneration`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`],[`paligemma`,`PaliGemmaForConditionalGeneration`],[`llava_qwen2`,`LlavaQwen2ForCausalLM`],[`gemma3`,`Gemma3ForConditionalGeneration`],[`gemma3n`,`Gemma3nForConditionalGeneration`],[`gemma4`,`Gemma4ForConditionalGeneration`],[`mistral3`,`Mistral3ForConditionalGeneration`],[`lighton_ocr`,`LightOnOcrForConditionalGeneration`],[`glm_ocr`,`GlmOcrForConditionalGeneration`]]),Ck=/* @__PURE__ */ new Map([[`granite_speech`,`GraniteSpeechForConditionalGeneration`],[`ultravox`,`UltravoxModel`],[`voxtral`,`VoxtralForConditionalGeneration`],[`voxtral_realtime`,`VoxtralRealtimeForConditionalGeneration`]]),wk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`]]),Tk=/* @__PURE__ */ new Map([[`vit`,`ViTForImageClassification`],[`ijepa`,`IJepaForImageClassification`],[`pvt`,`PvtForImageClassification`],[`vit_msn`,`ViTMSNForImageClassification`],[`fastvit`,`FastViTForImageClassification`],[`mobilevit`,`MobileViTForImageClassification`],[`mobilevitv2`,`MobileViTV2ForImageClassification`],[`beit`,`BeitForImageClassification`],[`deit`,`DeiTForImageClassification`],[`hiera`,`HieraForImageClassification`],[`convnext`,`ConvNextForImageClassification`],[`convnextv2`,`ConvNextV2ForImageClassification`],[`dinov2`,`Dinov2ForImageClassification`],[`dinov2_with_registers`,`Dinov2WithRegistersForImageClassification`],[`resnet`,`ResNetForImageClassification`],[`swin`,`SwinForImageClassification`],[`segformer`,`SegformerForImageClassification`],[`efficientnet`,`EfficientNetForImageClassification`],[`mobilenet_v1`,`MobileNetV1ForImageClassification`],[`mobilenet_v2`,`MobileNetV2ForImageClassification`],[`mobilenet_v3`,`MobileNetV3ForImageClassification`],[`mobilenet_v4`,`MobileNetV4ForImageClassification`]]),Ek=/* @__PURE__ */ new Map([[`detr`,`DetrForObjectDetection`],[`rt_detr`,`RTDetrForObjectDetection`],[`rt_detr_v2`,`RTDetrV2ForObjectDetection`],[`rf_detr`,`RFDetrForObjectDetection`],[`d_fine`,`DFineForObjectDetection`],[`table-transformer`,`TableTransformerForObjectDetection`],[`yolos`,`YolosForObjectDetection`]]),Dk=/* @__PURE__ */ new Map([[`owlvit`,`OwlViTForObjectDetection`],[`owlv2`,`Owlv2ForObjectDetection`],[`grounding-dino`,`GroundingDinoForObjectDetection`]]),Ok=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`clipseg`,`CLIPSegForImageSegmentation`]]),kk=/* @__PURE__ */ new Map([[`segformer`,`SegformerForSemanticSegmentation`],[`sapiens`,`SapiensForSemanticSegmentation`],[`swin`,`SwinForSemanticSegmentation`],[`mobilenet_v1`,`MobileNetV1ForSemanticSegmentation`],[`mobilenet_v2`,`MobileNetV2ForSemanticSegmentation`],[`mobilenet_v3`,`MobileNetV3ForSemanticSegmentation`],[`mobilenet_v4`,`MobileNetV4ForSemanticSegmentation`]]),Ak=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`maskformer`,`MaskFormerForInstanceSegmentation`]]),jk=/* @__PURE__ */ new Map([[`sam`,`SamModel`],[`sam2`,`Sam2Model`],[`edgetam`,`EdgeTamModel`],[`sam3_tracker`,`Sam3TrackerModel`]]),Mk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForCTC`],[`wav2vec2-bert`,`Wav2Vec2BertForCTC`],[`unispeech`,`UniSpeechForCTC`],[`unispeech-sat`,`UniSpeechSatForCTC`],[`wavlm`,`WavLMForCTC`],[`hubert`,`HubertForCTC`],[`parakeet_ctc`,`ParakeetForCTC`]]),Nk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForSequenceClassification`],[`wav2vec2-bert`,`Wav2Vec2BertForSequenceClassification`],[`unispeech`,`UniSpeechForSequenceClassification`],[`unispeech-sat`,`UniSpeechSatForSequenceClassification`],[`wavlm`,`WavLMForSequenceClassification`],[`hubert`,`HubertForSequenceClassification`],[`audio-spectrogram-transformer`,`ASTForAudioClassification`]]),Pk=/* @__PURE__ */ new Map([[`wavlm`,`WavLMForXVector`]]),Fk=/* @__PURE__ */ new Map([[`unispeech-sat`,`UniSpeechSatForAudioFrameClassification`],[`wavlm`,`WavLMForAudioFrameClassification`],[`wav2vec2`,`Wav2Vec2ForAudioFrameClassification`],[`pyannote`,`PyAnnoteForAudioFrameClassification`]]),Ik=/* @__PURE__ */ new Map([[`vitmatte`,`VitMatteForImageMatting`]]),Lk=/* @__PURE__ */ new Map([[`patchtst`,`PatchTSTForPrediction`],[`patchtsmixer`,`PatchTSMixerForPrediction`]]),Rk=/* @__PURE__ */ new Map([[`swin2sr`,`Swin2SRForImageSuperResolution`]]),zk=/* @__PURE__ */ new Map([[`chmv2`,`CHMv2ForDepthEstimation`],[`dpt`,`DPTForDepthEstimation`],[`depth_anything`,`DepthAnythingForDepthEstimation`],[`glpn`,`GLPNForDepthEstimation`],[`sapiens`,`SapiensForDepthEstimation`],[`depth_pro`,`DepthProForDepthEstimation`],[`metric3d`,`Metric3DForDepthEstimation`],[`metric3dv2`,`Metric3Dv2ForDepthEstimation`]]),Bk=/* @__PURE__ */ new Map([[`sapiens`,`SapiensForNormalEstimation`]]),Vk=/* @__PURE__ */ new Map([[`vitpose`,`VitPoseForPoseEstimation`]]),Hk=/* @__PURE__ */ new Map([[`clip`,`CLIPVisionModelWithProjection`],[`siglip`,`SiglipVisionModel`],[`jina_clip`,`JinaCLIPVisionModel`]]),Uk=[[sk,Y.EncoderOnly],[ck,Y.EncoderDecoder],[uk,Y.DecoderOnlyWithoutHead],[lk,Y.AutoEncoder],[mk,Y.EncoderOnly],[hk,Y.EncoderOnly],[gk,Y.Seq2Seq],[dk,Y.Seq2Seq],[_k,Y.DecoderOnly],[vk,Y.MultiModality],[yk,Y.EncoderOnly],[bk,Y.EncoderOnly],[xk,Y.Vision2Seq],[Sk,Y.ImageTextToText],[Ck,Y.AudioTextToText],[Tk,Y.EncoderOnly],[Ok,Y.EncoderOnly],[Ak,Y.EncoderOnly],[kk,Y.EncoderOnly],[Ik,Y.EncoderOnly],[Lk,Y.EncoderOnly],[Rk,Y.EncoderOnly],[zk,Y.EncoderOnly],[Bk,Y.EncoderOnly],[Vk,Y.EncoderOnly],[Ek,Y.EncoderOnly],[Dk,Y.EncoderOnly],[jk,Y.MaskGeneration],[Mk,Y.EncoderOnly],[Nk,Y.EncoderOnly],[fk,Y.Seq2Seq],[pk,Y.EncoderOnly],[Pk,Y.EncoderOnly],[Fk,Y.EncoderOnly],[Hk,Y.EncoderOnly]];for(let[e,t]of Uk)for(let n of e.values()){Cg.set(n,t);let e=qg[n];Tg.set(e,n),wg.set(n,e)}var Wk=[[`MusicgenForConditionalGeneration`,bw,Y.Musicgen],[`Phi3VForCausalLM`,wT,Y.Phi3V],[`CLIPTextModelWithProjection`,ev,Y.EncoderOnly],[`SiglipTextModel`,VE,Y.EncoderOnly],[`JinaCLIPTextModel`,fS,Y.EncoderOnly],[`ClapTextModelWithProjection`,Y_,Y.EncoderOnly],[`ClapAudioModelWithProjection`,X_,Y.EncoderOnly],[`DacEncoderModel`,Vv,Y.EncoderOnly],[`DacDecoderModel`,Hv,Y.EncoderOnly],[`MimiEncoderModel`,tC,Y.EncoderOnly],[`MimiDecoderModel`,nC,Y.EncoderOnly],[`SnacEncoderModel`,YE,Y.EncoderOnly],[`SnacDecoderModel`,XE,Y.EncoderOnly],[`Gemma3nForConditionalGeneration`,Bb,Y.ImageAudioTextToText],[`Gemma4ForConditionalGeneration`,Hb,Y.ImageAudioTextToText],[`SupertonicForConditionalGeneration`,yD,Y.Supertonic],[`ChatterboxModel`,H_,Y.Chatterbox],[`VoxtralRealtimeForConditionalGeneration`,bO,Y.VoxtralRealtime]];for(let[e,t,n]of Wk)Cg.set(e,n),Tg.set(t,e),wg.set(e,t);var Gk=/* @__PURE__ */ new Map([[`modnet`,Ok],[`birefnet`,Ok],[`isnet`,Ok],[`ben`,Ok]]);for(let[e,t]of Gk.entries())t.set(e,`PreTrainedModel`),Cg.set(e,Y.EncoderOnly),wg.set(e,X);var Kk=new Set(Gk.keys());Cg.set(`PreTrainedModel`,Y.EncoderOnly),Tg.set(X,`PreTrainedModel`);var Z={MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES:mk,MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES:hk,MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES:fk,MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES:pk,MODEL_FOR_MASKED_LM_MAPPING_NAMES:yk,MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES:bk,MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES:Tk,MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES:Ok,MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES:kk,MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES:Ak,MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES:Ek,MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES:Dk,MODEL_FOR_MASK_GENERATION_MAPPING_NAMES:jk,MODEL_FOR_CTC_MAPPING_NAMES:Mk,MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES:Nk,MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES:Pk,MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES:Fk,MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES:wk,MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES:Ik,MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES:Rk,MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES:zk,MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES:Bk,MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES:Vk,MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES:Hk,MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES:Sk,MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES:Ck,MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES:gk,MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES:dk,MODEL_FOR_CAUSAL_LM_MAPPING_NAMES:_k,MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES:xk};vg(Z);var Q=class{static MODEL_CLASS_MAPPINGS=null;static BASE_IF_FAIL=!1;static supports(e){if(!this.MODEL_CLASS_MAPPINGS)return!1;for(let t of this.MODEL_CLASS_MAPPINGS)if(t.has(e))return!0;return this.BASE_IF_FAIL}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d};if(f.config=await Ch.from_pretrained(e,f),!this.MODEL_CLASS_MAPPINGS)throw Error("`MODEL_CLASS_MAPPINGS` not implemented for this type of `AutoClass`: "+this.name);let{model_type:p}=f.config;for(let t of this.MODEL_CLASS_MAPPINGS){let n=t.get(p);if(!n){for(let e of t.values())if(e[0]===p){n=e;break}if(!n)continue}return await qg[n].from_pretrained(e,f)}if(this.BASE_IF_FAIL)return Kk.has(p)||A.warn(`Unknown model class "${p}", attempting to construct from base class.`),await X.from_pretrained(e,f);throw Error(`Unsupported model type: ${p}`)}},qk=class extends Q{static MODEL_CLASS_MAPPINGS=Uk.map(e=>e[0]);static BASE_IF_FAIL=!0},Jk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES]},Yk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES]},Xk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES]},Zk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES]},Qk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES]},$k=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES]},eA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES]},tA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASKED_LM_MAPPING_NAMES]},nA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES]},rA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES]},iA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES]},aA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES]},oA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES]},sA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES]},cA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES]},lA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASK_GENERATION_MAPPING_NAMES]});var uA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CTC_MAPPING_NAMES]},dA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES]};var fA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES]});var pA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES]},mA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES]};var hA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES]};async function gA(e){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>Vf.read(e)))}async function _A(e,t){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>typeof e==`string`||e instanceof URL?Wd(e,t):e instanceof Float64Array?new Float32Array(e):e))}function vA(e,t){t&&(e=e.map(e=>e|0));let[n,r,i,a]=e;return{xmin:n,ymin:r,xmax:i,ymax:a}}var yA=class extends $r{constructor({task:e,model:t,tokenizer:n=null,processor:r=null}){super(),this.task=e,this.model=t,this.tokenizer=n,this.processor=r}async dispose(){await this.model.dispose()}},bA=class extends yA{async _call(e,{top_k:t=1}={}){let n=this.tokenizer(e,{padding:!0,truncation:!0}),r=await this.model(n),{problem_type:i,id2label:a}=this.model.config,o=i===`multi_label_classification`?e=>e.sigmoid():e=>new V(`float32`,ol(e.data),e.dims),s=[];for(let e of r.logits){let n=await iu(o(e),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));t===1?s.push(...i):s.push(i)}return Array.isArray(e)||t===1?s:s[0]}},xA=class extends yA{async _call(e,{ignore_labels:t=[`O`],aggregation_strategy:n=`none`}={}){if(n!==`none`&&n!==`simple`)throw Error(`Invalid aggregation_strategy: "${n}". Must be one of "none" or "simple".`);let r=Array.isArray(e),i=this.tokenizer(r?e:[e],{padding:!0,truncation:!0}),a=(await this.model(i)).logits,o=this.model.config.id2label,s=[];for(let e=0;e{let o=0,s=[];for(let n=i;ne==u),i=a[e].tolist(),f=o[e].tolist();for(let n=1;ne==t[n])!==-1)&&(i[n]=-1/0,f[n]=-1/0);let p=ol(i).map((e,t)=>[e,t]),m=ol(f).map((e,t)=>[e,t]);p[0][0]=0,m[0][0]=0;let h=oi(p,m).filter(e=>e[0][1]<=e[1][1]).map(e=>[e[0][1],e[1][1],e[0][0]*e[1][0]]).sort((e,t)=>t[2]-e[2]),g=[];for(let e=0;ee==n);if(c===-1)throw Error(`Mask token (${r}) not found in text.`);let l=a[e][c],u=await iu(new V(`float32`,ol(l.data),l.dims),t),d=u[0].tolist(),f=u[1].tolist();o.push(f.map((e,t)=>{let n=i.slice();return n[c]=e,{score:d[t],token:Number(e),token_str:this.tokenizer.decode([e]),sequence:this.tokenizer.decode(n,{skip_special_tokens:!0})}}))}return Array.isArray(e)?o:o[0]}},EA=class extends yA{_default_generation_config={max_new_tokens:256};_key=`generated_text`;async _call(e,t={}){Array.isArray(e)||(e=[e]),this.model.config.prefix&&(e=e.map(e=>this.model.config.prefix+e));let n=this.model.config.task_specific_params;n&&n[this.task]&&n[this.task].prefix&&(e=e.map(e=>n[this.task].prefix+e));let r=this.tokenizer,i={padding:!0,truncation:!0},a;a=this.task===`translation`&&`_build_translation_inputs`in r?r._build_translation_inputs(e,i,t):r(e,i);let o=await this.model.generate({...a,...this._default_generation_config,...t});return r.batch_decode(o,{skip_special_tokens:!0}).map(e=>({[this._key]:e}))}},DA=class extends EA{_key=`summary_text`},OA=class extends EA{_key=`translation_text`};function kA(e){return Array.isArray(e)&&e.every(e=>`role`in e&&`content`in e)}var AA=class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t={}){let{add_special_tokens:n,return_full_text:r,tools:i,documents:a,chat_template:o,tokenizer_encode_kwargs:s,...c}=t,l=!1,u=!1,d=n??(this.tokenizer.add_bos_token||this.tokenizer.add_eos_token)??!1,f=s,p;if(typeof e==`string`)p=e=[e];else if(Array.isArray(e)&&e.every(e=>typeof e==`string`))l=!0,p=e;else{if(kA(e))e=[e];else if(Array.isArray(e)&&e.every(kA))l=!0;else throw Error(`Input must be a string, an array of strings, a Chat, or an array of Chats`);u=!0;let t={tokenize:!1,add_generation_prompt:!0,...ci({tools:i,documents:a,chat_template:o},[`tools`,`documents`,`chat_template`]),...f};p=e.map(e=>this.tokenizer.apply_chat_template(e,t)),d=!1,f=void 0}let m=u?!1:r??!0;this.tokenizer.padding_side=`left`;let h=this.tokenizer(p,{add_special_tokens:d,padding:!0,truncation:!0,...f}),g=await this.model.generate({...h,...this._default_generation_config,...c}),_=this.tokenizer.batch_decode(g,{skip_special_tokens:!0}),v;!m&&h.input_ids.dims.at(-1)>0&&(v=this.tokenizer.batch_decode(h.input_ids,{skip_special_tokens:!0}).map(e=>e.length));let y=Array.from({length:e.length},e=>[]);for(let t=0;t<_.length;++t){let n=Math.floor(t/g.dims[0]*e.length);v&&(_[t]=_[t].slice(v[n])),y[n].push({generated_text:u?[...e[n],{role:`assistant`,content:_[t]}]:_[t]})}return!l&&y.length===1?y[0]:y}},jA=class extends yA{constructor(e){super(e),this.label2id=Object.fromEntries(Object.entries(this.model.config.label2id).map(([e,t])=>[e.toLowerCase(),t])),this.entailment_id=this.label2id.entailment,this.entailment_id===void 0&&(A.warn(`Could not find 'entailment' in label2id mapping. Using 2 as entailment_id.`),this.entailment_id=2),this.contradiction_id=this.label2id.contradiction??this.label2id.not_entailment,this.contradiction_id===void 0&&(A.warn(`Could not find 'contradiction' in label2id mapping. Using 0 as contradiction_id.`),this.contradiction_id=0)}async _call(e,t,{hypothesis_template:n=`This example is {}.`,multi_label:r=!1}={}){let i=Array.isArray(e);i||(e=[e]),Array.isArray(t)||(t=[t]);let a=t.map(e=>n.replace(`{}`,e)),o=r||t.length===1,s=[];for(let n of e){let e=[];for(let t of a){let r=this.tokenizer(n,{text_pair:t,padding:!0,truncation:!0}),i=await this.model(r);o?e.push([i.logits.data[this.contradiction_id],i.logits.data[this.entailment_id]]):e.push(i.logits.data[this.entailment_id])}let r=(o?e.map(e=>ol(e)[1]):ol(e)).map((e,t)=>[e,t]).sort((e,t)=>t[0]-e[0]);s.push({sequence:n,labels:r.map(e=>t[e[1]]),scores:r.map(e=>e[0])})}return i?s:s[0]}},MA=class extends yA{async _call(e,{top_k:t=5}={}){let n=this.processor.feature_extractor.config.sampling_rate,r=await _A(e,n),i=this.model.config.id2label,a=[];for(let e of r){let n=await this.processor(e),r=(await this.model(n)).logits[0],o=await iu(new V(`float32`,ol(r.data),r.dims),t),s=o[0].tolist(),c=o[1].tolist().map((e,t)=>({label:i?i[e]:`LABEL_${e}`,score:s[t]}));a.push(c)}return Array.isArray(e)?a:a[0]}},NA=class extends yA{async _call(e,t,{hypothesis_template:n=`This is a sound of {}.`}={}){let r=!Array.isArray(e);r&&(e=[e]);let i=t.map(e=>n.replace(`{}`,e)),a=this.tokenizer(i,{padding:!0,truncation:!0}),o=this.processor.feature_extractor.config.sampling_rate,s=await _A(e,o),c=[];for(let e of s){let n=await this.processor(e),r=ol((await this.model({...a,...n})).logits_per_audio.data);c.push([...r].map((e,n)=>({score:e,label:t[n]})))}return r?c[0]:c}},PA=class extends yA{_default_generation_config={};async _call(e,t={}){switch(t={...this._default_generation_config,...t},this.model.config.model_type){case`whisper`:case`lite-whisper`:return this._call_whisper(e,t);case`wav2vec2`:case`wav2vec2-bert`:case`unispeech`:case`unispeech-sat`:case`hubert`:case`parakeet_ctc`:return this._call_wav2vec2(e,t);case`moonshine`:return this._call_moonshine(e,t);case`cohere_asr`:return this._call_cohere_asr(e,t);default:throw Error(`AutomaticSpeechRecognitionPipeline does not support model type '${this.model.config.model_type}'.`)}}async _call_wav2vec2(e,t){t.language&&A.warn('`language` parameter is not yet supported for `wav2vec2` models, defaulting to "English".'),t.task&&A.warn('`task` parameter is not yet supported for `wav2vec2` models, defaulting to "transcribe".');let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let t=await this.processor(e),n=(await this.model(t)).logits[0],r=[];for(let e of n)r.push(ll(e.data)[1]);let i=this.tokenizer.decode(r,{skip_special_tokens:!0}).trim();o.push({text:i})}return n?o[0]:o}async _call_whisper(e,t){let n=t.return_timestamps??!1,r=t.chunk_length_s??0,i=t.force_full_sequences??!1,a=t.stride_length_s??null,o={...t};n===`word`&&(o.return_token_timestamps=!0,o.return_timestamps=!0);let s=!Array.isArray(e),c=s?[e]:e,l=this.processor.feature_extractor.config,u=l.chunk_length/this.model.config.max_source_positions,d=l.hop_length,f=l.sampling_rate,p=await _A(c,f),m=[];for(let e of p){let t=[];if(r>0){if(a===null)a=r/6;else if(r<=a)throw Error("`chunk_length_s` must be larger than `stride_length_s`.");let n=f*r,i=f*a,o=n-2*i,s=0;for(;;){let r=s+n,a=e.subarray(s,r),c=await this.processor(a),l=s===0,u=r>=e.length;if(t.push({stride:[a.length,l?0:i,u?0:i],input_features:c.input_features,is_last:u}),u)break;s+=o}}else t=[{stride:[e.length,0,0],input_features:(await this.processor(e)).input_features,is_last:!0}];for(let e of t){o.num_frames=Math.floor(e.stride[0]/d);let t=await this.model.generate({inputs:e.input_features,...o});if(n===`word`){let n=t.sequences.tolist()[0],r=t.token_timestamps.tolist()[0],i=this.tokenizer.timestamp_begin,a=Math.max(n.findIndex(e=>Number(e)>=i),0);e.tokens=n.slice(a),e.token_timestamps=r.slice(a).map(e=>hl(e,2))}else e.tokens=t[0].tolist();e.stride=e.stride.map(e=>e/f)}let[s,c]=this.tokenizer._decode_asr(t,{time_precision:u,return_timestamps:n,force_full_sequences:i});m.push({text:s,...c})}return s?m[0]:m}async _call_moonshine(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let n=await this.processor(e),r=Math.floor(e.length/i)*6,a=await this.model.generate({max_new_tokens:r,...t,...n}),s=this.tokenizer.batch_decode(a,{skip_special_tokens:!0})[0];o.push({text:s})}return n?o[0]:o}async _call_cohere_asr(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor,a=i.config.sampling_rate,o=await _A(r,a),s=t.language??`en`,c=this.processor.get_decoder_prompt_ids(s),l=[];for(let e of o){let n=i.split_audio(e),r=[];for(let e of n){let n=await this.processor(e),i=await this.model.generate({...n,decoder_input_ids:c,...t}),a=this.tokenizer.decode(i[0].tolist(),{skip_special_tokens:!0}).trim();r.push(a)}let a=this.processor.constructor.join_chunks(r,s);l.push({text:a})}return n?l[0]:l}},FA=class extends yA{DEFAULT_VOCODER_ID=`Xenova/speecht5_hifigan`;constructor(e){super(e),this.vocoder=e.vocoder??null}async _prepare_speaker_embeddings(e,t){if((typeof e==`string`||e instanceof URL)&&(e=new Float32Array(await(await k.fetch(e)).arrayBuffer())),e instanceof Float32Array)e=new V(`float32`,e,[e.length]);else if(!(e instanceof V))throw Error("Speaker embeddings must be a `Tensor`, `Float32Array`, `string`, or `URL`.");if(t>1){if(e.dims[0]===1)e=e.repeat(t,1);else if(e.dims[0]!==t)throw Error(`Expected speaker embeddings batch size to be 1 or ${t}, but got ${e.dims[0]}.`)}return e}_postprocess_waveform(e,t,n,r=null){let i=t.data,[a,o]=t.dims,s=r?r.data:null,c=[];for(let e=0;e({generated_text:e.trim()}));a.push(r)}return n?a:a[0]}},LA=class extends yA{async _call(e,{top_k:t=5}={}){let n=await gA(e),{pixel_values:r}=await this.processor(n),i=await this.model({pixel_values:r}),{id2label:a}=this.model.config,o=[];for(let e of i.logits){let n=await iu(new V(`float32`,ol(e.data),e.dims),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));o.push(i)}return Array.isArray(e)?o:o[0]}},RA={panoptic:`post_process_panoptic_segmentation`,instance:`post_process_instance_segmentation`,semantic:`post_process_semantic_segmentation`},zA=class extends yA{async _call(e,{threshold:t=.5,mask_threshold:n=.5,overlap_mask_area_threshold:r=.8,label_ids_to_fuse:i=null,target_sizes:a=null,subtask:o=null}={}){if(Array.isArray(e)&&e.length!==1)throw Error(`Image segmentation pipeline currently only supports a batch size of 1.`);let s=await gA(e),c=s.map(e=>[e.height,e.width]),l=await this.processor(s),{inputNames:u,outputNames:d}=this.model.sessions.model;if(!u.includes(`pixel_values`)){if(u.length!==1)throw Error(`Expected a single input name, but got ${u.length} inputs: ${u}.`);let e=u[0];if(e in l)throw Error(`Input name ${e} already exists in the inputs.`);l[e]=l.pixel_values}let f=await this.model(l),p=null;if(o!==null)p=RA[o];else if(this.processor.image_processor){for(let[e,t]of Object.entries(RA))if(t in this.processor.image_processor){p=this.processor.image_processor[t].bind(this.processor.image_processor),o=e;break}}let m=this.model.config.id2label,h=[];if(!o){let e=f[d[0]];for(let t=0;te<-1e-5||e>1.00001)&&r.sigmoid_();let i=await Vf.fromTensor(r.mul_(255).to(`uint8`)).resize(n[1],n[0]);h.push({label:null,score:null,mask:i})}}else if(o===`panoptic`||o===`instance`){let e=p(f,t,n,r,i,a??c)[0],o=e.segmentation;for(let t of e.segments_info){let e=new Uint8ClampedArray(o.data.length);for(let n=0;n{let n=e.clone();return n.putAlpha(r[t].mask),n});return Array.isArray(e)?i:i[0]}},model:[aA,oA,sA],default:{model:`Xenova/modnet`},type:`image`},"zero-shot-image-classification":{pipeline:class extends yA{async _call(e,t,{hypothesis_template:n=`This is a photo of {}`}={}){let r=Array.isArray(e),i=await gA(e),a=t.map(e=>n.replace(`{}`,e)),o=this.tokenizer(a,{padding:this.model.config.model_type!==`siglip`||`max_length`,truncation:!0}),{pixel_values:s}=await this.processor(i),c=await this.model({...o,pixel_values:s}),l=this.model.config.model_type===`siglip`?e=>e.sigmoid().data:e=>ol(e.data),u=[];for(let e of c.logits_per_image){let n=[...l(e)].map((e,n)=>({score:e,label:t[n]}));n.sort((e,t)=>t.score-e.score),u.push(n)}return r?u:u[0]}},model:qk,default:{model:`Xenova/clip-vit-base-patch32`},type:`multimodal`},"object-detection":{pipeline:class extends yA{async _call(e,{threshold:t=.9,percentage:n=!1}={}){let r=Array.isArray(e);if(r&&e.length!==1)throw Error(`Object detection pipeline currently only supports a batch size of 1.`);let i=await gA(e),a=n?null:i.map(e=>[e.height,e.width]),{pixel_values:o,pixel_mask:s}=await this.processor(i),c=await this.model({pixel_values:o,pixel_mask:s}),l=this.processor.image_processor.post_process_object_detection(c,t,a),{id2label:u}=this.model.config,d=l.map(e=>e.boxes.map((t,r)=>({score:e.scores[r],label:u[e.classes[r]],box:vA(t,!n)})));return r?d:d[0]}},model:cA,default:{model:`Xenova/detr-resnet-50`},type:`multimodal`},"zero-shot-object-detection":{pipeline:class extends yA{async _call(e,t,{threshold:n=.1,top_k:r=null,percentage:i=!1}={}){let a=Array.isArray(e),o=await gA(e),s=this.tokenizer(t,{padding:!0,truncation:!0}),c=await this.processor(o),l=[];for(let e=0;e({score:e.scores[n],label:e.labels[n],box:vA(t,!i)}))}else{let e=this.processor.image_processor.post_process_object_detection(f,n,u,!0)[0];p=e.boxes.map((n,r)=>({score:e.scores[r],label:t[e.classes[r]],box:vA(n,!i)}))}p.sort((e,t)=>t.score-e.score),r!==null&&(p=p.slice(0,r)),l.push(p)}return a?l:l[0]}},model:lA,default:{model:`Xenova/owlvit-base-patch32`},type:`multimodal`},"document-question-answering":{pipeline:class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t,n={}){if(Array.isArray(e)){if(e.length!==1)throw Error(`Document Question Answering pipeline currently only supports a batch size of 1.`);e=e[0]}let r=(await gA(e))[0],{pixel_values:i}=await this.processor(r),a=`${t}`,o=this.tokenizer(a,{add_special_tokens:!1,padding:!0,truncation:!0}).input_ids,s=await this.model.generate({inputs:i,max_length:this.model.config.decoder.max_position_embeddings,decoder_input_ids:o,...this._default_generation_config,...n}),c=this.tokenizer.batch_decode(s)[0].match(/(.*?)<\/s_answer>/),l=null;return c&&c.length>=2&&(l=c[1].trim()),[{answer:l}]}},model:fA,default:{model:`Xenova/donut-base-finetuned-docvqa`},type:`multimodal`},"image-to-image":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),r=await this.model(n),i=[];for(let e of r.reconstruction){let t=e.squeeze().clamp_(0,1).mul_(255).round_().to(`uint8`);i.push(Vf.fromTensor(t))}return Array.isArray(e)?i:i[0]}},model:pA,default:{model:`Xenova/swin2SR-classical-sr-x2-64`},type:`image`},"depth-estimation":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),{predicted_depth:r}=await this.model(n),i=[];for(let e=0;et).sort((e,t)=>o[t]-o[e]).slice(0,r).map(e=>({index:e,score:o[e]}))}const WA={amp:`&`,lt:`<`,gt:`>`,quot:`"`,apos:`'`,nbsp:` `,hellip:`…`,mdash:`—`,ndash:`–`,laquo:`«`,raquo:`»`,middot:`·`,deg:`°`,times:`×`,euro:`€`,pound:`£`,reg:`®`,copy:`©`,bull:`•`,trade:`™`,rsquo:`’`,lsquo:`‘`,ldquo:`“`,rdquo:`”`};function GA(e){return typeof e!=`string`||!e?``:e.replace(/<[^>]*>/g,` `).replace(/&#x([0-9a-f]+);/gi,(e,t)=>KA(parseInt(t,16))).replace(/&#(\d+);/g,(e,t)=>KA(parseInt(t,10))).replace(/&([a-z]+);/gi,(e,t)=>WA[t.toLowerCase()]??e).replace(/\s+/g,` `).trim()}function KA(e){return Number.isFinite(e)&&e>0&&e<=1114111?String.fromCodePoint(e):``}function qA(e){return String(e??``).normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}const JA=/* @__PURE__ */ new Set(/* @__PURE__ */ `va.hoac.cua.cho.voi.mot.nung.khong.duoc.de.theo.loai.tinh.gia.thuoc.ve.tai.nha.mat.neu.thi.la.cac.nhan.bi.ra.nay`.split(`.`));function YA(e){let t=[];for(let n of qA(e).split(/[^a-z0-9]+/))n.length>1&&!JA.has(n)&&t.push(n);return t}function $(...e){for(let t of e)if(typeof t==`string`&&t.trim())return GA(t);return``}function XA(e){let t=/* @__PURE__ */ new Set,n=[],r=e=>{if(typeof e!=`string`)return;let r=e.trim();r&&!t.has(r)&&(/^https?:\/\//i.test(r)||/^data:image\//i.test(r))&&(t.add(r),n.push(r))};return Array.isArray(e.imgs)&&e.imgs.forEach(r),Array.isArray(e.images)&&e.images.forEach(r),r(e.i),r(e.image),n}function ZA(e){for(let t of[e.pn,e.salePn,e.priceNum,e.price_number,e.priceNumber]){let e=Number(t);if(Number.isFinite(e)&&e>0)return e}return 0}function QA(e){let t=Math.round(Number(e)||0);return t<=0?``:`${String(t).replace(/\B(?=(\d{3})+(?!\d))/g,`.`)}₫`}function $A(e){return $(e.p,e.priceText,e.price)||QA(ZA(e))}function ej(e){let t=e;if(typeof t==`string`&&t.trim()){let e=t.trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{t=JSON.parse(e)}catch{t=null}else t=null}let n=[];if(Array.isArray(t))for(let e of t)Array.isArray(e)&&e.length>=2?n.push([$(e[0]),$(e[1])]):e&&typeof e==`object`&&n.push([$(e.name,e.key),$(e.value)]);else if(t&&typeof t==`object`)for(let[e,r]of Object.entries(t)){let t=$(r)||(r==null?``:String(r));t&&n.push([$(e),t])}return n.filter(([e,t])=>e&&t)}function tj(e){return(Array.isArray(e.feats)?e.feats:Array.isArray(e.features)?e.features:[]).map(e=>$(e)).filter(Boolean)}function nj(e){if(!e||typeof e!=`object`)return null;let t=$(e.sku,e.mod,e.model,e.SAP),n=$(e.slug),r=$(e.n,e.name,e.title_clean,e.title)||t||n,i=t||n;return!i||!r?null:{sku:i,slug:n,model:$(e.mod,e.model,t),name:r,brand:$(e.brand),category:$(e.c,e.category,e.cs,e.category_slug),link:$(e.l,e.link),price:$A(e),priceNum:ZA(e),images:XA(e),summary:$(e.sum,e.summary,e.description,e.desc),specs:ej(e.specs),feats:tj(e),addedBy:$(e._addedBy,e._source),addedAt:e._added_at||e.addedAt||null}}const rj={"catalogue/products.json":`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_url_added.json`,"catalogue/promos.json":`https://huggingface.co/datasets/bep40/vaistudio-data/resolve/main/promos.json`};let ij=null;function aj(){return import.meta.url.replace(/\/dist\/assets\/[^/]*$/,`/`)}function oj(e){let t=aj(),n=[new URL(`dist/`+e,t).href,new URL(e,t).href];return typeof document<`u`&&document.baseURI&&(n.push(new URL(e.replace(/^catalogue\//,`dist/catalogue/`),document.baseURI).href),n.push(new URL(e,document.baseURI).href)),[...new Set(n)]}async function sj(e){let t=rj[e],n=t?[t,...oj(e)]:oj(e),r;for(let t of n)try{let n={cache:`no-store`};typeof AbortSignal<`u`&&typeof AbortSignal.timeout==`function`&&(n.signal=AbortSignal.timeout(2e4));let i=await fetch(t,n);if(!i.ok){r=/* @__PURE__ */ Error(`HTTP ${i.status}`);continue}let a=await i.text(),o;try{o=JSON.parse(a)}catch{r=/* @__PURE__ */ Error(`body is not valid JSON`);continue}if(Array.isArray(o)?o.length===0&&e.includes(`products`):!o||typeof o!=`object`){r=/* @__PURE__ */ Error(`unexpected shape`);continue}return o}catch(e){r=e}throw Error(`Không tìm thấy ${e} (${r?.message||`không rõ`}). Chạy \`node scripts/sync-catalogue.mjs\` để nhân bản dữ liệu từ vai-avatar vào Space.`)}async function cj(){try{let e=await fetch(`https://huggingface.co/api/datasets/bep40/grob-products-updated/revision/main`,{cache:`no-store`});if(!e.ok)return null;let t=await e.json();return typeof t?.sha==`string`?t.sha:null}catch{return null}}let lj=null,uj=null;async function dj(){let e=await cj();if(e&&ij&&e===ij)return lj;let t=await fetch(`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_with_slugs.json`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=JSON.parse(await t.text());if(!Array.isArray(n)||!n.length)throw Error(`unexpected shape`);return lj=n,ij=e??`len:${n.length}`,n}function fj(){return uj||(uj=dj().catch(e=>{if(lj)return lj;throw e}).finally(()=>{uj=null}),uj)}function pj(e){return $(e.sku,e.mod,e.model).toUpperCase()?0:$(e.slug)?1:2}function mj(e){let t=[],n=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Map;for(let i of vj(Array.isArray(e)?e:[])){if(!i||typeof i!=`object`)continue;let e=$(i.slug).toLowerCase(),a=qA($(i.n,i.name,i.title)).trim(),o=$(i.imgs?.[0],i.i,i.image).split(`?`)[0],s=a&&o?`${a}\u0000${o}`:null;if(!e&&!s)continue;let c=pj(i),l=[];e&&l.push(n.get(e)),s&&l.push(r.get(s));let u=l.find(e=>e!==void 0);if(u&&u.ranke.described)).size===1&&(i.sort((e,t)=>t.images.length-e.images.length),r.set(e,i[0].images));return r}function vj(e){if(!Array.isArray(e))return e;let t=e.filter(gj);if(!t.length)return e;let n=_j(e),r=[],i=0,a=0;for(let t of e){if(!gj(t)){r.push(t);continue}let e=null;for(let r of hj($(t.n,t.name,t.title)))if(n.has(r)){e=n.get(r);break}if(e){r.push({...t,imgs:e,i:e[0],brand:`Malloca`}),i++;continue}r.push({...t,brand:`Malloca`}),a++}return t.length&&console.info(`[catalogue] Malloca misbranding: ${t.length} rows (name says Malloca, brand says otherwise). ${i} swapped to a real Malloca photo, ${a} relabelled, ${t.length-i-a} hidden.`),r}function yj(e){let t=[],n=e=>{let n=$(e).toUpperCase();n&&!t.includes(n)&&t.push(n)};n(e.sku),n(e.mod),n(e.model),n(e.SAP),n(e._source_alias),n(e.slug);let r=qA($(e.n,e.name,e.title_clean,e.title)).replace(/\s+/g,` `).trim();return r.length>8&&n(r),t}const bj=[[`name`,[`n`,`title_clean`,`title`]],[`priceNum`,[`p`,`pn`,`salePn`,`price_number`,`priceNumber`,`price`]],[`description`,[`sum`,`summary`,`desc`]],[`features`,[`feats`]],[`images`,[`imgs`,`i`,`image`]]];function xj(e){let t=e&&e.deleted;return t===!0||t===1||t===`true`||t===`1`}const Sj=[`/eurogold_img/`,`/eurogold_tb_img/`,`/demax_img/`,`/canzy_img/`,`/images/`],Cj=[`huggingface.co/spaces/bep40/v.aistudio`];function wj(e){if(typeof e!=`string`||!e)return!1;let t=e.toLowerCase();return Cj.some(e=>t.includes(e))?Sj.some(e=>t.includes(e)):!1}function Tj(e){return XA(e)[0]||``}function Ej(e){return wj(Tj(e))}function Dj(e,t,n){let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Set;function o(e,t){for(let n of t){if(a.has(n))continue;let t=i.get(n);t===void 0?i.set(n,e):t!==e&&(i.delete(n),a.add(n))}}function s(e,t,n){let i=r.get(e);if(!i){r.set(e,{...t});return}let a=Ej(i),o=Ej(t);if(!a&&o){let a={...i};if(n){for(let[e,r]of n)if(t[e]!==void 0)for(let e of r)delete a[e]}let o=XA(i);r.set(e,{...a,...t,imgs:o});return}let s={...i};if(n){for(let[e,r]of n)if(t[e]!==void 0)for(let e of r)delete s[e]}r.set(e,{...s,...t})}for(let e of Array.isArray(n)?n:[]){if(!e||typeof e!=`object`)continue;let t=yj(e);t.length&&(s(t[0],e),o(t[0],t))}for(let t of Array.isArray(e)?e:[]){if(!t||typeof t!=`object`)continue;let e=yj(t);if(!e.length)continue;let n=e.map(e=>i.get(e)).find(e=>e!==void 0)??e[0];s(n,t,bj),o(n,e)}let c=t&&typeof t==`object`&&t.productEdits&&typeof t.productEdits==`object`?t.productEdits:{};for(let[e,t]of Object.entries(c)){if(!t||typeof t!=`object`)continue;let n=yj(t),r=$(e).toUpperCase();if(!n.length&&!r)continue;let a=[...n,r].map(e=>i.get(e)).find(e=>e!==void 0)??r;s(a,t,bj),o(a,[...n,r])}let l=/* @__PURE__ */ new Map;for(let[e,t]of r){if(xj(t))continue;let n=nj(t);n&&l.set(e,n)}return kj(l),l}const Oj={EPD4635VX:`EPD4635`,EUM101:`EUM101L`,ETW8080VX:`ETW8080`,ETW8090VX:`ETW8090`,EUC87848EB:`EUC87848GA`,EUC88050GA:`EUC88050GE`,EAS1200G:`EAS1200`,EAS1200P:`EAS1200`,ETT103B:`ETT01B`,ETT103M:`ETT01B`};function kj(e){if(e)for(let[t,n]of e){let r=Array.isArray(n.images)?n.images[0]:``;if(!r||!wj(r))continue;let i=Oj[t.toUpperCase()];if(!i){let e=r.split(`/`).pop().replace(/\.[a-z0-9]+$/i,``).toUpperCase();e&&e!==t.toUpperCase()&&(i=e)}if(!i)continue;let a=e.get(i);if(!a)continue;let o=Array.isArray(a.images)?a.images[0]:``;o&&!wj(o)&&(n.images=[o,...n.images.filter(e=>!wj(e))])}}function Aj(e){let t=2166136261,n=e=>{let n=String(e);for(let e=0;e>>0).toString(36)}-${e.size}`}let jj=null,Mj=null;function Nj(){return Mj||(Mj=(async()=>{let[e,t,n]=await Promise.all([sj(`catalogue/products.json`),sj(`catalogue/promos.json`).then(e=>(jj=e,e)).catch(()=>jj??{}),fj().then(e=>mj(e)).catch(()=>lj?mj(lj):[])]),r=Dj(e,t,n);return{items:r,signature:Aj(r),syncedAt:Date.now(),partial:!n.length}})().finally(()=>{Mj=null}),Mj)}async function Pj(){try{return await Nj()}catch{return null}}const Fj={name:6,model:4,brand:3,category:3,summary:1,feats:1,specs:1};function Ij(e){let t={name:YA(e.name),model:YA(e.model),brand:YA(e.brand),category:YA(e.category),summary:YA(e.summary.slice(0,600)),feats:e.feats.flatMap(YA),specs:e.specs.flatMap(([e,t])=>YA(e).concat(YA(t)))},n=/* @__PURE__ */ new Map;for(let[e,r]of Object.entries(Fj))for(let i of new Set(t[e]||[]))(n.get(i)||0)2&&e.length>2&&(r.startsWith(e)||e.startsWith(r))&&(n=Math.max(n,i*.7));n&&(o+=n,s++)}s&&(o*=.55+.45*(s/r.length),i.length>3&&n.includes(i)&&(o*=1.35),a.push({sku:e.sku,score:o,product:e}))}return a.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),a.slice(0,n)}const Bj=qA;function Vj(e){return Bj(e).split(/\s+/).filter(e=>e.length>1)}const Hj=[`inox 304`,`inox sus304`,`inox304`,`inox`,`sus304`,`sus 304`,`nan oval`,`nan vuông`,`nan tron`,`nan dẹt`,`nan det`,`khung nhôm`,`nhôm`,`hợp kim`,`kính`,`gốm`,`đá granite`,`da granite`,`mây`,`thép`,`gang`,`nhựa abs`,`abs`,`thủy tinh`],Uj=[`malloca`,`eurogold`,`grob`,`canzy`,`demax`,`sunhouse`,`kangaroo`,`sharp`,`toshiba`,`panasonic`,`samsung`,`lg`,`electrolux`,`bosch`,`fischer`],Wj={ke:[`gia`],gia:[`ke`]};function Gj(e,t){if(e.includes(t))return!0;let n=Wj[t];if(!n)return!1;for(let t of n)if(e.includes(t))return!0;return!1}function Kj(e){let t=/* @__PURE__ */ new Set,n=/(\d{1,4})\s*mm/gi,r=/[wdh]\s*[:=]?\s*(\d{1,4})/gi,i;for(;i=n.exec(e);)t.add(parseInt(i[1],10));for(;i=r.exec(e);)t.add(parseInt(i[1],10));return t}function qj(e){let t=Bj((e.specs||[]).map(([e,t])=>`${e} ${t}`).join(` `));return{name:Bj(e.name||``),sku:Bj(e.model||e.sku||``),brand:Bj(e.brand||``),category:Bj(e.category||``),summary:Bj(e.summary||``),feats:Bj((e.feats||[]).join(` `)),specsText:t}}function Jj(e,t,n){let{name:r,sku:i,brand:a,category:o,summary:s,feats:c,specsText:l}=qj(e),u=Bj(String(t||``).trim()),d=0,f=u.replace(/[^a-z0-9]/g,``),p=r.replace(/[^a-z0-9]/g,``),m=i.replace(/[^a-z0-9]/g,``);f.length>=4&&(m===f?d+=1e3:p===f?d+=900:p.includes(f)||m.includes(f)?d+=550:m.length>=Math.max(5,f.length/2)&&f.includes(m)&&(d+=400));let h=n.filter(e=>e.length>1&&!/^\d{2,4}mm/.test(e));h.length&&h.every(e=>Gj(r,e))&&(d+=300);let g=[r,a,o,Bj(e.summary||``),c,l].join(` `),_=String(t||``).trim();r===_?d+=200:i===_?d+=180:r.includes(_)?d+=100:i.includes(_)?d+=80:g.includes(_)&&(d+=50);let v=Kj(`${r} ${l} ${Bj(e.summary||``)} ${c} ${s}`),y=Kj(_);[...y].some(e=>v.has(e))?r.includes(_)?d+=40:r.split(` `).some(e=>/^\d{1,4}mm$/i.test(e))?d+=55:d+=l===``?40:50:y.size&&(d-=10);for(let e of n.filter(e=>/^\d{2,4}\s*mm$/.test(e))){let t=e.replace(/\s+/g,``);r.includes(t)?d+=60:i.includes(t)?d+=40:g.includes(t)&&(d+=25)}for(let t of Hj){let n=Bj(t);if(u.includes(n)&&(r.includes(n)||l.includes(n)||Bj(e.summary||``).includes(n))){d+=30;break}}let b=0,x=n.filter(e=>e.length>1&&!/^\d{2,4}\s*mm$/.test(e));for(let e of x)Gj(r,e)?(d+=16,b++):i.includes(e)?d+=12:a.includes(e)?d+=8:o.includes(e)?d+=10:g.includes(e)&&(d+=3);b>=2?d+=35:b===1&&x.length>=2&&(d+=10);for(let e of x)o.includes(e)&&(d+=6);for(let e of Uj)u.includes(e)&&a.includes(e)&&(d+=50);return d}function Yj(e,t,n=24){let r=Vj(e);if(!r.length||!t?.size)return[];let i=[];for(let n of t.values()){let t=Jj(n,String(e||``).trim(),r);t>=24&&i.push({sku:n.sku,score:t,product:n})}if(i.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),i.length>1){let e=/* @__PURE__ */ new Map;for(let t of i)e.has(t.score)||e.set(t.score,[]),e.get(t.score).push(t);let t=Array.from(e.keys()).sort((e,t)=>t-e),n=[];for(let r of t){let t=e.get(r),i=/* @__PURE__ */ new Map;for(let e of t){let t=(e.product?.brand||``).toLowerCase()||`unknown`;i.has(t)||i.set(t,[]),i.get(t).push(e)}let a=!0;for(;a;){a=!1;for(let e of i.values())e.length&&(n.push(e.shift()),a=!0)}}i.length=0,i.push(...n)}return i.slice(0,n)}function Xj(e){let t=String(e?.image_id||``).trim();return t?`https://bep40-vai-avatar2-interior-api.hf.space/image/${encodeURIComponent(t)}.jpg`:``}function Zj(e){return String(e??``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}function Qj(e){let t=String(e?.image_id||``).trim();if(!t)return null;let n=Xj(e);if(!n)return null;let r=String(e.desc||e.alt||(e.post_titles||[])[0]||``).trim(),i=[].concat(e.categories||[],e.room_hints||[],e.labels||[]).map(e=>String(e||``).trim()).filter(Boolean),a=(e.keywords||[]).map(e=>String(e||``).trim()).filter(Boolean),o=Number(e.w),s=Number(e.h),c=Number.isFinite(o)&&Number.isFinite(s)&&o>0&&s>0?o/s:1;return{sku:`avatarimg:${t}`,avatarImageId:t,title:r,name:r,description:String(e.desc||``).trim(),categories:i,keywords:a,source:String(e.source||``).trim(),link:String((e.post_urls||[])[0]||``).trim(),ar:Math.max(.5,Math.min(2,c)),images:[n],src:n,addedAt:String(e.created_at||``).trim()}}async function $j(e=60){try{let t=await fetch(`https://huggingface.co/datasets/bep40/vai-avatar2-interior/resolve/main/index.json`,{cache:`no-cache`});if(!t.ok)return[];let n=await t.json();if(!Array.isArray(n))return[];let r=n.filter(e=>e&&typeof e.created_at==`string`&&e.created_at).sort((e,t)=>e.created_att.created_at?-1:0).slice(0,200),i=[];for(let e of r){let t=Qj(e);t&&i.push(t)}return i.sort((e,t)=>e.addedAtt.addedAt?-1:0),i.slice(0,e)}catch{return[]}}function eM(e,t,n=60){let r=Zj(String(e||``).trim());if(r.length<2||!t?.length)return[];let i=r.split(/\s+/).filter(e=>e.length>1),a=[];for(let e of t){let t=Zj([e.title,e.description,...e.categories||[],...e.keywords||[]].join(` `)),n=0;r.length>=3&&t.includes(r)&&(n+=900);let o=0;for(let e of i)t.includes(e)&&(n+=25,o++);o&&(n+=o*10,!(n<900&&n<60)&&a.push({...e,score:n}))}return a.sort((e,t)=>t.score-e.score||(e.addedAtself.postMessage(e);function aM(){return tM??=(async()=>{iM({status:`loading`,label:`Đang tải mô hình tìm kiếm`});let[e,t,n,r]=await Promise.all([W.from_pretrained(`sentence-transformers/clip-ViT-B-32-multilingual-v1`),ev.from_pretrained(`bep40/clip-vit-b32-multilingual-vi-text`,{dtype:`fp32`,device:`wasm`,revision:`9e1d53553228b17abfe6986fbe92e22bd6bd6bad`,progress_callback:e=>{e.status===`progress`&&e.file?.endsWith(`.onnx`)&&iM({status:`loading`,label:`Đang tải mô hình tìm kiếm`,progress:e.progress})}}),VA(BA+`image-embeddings.json`).then(e=>JSON.parse(new TextDecoder().decode(e))),VA(BA+`image-embeddings_25k-512-32bit.bin`)]),i=new Float32Array(r);if(i.length!==n.length*512)throw Error(`The image database and embeddings do not match.`);return HA(i,512),iM({status:`loading`,label:`Đang khởi động tìm kiếm`,progress:100}),await t(e(`a photograph`,{padding:!0,truncation:!0})),iM({status:`ready`,count:n.length}),{tokenizer:e,model:t,metadata:n,embeddings:i}})().catch(e=>{throw tM=null,e})}async function oM(){if(!rM){rM=!0;try{let{tokenizer:e,model:t,metadata:n,embeddings:r}=await aM();for(;nM;){let i=nM;nM=null;let a=performance.now();try{let{text_embeds:o}=await t(e(i.text,{padding:!0,truncation:!0}));if(nM)continue;let s=UA(o.data,r,512,96).map(({index:e,score:t})=>({...n[e],score:t}));iM({status:`complete`,id:i.id,text:i.text,output:s,elapsed:performance.now()-a})}catch(e){iM({status:`error`,id:i.id,message:e.message})}}}catch(e){iM({status:`error`,id:nM?.id,message:e.message}),nM=null}finally{rM=!1}}}let sM=null;function cM(){return sM??Nj().then(e=>(sM=e,e))}async function lM(e=!1){let t=e?await Nj():await Pj();return t&&(sM=t),t}let uM=null,dM=``,fM=``;async function pM(){return uM||(uM=await $j(60),dM=uM.map(e=>e.avatarImageId).join(`,`),uM)}async function mM(){let e=await $j(60),t=e.map(e=>e.avatarImageId).join(`,`),{items:n}=await cM().catch(()=>({items:null})),r=n?hM(n):[],i=r.map(e=>e.sku+`@`+(e.addedAt||``)).join(`,`),a=t!==dM||i!==fM;uM=e,dM=t,fM=i,iM({status:`avatar-updated`,items:e,signature:t,changed:a,count:e.length,recentProducts:r})}function hM(e){if(!e?.size)return[];let t=[];for(let n of e.values())n?.addedAt&&Array.isArray(n.images)&&n.images.some(e=>typeof e==`string`&&/^(https?:\/\/|data:image\/)/i.test(e))&&t.push({...n,score:1});return t.sort((e,t)=>String(t.addedAt||``).localeCompare(String(e.addedAt||``))),t.slice(0,12)}async function gM(e,t,n){let r=performance.now();try{iM({status:`products-loading`});let{items:i,signature:a}=await cM(),o=Yj(e,i,n),s=zj(e,i,n),c=eM(e,await pM());iM({status:`products-complete`,id:t,text:e,output:o,legacy:s,interiors:c,signature:a,count:i.size,elapsed:performance.now()-r})}catch(e){iM({status:`products-error`,id:t,message:e.message})}}self.addEventListener(`message`,({data:e})=>{e.type===`init`?(aM().catch(e=>iM({status:`error`,message:e.message})),cM().catch(()=>{}),mM().catch(()=>{})):e.type===`search`?(nM={id:e.id,text:e.text},oM()):e.type===`search-products`?gM(e.text,e.id,e.limit??48):e.type===`refresh-catalogue`?(lM(e.force===!0).then(e=>e&&iM({status:`catalogue-updated`,signature:e.signature,count:e.items.size,syncedAt:e.syncedAt})).catch(e=>iM({status:`catalogue-error`,message:e.message})),mM().catch(()=>{})):e.type===`clear`&&(nM=null)}); \ No newline at end of file diff --git a/dist/assets/worker-Bz7I_x9L.js b/dist/assets/worker-DHCTNpZY.js similarity index 53% rename from dist/assets/worker-Bz7I_x9L.js rename to dist/assets/worker-DHCTNpZY.js index 8dc864d01b8aa0d75926df5a5bad4224a67ae5c2..ac3e50951c3be6be2d3698c3c3f4081fa55cdba0 100644 --- a/dist/assets/worker-Bz7I_x9L.js +++ b/dist/assets/worker-DHCTNpZY.js @@ -18,11 +18,11 @@ e)).default,nt=(Ge(),f(Ve)).default,rt=async()=>{if(!Ye)throw Error(`Failed to l `));case`join`:case`string`:return e;case`int`:{let t=parseInt(e.value,10);return new M(isNaN(t)?0:t)}case`float`:{let t=parseFloat(e.value);return new N(isNaN(t)?0:t)}default:throw Error(`Unknown StringValue filter: ${r.value}`)}else if(e instanceof M||e instanceof N)switch(r.value){case`abs`:return e instanceof M?new M(Math.abs(e.value)):new N(Math.abs(e.value));case`int`:return new M(Math.floor(e.value));case`float`:return new N(e.value);case`string`:return new P(e.toString());default:throw Error(`Unknown NumericValue filter: ${r.value}`)}else if(e instanceof Ms)switch(r.value){case`items`:return new I(Array.from(e.value.entries()).map(([e,t])=>new I([new P(e),t])));case`length`:return new M(e.value.size);default:{let t=e.builtins.get(r.value);if(t)return t instanceof L?t.value([],n):t;throw Error(`Unknown ObjectValue filter: ${r.value}`)}}else if(e instanceof F)switch(r.value){case`bool`:return new F(e.value);case`int`:return new M(+!!e.value);case`float`:return new N(+!!e.value);case`string`:return new P(e.value?`true`:`false`);default:throw Error(`Unknown BooleanValue filter: ${r.value}`)}throw Error(`Cannot apply filter "${r.value}" to type: ${e.type}`)}if(t.type===`CallExpression`){let r=t;if(r.callee.type!==`Identifier`)throw Error(`Unknown filter: ${r.callee.type}`);let i=r.callee.value;if(i===`tojson`){let[,t]=this.evaluateArguments(r.args,n),i=t.get(`indent`)??new R;if(!(i instanceof M||i instanceof R))throw Error(`If set, indent must be a number`);let a=t.get(`ensure_ascii`)??new F(!1);if(!(a instanceof F))throw Error(`If set, ensure_ascii must be a boolean`);let o=t.get(`sort_keys`)??new F(!1);if(!(o instanceof F))throw Error(`If set, sort_keys must be a boolean`);let s=t.get(`separators`)??new R,c=null;if(s instanceof I||s instanceof Fs){if(s.value.length!==2)throw Error(`separators must be a tuple of two strings`);let[e,t]=s.value;if(!(e instanceof P)||!(t instanceof P))throw Error(`separators must be a tuple of two strings`);c=[e.value,t.value]}else if(!(s instanceof R))throw Error(`If set, separators must be a tuple of two strings`);return new P(js(e,{indent:i.value,ensureAscii:a.value,sortKeys:o.value,separators:c}))}if(i===`join`){let t;if(e instanceof P)t=Array.from(e.value);else if(e instanceof I)t=e.value.map(e=>e.value);else throw Error(`Cannot apply filter "${i}" to type: ${e.type}`);let[a,o]=this.evaluateArguments(r.args,n),s=a.at(0)??o.get(`separator`)??new P(``);if(!(s instanceof P))throw Error(`separator must be a string`);return new P(t.join(s.value))}if(i===`int`||i===`float`){let[t,a]=this.evaluateArguments(r.args,n),o=t.at(0)??a.get(`default`)??(i===`int`?new M(0):new N(0));if(e instanceof P){let t=i===`int`?parseInt(e.value,10):parseFloat(e.value);return isNaN(t)?o:i===`int`?new M(t):new N(t)}if(e instanceof M||e instanceof N)return e;if(e instanceof F)return i===`int`?new M(+!!e.value):new N(+!!e.value);throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}if(i==="default"){let[t,i]=this.evaluateArguments(r.args,n),a=t[0]??new P(``),o=t[1]??i.get(`boolean`)??new F(!1);if(!(o instanceof F))throw Error("`default` filter flag must be a boolean");return e instanceof z||o.value&&!e.__bool__().value?a:e}if(e instanceof I){switch(i){case`sort`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);let o=t.at(1)??i.get(`case_sensitive`)??new F(!1);if(!(o instanceof F))throw Error(`case_sensitive must be a boolean`);let s=t.at(2)??i.get(`attribute`)??new R;if(!(s instanceof P||s instanceof M||s instanceof R))throw Error(`attribute must be a string, integer, or null`);let c=e=>s instanceof R?e:Us(e,s instanceof M?String(s.value):s.value);return new I(e.value.slice().sort((e,t)=>{let n=Ws(c(e),c(t),o.value);return a.value?-n:n}))}case`selectattr`:case`rejectattr`:{let t=i===`selectattr`;if(e.value.some(e=>!Bs(e)))throw Error(`\`${i}\` can only be applied to array of objects`);if(r.args.some(e=>e.type!==`StringLiteral`))throw Error(`arguments of \`${i}\` must be strings`);let[a,o,s]=r.args.map(e=>this.evaluate(e,n)),c;if(o){let e=n.tests.get(o.value);if(!e)throw Error(`Unknown test: ${o.value}`);c=e}else c=(...e)=>e[0].__bool__().value;return new I(e.value.filter(e=>{let n=e.value.get(a.value),r=n?c(n,s):!1;return t?r:!r}))}case`map`:{let[,t]=this.evaluateArguments(r.args,n);if(t.has(`attribute`)){let n=t.get(`attribute`);if(!(n instanceof P))throw Error(`attribute must be a string`);let r=t.get(`default`);return new I(e.value.map(e=>{if(!Bs(e))throw Error(`items in map must be an object`);let t=Us(e,n.value);return t instanceof z?r??new z:t}))}throw Error("`map` expressions without `attribute` set are not currently supported.")}}throw Error(`Unknown ArrayValue filter: ${i}`)}if(e instanceof P){switch(i){case`indent`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`width`)??new M(4);if(!(a instanceof M))throw Error(`width must be a number`);let o=t.at(1)??i.get(`first`)??new F(!1),s=t.at(2)??i.get(`blank`)??new F(!1),c=e.value.split(` `),l=` `.repeat(a.value);return new P(c.map((e,t)=>!o.value&&t===0||!s.value&&e.length===0?e:l+e).join(` `))}case`replace`:{let t=e.builtins.get(`replace`);if(!(t instanceof L))throw Error(`replace filter not available`);let[i,a]=this.evaluateArguments(r.args,n);return t.value([...i,new Ns(a)],n)}}throw Error(`Unknown StringValue filter: ${i}`)}if(e instanceof Ms){let t=e.builtins.get(i);if(t&&t instanceof L){let[e,i]=this.evaluateArguments(r.args,n);return i.size>0&&e.push(new Ns(i)),t.value(e,n)}throw Error(`Unknown ObjectValue filter: ${i}`)}throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}throw Error(`Unknown filter: ${t.type}`)}evaluateFilterExpression(e,t){let n=this.evaluate(e.operand,t);return this.applyFilter(n,e.filter,t)}evaluateTestExpression(e,t){let n=this.evaluate(e.operand,t),r=t.tests.get(e.test.value);if(!r)throw Error(`Unknown test: ${e.test.value}`);let i=r(n);return new F(e.negate?!i:i)}evaluateSelectExpression(e,t){return this.evaluate(e.test,t).__bool__().value?this.evaluate(e.lhs,t):new z}evaluateUnaryExpression(e,t){let n=this.evaluate(e.argument,t);switch(e.operator.value){case`not`:return new F(!n.value);case`+`:case`-`:{let t=e.operator.value===`-`?-1:1;if(n instanceof M||n instanceof N||n instanceof F){let e=t*(n instanceof F?+!!n.value:n.value);return n instanceof N?new N(e):new M(e)}throw SyntaxError(`Unknown operator "${e.operator.value}" for ${n.type}`)}default:throw SyntaxError(`Unknown operator: ${e.operator.value}`)}}evaluateTernaryExpression(e,t){return this.evaluate(e.condition,t).__bool__().value?this.evaluate(e.trueExpr,t):this.evaluate(e.falseExpr,t)}evalProgram(e,t){return this.evaluateBlock(e.body,t)}evaluateBlock(e,t){let n=``;for(let r of e){let e=this.evaluate(r,t);e.type!==`NullValue`&&e.type!==`UndefinedValue`&&(n+=e.toString())}return new P(n)}evaluateIdentifier(e,t){return t.lookupVariable(e.value)}evaluateCallExpression(e,t){let[n,r]=this.evaluateArguments(e.args,t);r.size>0&&n.push(new Ns(r));let i=this.evaluate(e.callee,t);if(i.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${i.type}`);return i.value(n,t)}evaluateSliceExpression(e,t,n){if(!(e instanceof I||e instanceof P))throw Error(`Slice object must be an array or string`);let r=this.evaluate(t.start,n),i=this.evaluate(t.stop,n),a=this.evaluate(t.step,n);if(!(r instanceof M||r instanceof z))throw Error(`Slice start must be numeric or undefined`);if(!(i instanceof M||i instanceof z))throw Error(`Slice stop must be numeric or undefined`);if(!(a instanceof M||a instanceof z))throw Error(`Slice step must be numeric or undefined`);return e instanceof I?new I(ys(e.value,r.value,i.value,a.value)):new P(ys(Array.from(e.value),r.value,i.value,a.value).join(``))}evaluateMemberExpression(e,t){let n=this.evaluate(e.object,t),r;if(e.computed){if(e.property.type===`SliceExpression`)return this.evaluateSliceExpression(n,e.property,t);r=this.evaluate(e.property,t)}else r=e.property.type===`IntegerLiteral`?new M(e.property.value):new P(e.property.value);let i;if(Bs(n)){if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.value.get(r.value)??(n instanceof Ms?n.builtins.get(r.value):void 0)}else if(n instanceof I||n instanceof P){if(r instanceof M)i=n.value.at(r.value),n instanceof P&&(i=new P(n.value.at(r.value)));else if(r instanceof P)i=n.builtins.get(r.value);else throw Error(`Cannot access property with non-string/non-number: got ${r.type}`)}else{if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.builtins.get(r.value)}return i instanceof Os?i:new z}evaluateSet(e,t){let n=e.value?this.evaluate(e.value,t):this.evaluateBlock(e.body,t);if(e.assignee.type===`Identifier`){let r=e.assignee.value;t.setVariable(r,n)}else if(e.assignee.type===`TupleLiteral`){let r=e.assignee;if(!(n instanceof I))throw Error(`Cannot unpack non-iterable type in set: ${n.type}`);let i=n.value;if(i.length!==r.value.length)throw Error(`Too ${r.value.length>i.length?`few`:`many`} items to unpack in set`);for(let e=0;et.setVariable(e.loopvar.value,c);else if(e.loopvar.type===`TupleLiteral`){let t=e.loopvar;if(c.type!==`ArrayValue`)throw Error(`Cannot unpack non-iterable type: ${c.type}`);let n=c;if(t.value.length!==n.value.length)throw Error(`Too ${t.value.length>n.value.length?`few`:`many`} items to unpack`);l=e=>{for(let r=0;r0?a[t-1]:new z],[`nextitem`,t0)throw Error(`macro ${e} takes no keyword argument '${o.keys().next().value}'`);if(n.has(`varargs`))i.setVariable(`varargs`,new I(a.slice(t.length)));else if(a.length>t.length)throw Error(`macro ${e} takes not more than ${t.length} argument(s)`);for(let[e,t]of s)i.setVariable(e,this.evaluate(t,i))}evaluateMacro(e,t){let n=qs(e.args,e.body);return t.setVariable(e.name.value,new L((t,r)=>{let i=new Rs(r);return this.bindMacroArguments(`'${e.name.value}'`,e.args,n,t,i),this.evaluateBlock(e.body,i)})),new R}evaluateCallStatement(e,t){let n=e.callerArgs??[],r=qs(n,e.body),i=new L(i=>{let a=new Rs(t);return this.bindMacroArguments(`None`,n,r,i,a),this.evaluateBlock(e.body,a)}),[a,o]=this.evaluateArguments(e.call.args,t);a.push(new Ns(o));let s=this.evaluate(e.call.callee,t);if(s.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${s.type}`);let c=new Rs(t);return c.setVariable(`caller`,i),s.value(a,c)}evaluateFilterStatement(e,t){let n=this.evaluateBlock(e.body,t);return this.applyFilter(n,e.filter,t)}evaluate(e,t){if(!e)return new z;switch(e.type){case`Program`:return this.evalProgram(e,t);case`Set`:return this.evaluateSet(e,t);case`If`:return this.evaluateIf(e,t);case`For`:return this.evaluateFor(e,t);case`Macro`:return this.evaluateMacro(e,t);case`CallStatement`:return this.evaluateCallStatement(e,t);case`Break`:throw new Ts;case`Continue`:throw new Es;case`IntegerLiteral`:return new M(e.value);case`FloatLiteral`:return new N(e.value);case`StringLiteral`:return new P(e.value);case`ArrayLiteral`:return new I(e.value.map(e=>this.evaluate(e,t)));case`TupleLiteral`:return new Fs(e.value.map(e=>this.evaluate(e,t)));case`ObjectLiteral`:{let n=/* @__PURE__ */ new Map;for(let[r,i]of e.value){let e=this.evaluate(r,t);if(!(e instanceof P))throw Error(`Object keys must be strings: got ${e.type}`);n.set(e.value,this.evaluate(i,t))}return new Ms(n)}case`Identifier`:return this.evaluateIdentifier(e,t);case`CallExpression`:return this.evaluateCallExpression(e,t);case`MemberExpression`:return this.evaluateMemberExpression(e,t);case`UnaryExpression`:return this.evaluateUnaryExpression(e,t);case`BinaryExpression`:return this.evaluateBinaryExpression(e,t);case`FilterExpression`:return this.evaluateFilterExpression(e,t);case`FilterStatement`:return this.evaluateFilterStatement(e,t);case`TestExpression`:return this.evaluateTestExpression(e,t);case`SelectExpression`:return this.evaluateSelectExpression(e,t);case`Ternary`:return this.evaluateTernaryExpression(e,t);case`Comment`:return new R;default:throw SyntaxError(`Unknown node type: ${e.type}`)}}};function Ys(e){switch(typeof e){case`number`:return Number.isInteger(e)?new M(e):new N(e);case`string`:return new P(e);case`boolean`:return new F(e);case`undefined`:return new z;case`object`:return e===null?new R:Array.isArray(e)?new I(e.map(Ys)):new Ms(new Map(Object.entries(e).map(([e,t])=>[e,Ys(t)])));case`function`:return new L((t,n)=>Ys(e(...t.map(e=>e.value))??null));default:throw Error(`Cannot convert to runtime value: ${e}`)}}var Xs=` -`,Zs=`{%- `,Qs=` -%}`,$s=Object.freeze({CONDITIONAL:0,LOGICAL_OR:1,LOGICAL_AND:2,LOGICAL_NOT:3,COMPARISON:4,ADDITIVE:5,MULTIPLICATIVE:6,EXPONENTIATION:7,TEST:8,FILTER:9,UNARY_SIGN:10,ATOM:11});function ec(e){switch(e.operator.type){case`ExponentiationBinaryOperator`:return $s.EXPONENTIATION;case`MultiplicativeBinaryOperator`:return $s.MULTIPLICATIVE;case`AdditiveBinaryOperator`:return $s.ADDITIVE;case`ComparisonBinaryOperator`:return $s.COMPARISON;case`Identifier`:return e.operator.value===`and`?$s.LOGICAL_AND:e.operator.value===`in`||e.operator.value===`not in`?$s.COMPARISON:$s.LOGICAL_OR}return $s.LOGICAL_OR}function tc(e){switch(e.type){case`SelectExpression`:case`Ternary`:return $s.CONDITIONAL;case`BinaryExpression`:return ec(e);case`UnaryExpression`:return e.operator.value===`not`?$s.LOGICAL_NOT:$s.UNARY_SIGN;case`TestExpression`:return $s.TEST;case`FilterExpression`:return $s.FILTER;default:return $s.ATOM}}function nc(e,t){let n=B(e);return tc(e)sc(e,t,n)).join(Xs)}function oc(e){return e.map(e=>B(e)).join(`, `)}function sc(e,t,n){let r=n.repeat(t);switch(e.type){case`Program`:return ac(e.body,t,n);case`If`:return cc(e,t,n);case`For`:return lc(e,t,n);case`Set`:return uc(e,t,n);case`Macro`:return dc(e,t,n);case`Break`:return r+ic(`break`);case`Continue`:return r+ic(`continue`);case`CallStatement`:return fc(e,t,n);case`FilterStatement`:return pc(e,t,n);case`Comment`:return r+`{# `+e.value+` #}`;default:return r+`{{- `+B(e)+` -}}`}}function cc(e,t,n){let r=n.repeat(t),i=[],a=e;for(;a&&(i.push({test:a.test,body:a.body}),a.alternate.length===1&&a.alternate[0].type===`If`);)a=a.alternate[0];let o=r+ic(`if`,B(i[0].test))+Xs+ac(i[0].body,t+1,n);for(let e=1;e0&&(o+=Xs+r+ic(`else`)+Xs+ac(a.alternate,t+1,n)),o+=Xs+r+ic(`endif`),o}function lc(e,t,n){let r=n.repeat(t),i=``;if(e.iterable.type===`SelectExpression`){let t=e.iterable;i=`${B(t.lhs)} if ${B(t.test)}`}else i=B(e.iterable);let a=r+ic(`for`,B(e.loopvar),`in`,i)+Xs+ac(e.body,t+1,n);return e.defaultBlock.length>0&&(a+=Xs+r+ic(`else`)+Xs+ac(e.defaultBlock,t+1,n)),a+=Xs+r+ic(`endfor`),a}function uc(e,t,n){let r=n.repeat(t),i=B(e.assignee),a=e.value?B(e.value):``,o=r+ic(`set`,`${i}${e.value?` = `+a:``}`);return e.body.length===0?o:o+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endset`)}function dc(e,t,n){let r=n.repeat(t),i=oc(e.args);return r+ic(`macro`,`${e.name.value}(${i})`)+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endmacro`)}function fc(e,t,n){let r=n.repeat(t),i=e.callerArgs&&e.callerArgs.length>0?`(${oc(e.callerArgs)})`:``,a=B(e.call),o=r+ic(`call${i}`,a)+Xs;return o+=ac(e.body,t+1,n)+Xs,o+=r+ic(`endcall`),o}function pc(e,t,n){let r=n.repeat(t),i=r+ic(`filter`,e.filter.type===`Identifier`?e.filter.value:B(e.filter))+Xs;return i+=ac(e.body,t+1,n)+Xs,i+=r+ic(`endfilter`),i}function B(e){switch(e.type){case`SpreadExpression`:return`*${B(e.argument)}`;case`KeywordSpreadExpression`:return`**${B(e.argument)}`;case`Identifier`:return e.value;case`IntegerLiteral`:return`${e.value}`;case`FloatLiteral`:{let t=e.value;return Object.is(t,-0)?`-0.0`:t%1==0?t.toFixed(1):t.toString()}case`StringLiteral`:return JSON.stringify(e.value);case`BinaryExpression`:{let t=e,n=ec(t),r=nc(t.left,n),i=nc(t.right,n+1);return`${r} ${t.operator.value} ${i}`}case`UnaryExpression`:{let t=e,n=t.argument.type===`UnaryExpression`?tc(t):$s.ATOM;return t.operator.value+(t.operator.value===`not`?` `:``)+nc(t.argument,n)}case`CallExpression`:{let t=e,n=oc(t.args);return`${B(t.callee)}(${n})`}case`MemberExpression`:{let t=e,n=nc(t.object,$s.ATOM),r=B(t.property);return!t.computed&&t.property.type!==`Identifier`&&t.property.type!==`IntegerLiteral`&&(r=`(${r})`),t.computed?`${n}[${r}]`:`${n}.${r}`}case`FilterExpression`:{let t=e,n=nc(t.operand,$s.FILTER);return t.filter.type===`CallExpression`?`${n} | ${B(t.filter)}`:`${n} | ${t.filter.value}`}case`SelectExpression`:{let t=e;return`${nc(t.lhs,$s.LOGICAL_OR)} if ${nc(t.test,$s.LOGICAL_OR)}`}case`TestExpression`:{let t=e;return`${nc(t.operand,$s.TEST)} is${t.negate?` not`:``} ${t.test.value}`}case`ArrayLiteral`:case`TupleLiteral`:{let t=oc(e.value),n=e.type===`ArrayLiteral`?`[]`:`()`;return`${n[0]}${t}${n[1]}`}case`ObjectLiteral`:return`{${Array.from(e.value.entries()).map(([e,t])=>`${B(e)}: ${B(t)}`).join(`, `)}}`;case`SliceExpression`:{let t=e;return`${t.start?B(t.start):``}:${t.stop?B(t.stop):``}${t.step?`:${B(t.step)}`:``}`}case`KeywordArgumentExpression`:{let t=e;return`${t.key.value}=${B(t.value)}`}case`Ternary`:{let t=e;return`${nc(t.trueExpr,$s.LOGICAL_OR)} if ${nc(t.condition,$s.LOGICAL_OR)} else ${nc(t.falseExpr,$s.CONDITIONAL)}`}default:throw Error(`Unknown expression type: ${e.type}`)}}var mc=class{parsed;constructor(e){let t=Ro(e,{lstrip_blocks:!0,trim_blocks:!0});this.parsed=_s(t)}render(e){let t=new Rs;if(zs(t),e)for(let[n,r]of Object.entries(e))t.set(n,r);return new Js(t).run(this.parsed).value}format(e){return rc(this.parsed,e?.indent||` `)}},hc={txt:`text/plain`,html:`text/html`,css:`text/css`,js:`text/javascript`,json:`application/json`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`},gc=class e{constructor(e){if(this.filePath=e,this.headers=new Headers,this.exists=Cr.existsSync(e),this.exists){this.status=200,this.statusText=`OK`;let t=Cr.statSync(e);this.headers.set(`content-length`,t.size.toString()),this.updateContentType();let n=Cr.createReadStream(e);this.body=new ReadableStream({start(e){n.on(`data`,t=>e.enqueue(t)),n.on(`end`,()=>e.close()),n.on(`error`,t=>e.error(t))},cancel(){n.destroy()}})}else this.status=404,this.statusText=`Not Found`,this.body=null}updateContentType(){let e=this.filePath.toString().split(`.`).pop().toLowerCase();this.headers.set(`content-type`,hc[e]??`application/octet-stream`)}clone(){let t=new e(this.filePath);return t.exists=this.exists,t.status=this.status,t.statusText=this.statusText,t.headers=new Headers(this.headers),t}async arrayBuffer(){return(await Cr.promises.readFile(this.filePath)).buffer}async blob(){let e=await Cr.promises.readFile(this.filePath);return new Blob([e],{type:this.headers.get(`content-type`)})}async text(){return await Cr.promises.readFile(this.filePath,`utf8`)}async json(){return JSON.parse(await this.text())}},_c=class{constructor(e){this._mt=/* @__PURE__ */ new Uint32Array(624),this._idx=625,this._gauss_next=null,this._random_fn=this.random.bind(this),this.seed(e)}seed(e){if(e==null){if(O.IS_CRYPTO_AVAILABLE){let t=/* @__PURE__ */ new Uint32Array(1);crypto.getRandomValues(t),e=t[0]}else e=Date.now()>>>0}let t=this._mt,n=(e,t)=>Math.imul(e,t)>>>0,r=[];for(let t=e||0;t>0;t=Math.floor(t/4294967296))r.push(t&4294967295);r.length||r.push(0),t[0]=19650218;for(let e=1;e<624;++e)t[e]=n(1812433253,t[e-1]^t[e-1]>>>30)+e>>>0;let i=1,a=0;for(let e=Math.max(624,r.length);e>0;--e,++i,++a)i>=624&&(t[0]=t[623],i=1),a>=r.length&&(a=0),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1664525))+r[a]+a>>>0;for(let e=623;e>0;--e,++i)i>=624&&(t[0]=t[623],i=1),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1566083941))-i>>>0;t[0]=2147483648,this._idx=624,this._gauss_next=null}_int32(){let e=this._mt;if(this._idx>=624){for(let t=0;t<624;++t){let n=e[t]&2147483648|e[(t+1)%624]&2147483647;e[t]=(e[(t+397)%624]^n>>>1^(n&1?2567483615:0))>>>0}this._idx=0}let t=e[this._idx++];return t^=t>>>11,t^=t<<7&2636928640,t^=t<<15&4022730752,t^=t>>>18,t>>>0}random(){return((this._int32()>>>5)*67108864+(this._int32()>>>6))/9007199254740992}gauss(e=0,t=1){let n=this._gauss_next;if(this._gauss_next=null,n===null){let e=this.random()*2*Math.PI,t=Math.sqrt(-2*Math.log(1-this.random()));n=Math.cos(e)*t,this._gauss_next=Math.sin(e)*t}return e+n*t}shuffle(e){for(let t=e.length-1;t>0;--t){let n=32-Math.clz32(t+1),r=this._int32()>>>32-n;for(;r>t;)r=this._int32()>>>32-n;let i=e[t];e[t]=e[r],e[r]=i}}choices(e,t){return e[vc(this._random_fn,t)]}};function vc(e,t){let n=0;for(let e=0;evc(bc.random,e),Sc=new _c,Cc=class{constructor(e){this.path=e}async match(e){let t=new gc(wr.join(this.path,e));if(t.exists)return t}async put(e,t,n=void 0){let r=wr.join(this.path,e),i=r+`.tmp.${O.IS_PROCESS_AVAILABLE?process.pid:Date.now()}.${Sc._int32().toString(36)}`;try{let e=t.headers.get(`Content-Length`),a=parseInt(e??`0`),o=0;await Cr.promises.mkdir(wr.dirname(r),{recursive:!0});let s=Cr.createWriteStream(i),c=t.body.getReader();for(;;){let{done:e,value:t}=await c.read();if(e)break;await new Promise((e,n)=>{s.write(t,t=>{if(t){n(t);return}e()})}),o+=t.length;let r=a?o/a*100:0;n?.({progress:r,loaded:o,total:a})}await new Promise((e,t)=>{s.close(n=>n?t(n):e())}),await Cr.promises.rename(i,r)}catch(e){try{await Cr.promises.unlink(i)}catch{}throw e}}async delete(e){let t=wr.join(this.path,e);try{return await Cr.promises.unlink(t),!0}catch{return!1}}},wc={400:`Bad request error occurred while trying to load file`,401:`Unauthorized access to file`,403:`Forbidden access to file`,404:`Could not locate file`,408:`Request timeout error occurred while trying to load file`,500:`Internal server error error occurred while trying to load file`,502:`Bad gateway error occurred while trying to load file`,503:`Service unavailable error occurred while trying to load file`,504:`Gateway timeout error occurred while trying to load file`},Tc=100,Ec=/^(\b[\w\-.]+\b\/)?\b[\w\-.]{1,96}\b$/;function Dc(...e){return e=e.map((t,n)=>(n&&(t=t.replace(/* @__PURE__ */ RegExp(`^/`),``)),n!==e.length-1&&(t=t.replace(/* @__PURE__ */ RegExp(`/$`),``)),t)),e.join(`/`)}function Oc(e,t=null,n=null){let r;try{r=new URL(e)}catch{return!1}return!(t&&!t.includes(r.protocol)||n&&!n.includes(r.hostname))}function kc(e){return!(!Ec.test(e)||e.includes(`..`)||e.includes(`--`)||e.endsWith(`.git`)||e.endsWith(`.ipynb`))}function Ac(e,t={},...n){return JSON.stringify([e,t.revision??`main`,t.cache_dir??null,t.local_files_only??!1,...n])}var jc=class extends Error{constructor(e,{status:t=null}={}){super(e),this.name=`ModelFileNotFoundError`,this.status=t}},Mc=/* @__PURE__ */ new Set([401,403,404]);function Nc(e,t,n){if(!n)return null;let r=`${wc[e]??`Error (${e}) occurred while trying to load file`}: "${t}".`;throw Mc.has(e)?new jc(r,{status:e}):Error(r)}async function Pc(e,t,n){let r=e.headers.get(`Content-Length`),i=r?parseInt(r,10):n??0;r===null&&!n&&A.warn(`Unable to determine content-length from response headers. Will expand buffer when needed.`);let a=new Uint8Array(i),o=0,s=e.body.getReader();async function c(){let{done:e,value:n}=await s.read();if(e)return;let r=o+n.length;if(r>i){i=r;let e=new Uint8Array(i);e.set(a),a=e}return a.set(n,o),o=r,t({progress:o/i*100,loaded:o,total:i}),c()}return await c(),a}function Fc(e){return Oc(e,[`blob:`])}function Ic(e,{allowUnresolved:t=!1}={}){let n;if(typeof location<`u`&&location.href)n=location.href;else if(import.meta.url)n=import.meta.url;else return e;try{return new URL(e,n).href}catch(n){if(!t)throw n;return e}}var Lc=`SHA-256`,Rc=`experimental_transformers-hash-cache`,zc=e=>({algorithm:Lc,value:e}),Bc=class{#e=null;_getHashCache=()=>(this.#e??=caches.open(Rc),this.#e);static isAvailable=()=>typeof navigator<`u`&&`crossOriginStorage`in navigator;match=async e=>{let t=await this._getFileHash(e);if(t)try{let e=await(await navigator.crossOriginStorage.requestFileHandle(zc(t))).getFile();return new Response(e,{headers:{"Content-Length":String(e.size)}})}catch{return}};put=async(e,t)=>{let n=await this._getFileHash(e);if(n){let e=await t.blob();await this._storeBlobInCOS(e,n)}else this._processAndStore(e,t.body)};_storeBlobInCOS=async(e,t)=>{let n=await(await navigator.crossOriginStorage.requestFileHandle(zc(t),{create:!0,origins:`*`})).createWritable();await n.write(e),await n.close()};_processAndStore=async(e,t)=>{try{let n=[];for await(let e of t)n.push(e);let r=new Blob(n),i=await this._getBlobHash(r);await this._storeBlobInCOS(r,i);try{await(await this._getHashCache()).put(e,new Response(i))}catch{}}catch{}};delete=async e=>{try{return await(await this._getHashCache()).delete(e)}catch{return!1}};_getFileHash=async e=>{try{let t=await this._getHashCache(),n=await t.match(e);if(n)return n.text();let r=await this._getLfsFileHash(e);return r?(await t.put(e,new Response(r)),r):null}catch{return null}};_getLfsFileHash=async e=>{if(!e.includes(`/resolve/`))return null;let t=e.replace(`/resolve/`,`/raw/`);try{let e=(await fetch(t).then(e=>e.text())).match(/^oid sha256:([0-9a-f]+)$/m);return e?e[1]:null}catch{return null}};_getBlobHash=async e=>{let t=await e.arrayBuffer(),n=await crypto.subtle.digest(Lc,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}};async function Vc(e=null){let t=null;if(k.useCustomCache){if(!k.customCache)throw Error("`env.useCustomCache=true`, but `env.customCache` is not defined.");if(!k.customCache.match||!k.customCache.put)throw Error("`env.customCache` must be an object which implements the `match` and `put` functions of the Web Cache API. For more information, see https://developer.mozilla.org/en-US/docs/Web/API/Cache");t=k.customCache}if(!t&&k.experimental_useCrossOriginStorage&&Bc.isAvailable()&&(t=new Bc),!t&&k.useBrowserCache){if(typeof caches>`u`)throw Error(`Browser cache is not available in this environment.`);try{t=await caches.open(k.cacheKey)}catch(e){A.warn(`An error occurred while opening the browser cache:`,e)}}if(!t&&k.useFSCache){if(!O.IS_FS_AVAILABLE)throw Error(`File System Cache is not available in this environment.`);t=new Cc(e??k.cacheDir)}return t}async function Hc(e,...t){for(let n of t)try{let t=await e.match(n);if(t)return t}catch{continue}}var Uc=new class{#e;#t;constructor(e){this.#e=e,this.#t=/* @__PURE__ */ new Map}get(e){if(!this.#t.has(e))return;let t=this.#t.get(e);return this.#t.delete(e),this.#t.set(e,t),t}put(e,t){this.#t.has(e)&&this.#t.delete(e),this.#t.set(e,t),this.#t.size>this.#e&&this.#t.delete(this.#t.keys().next().value)}delete(e){return this.#t.delete(e)}clear(){this.#t.clear()}}(100);function Wc(e,t){let n=Uc.get(e);if(n!==void 0)return n;let r=t().then(e=>e,t=>(Uc.delete(e),Promise.reject(t)));return Uc.put(e,r),r}async function Gc(e){if(!Oc(e,[`http:`,`https:`]))return null;let t=Yc(e);return t.set(`Range`,`bytes=0-0`),k.fetch(e,{method:`GET`,headers:t,cache:`no-store`})}function Kc(e,t,n={}){return Wc(Ac(e,n,t),()=>qc(e,t,n))}async function qc(e,t,n){let r=await Vc(n?.cache_dir),{localPath:i,remoteURL:a,proposedCacheKey:o,validModelId:s}=Xc(e,t,n,r),c=await Zc(r,i,o);if(c!==void 0&&typeof c!=`string`){let e=c.headers.get(`content-length`),t=c.headers.get(`content-type`);return{exists:!0,size:e?parseInt(e,10):void 0,contentType:t||void 0,fromCache:!0}}if(k.allowLocalModels&&!Oc(i,[`http:`,`https:`]))try{let e=await Jc(i);if(typeof e!=`string`&&e.status!==404){let t=e.headers.get(`content-length`),n=e.headers.get(`content-type`);return{exists:!0,size:t?parseInt(t,10):void 0,contentType:n||void 0,fromCache:!1}}}catch{}if(k.allowRemoteModels&&!n.local_files_only&&s){let e=await Gc(a);if(e&&e.status>=200&&e.status<300){let t,n=e.headers.get(`content-type`);if(e.status===206){let n=e.headers.get(`content-range`);if(n){let e=n.match(/bytes \d+-\d+\/(\d+)/);e&&(t=parseInt(e[1],10))}}else if(e.status===200)try{await e.body?.cancel()}catch{}if(t===void 0){let n=e.headers.get(`content-length`);t=n?parseInt(n,10):void 0}return{exists:!0,size:t,contentType:n||void 0,fromCache:!1}}e&&e.status!==404&&e.status!==416&&Nc(e.status,a,!0)}return{exists:!1,fromCache:!1}}async function Jc(e){return k.useFS&&!Oc(e,[`http:`,`https:`,`blob:`])?new gc(e instanceof URL?e.protocol===`file:`?e.pathname:e.toString():e):k.fetch(e,{headers:Yc(e)})}function Yc(e){let t=typeof process<`u`&&process?.release?.name===`node`,n=new Headers;if(t){let t=!!{}.TESTING_REMOTELY,r=k.version;if(n.set(`User-Agent`,`transformers.js/${r}; is_ci/${t};`),Oc(e,[`http:`,`https:`],[`huggingface.co`,`hf.co`])){let e={}.HF_TOKEN??{}.HF_ACCESS_TOKEN;e&&n.set(`Authorization`,`Bearer ${e}`)}}return n}function Xc(e,t,n={},r=null){let i=n.revision??`main`,a=Dc(e,t),o=kc(e),s=o?Dc(k.localModelPath,a):a,c=Dc(k.remoteHost,k.remotePathTemplate.replaceAll(`{model}`,e).replaceAll(`{revision}`,encodeURIComponent(i)),t);return{requestURL:a,localPath:s,remoteURL:c,proposedCacheKey:r instanceof Cc?i===`main`?a:Dc(e,i,t):c,validModelId:o}}async function Zc(e,t,n){if(e)return await Hc(e,t,n)}async function Qc(e,t,n,r,i,a,o={}){if(await n.match(r)===void 0&&!(typeof Cache<`u`&&n instanceof Cache&&!Oc(Ic(r,{allowUnresolved:!0}),[`http:`,`https:`]))){if(!a){let a=o.progress_callback?n=>ei(o.progress_callback,{status:`progress`,name:e,file:t,...n}):void 0;await n.put(r,i,a)}else if(typeof i!=`string`){let e=new Headers(i.headers);e.set(`content-length`,a.byteLength.toString()),await n.put(r,new Response(a,{headers:e})).catch(e=>{A.warn(`Unable to add response to browser cache: ${e}.`)})}}}async function $c(e,t,n=!0,r={},i=!1,a=null){let{requestURL:o,localPath:s,remoteURL:c,proposedCacheKey:l,validModelId:u}=Xc(e,t,r,a),d,f=!1,p;p=await Zc(a,s,l);let m=p!==void 0;if(m)d=l;else{if(k.allowLocalModels){if(!Oc(o,[`http:`,`https:`]))try{p=await Jc(s),d=s}catch(e){A.warn(`Unable to load from local path "${s}": "${e}"`)}else if(r.local_files_only)throw Error(`\`local_files_only=true\`, but attempted to load a remote file from: ${o}.`);else if(!k.allowRemoteModels)throw Error(`\`env.allowRemoteModels=false\`, but attempted to load a remote file from: ${o}.`)}if(p===void 0||typeof p!=`string`&&p.status===404){if(r.local_files_only||!k.allowRemoteModels){if(n)throw new jc(`\`local_files_only=true\` or \`env.allowRemoteModels=false\` and file was not found locally at "${s}".`);return null}if(!u)throw new jc(`Local file missing at "${s}" and download aborted due to invalid model ID "${e}".`);if(p=await Jc(c),p.status!==200)return Nc(p.status,c,n);d=l}f=a&&typeof Response<`u`&&p instanceof Response&&p.status===200}ei(r.progress_callback,{status:`download`,name:e,file:t});let h;if(!(O.IS_NODE_ENV&&i)){let n;if(typeof p!=`string`){if(!r.progress_callback)n=new Uint8Array(await p.arrayBuffer());else if(m&&typeof navigator<`u`&&/firefox/i.test(navigator.userAgent))n=new Uint8Array(await p.arrayBuffer()),ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n.length,total:n.length});else{let i,a=p.headers.get(`content-length`);if(a)i=parseInt(a,10);else try{let n=await Kc(e,t,r);n.size&&(i=n.size)}catch{}n=await Pc(p,n=>{ei(r.progress_callback,{status:`progress`,name:e,file:t,...n})},i)}}h=n}if(f&&d&&typeof p!=`string`&&await Qc(e,t,a,d,p,h,r),O.IS_NODE_ENV&&i&&r.progress_callback&&typeof p!=`string`){let n=parseInt(p.headers.get(`content-length`),10)||0;ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n,total:n})}if(ei(r.progress_callback,{status:`done`,name:e,file:t}),h){if(!O.IS_NODE_ENV&&i)throw Error(`Cannot return path in a browser environment.`);return h}if(p instanceof gc)return p.filePath;let g=await a?.match(d);if(g instanceof gc)return g.filePath;if(g instanceof Response)return new Uint8Array(await g.arrayBuffer());if(typeof g==`string`)return g;throw Error(`Unable to get model file path or buffer.`)}var el=/* @__PURE__ */ new Map;async function tl(e,t,n=!0,r={},i=!1){if(!k.allowLocalModels){if(r.local_files_only)throw Error("Invalid configuration detected: local models are disabled (`env.allowLocalModels=false`) but you have requested to only use local models (`local_files_only=true`).");if(!k.allowRemoteModels)throw Error("Invalid configuration detected: both local and remote models are disabled. Fix by setting `env.allowLocalModels` or `env.allowRemoteModels` to `true`.")}let a=Ac(e,r,t,n,i),{progress_callback:o}=r,s=o instanceof ti?o.loads:el,c=s.get(a);return c||(ei(o,{status:`initiate`,name:e,file:t}),c=Vc(r.cache_dir).then(a=>$c(e,t,n,r,i,a)),s===el&&(c=c.finally(()=>el.delete(a))),s.set(a,c)),await c}async function nl(e,t,n=!0,r={}){let i=await tl(e,t,n,r,!1);return i===null?null:new TextDecoder(`utf-8`).decode(i)}async function rl(e,t,n=!0,r={}){let i=await nl(e,t,n,r);return i===null?{}:JSON.parse(i)}function il(e,[t,n,r],[i,a],o=`bilinear`,s=!1){let c=a/r,l=i/n,u=new e.constructor(i*a*t),d=n*r,f=i*a;for(let o=0;o=0;--e)i[e]=a,r[e]=t[n[e]],a*=r[e];let a=n.map((e,t)=>i[n.indexOf(t)]),o=new e.constructor(e.length);for(let n=0;n=0;--e)r+=i%t[e]*a[e],i=Math.floor(i/t[e]);o[r]=e[n]}return[o,r]}function ol(e){let t=ll(e)[0],n=e.map(e=>Math.exp(e-t)),r=n.reduce((e,t)=>e+t,0);return n.map(e=>e/r)}function sl(e){let t=ll(e)[0],n=0;for(let r=0;re-t-r)}function cl(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;rt&&(t=e[r],n=r);return[t,n]}function ul(e){return e>0&&!(e&e-1)}var dl=class{constructor(e){if(this.size=e|0,this.size<=1||!ul(this.size))throw Error(`FFT size must be a power of two larger than 1`);this._csize=e<<1,this.table=new Float64Array(this.size*2);for(let e=0;ee;e<<=1)++t;this._width=t%2==0?t-1:t,this._bitrev=new Int32Array(1<>>t&3)<>>1);for(let t=0;t>>1]=e[t];return n}toComplexArray(e,t){let n=t||this.createComplexArray();for(let t=0;t>>1],n[t+1]=0;return n}transform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,1)}realTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._realTransform4(e,t,1)}inverseTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,-1);for(let t=0;t>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>2;for(o=0;o>>1,i>>>1)}else for(o=0,s=0;o>>1,i>>>1,n)}let l=this.table;for(i>>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>1,s=t>>>1,c=s>>>1;for(o=0;o>>1;for(let t=2;t>1;++t){let n=(t+1-e)**2/2,r=Math.sqrt(s**2+c**2)**n,o=n*Math.atan2(c,s),l=2*t;i[l]=r*Math.cos(o),i[l+1]=r*Math.sin(o),a[l]=i[l],a[l+1]=-i[l+1]}this._slicedChirpBuffer=i.subarray(t,n),this._f=new dl(r>>1),this._f.transform(this._chirpBuffer,a)}_transform(e,t,n){let r=this._buffer1,i=this._buffer2,a=this._outBuffer1,o=this._outBuffer2,s=this._chirpBuffer,c=this._slicedChirpBuffer,l=this._a;if(n)for(let e=0;e>1];r[e]=i*c[e],r[n]=i*c[n]}else for(let e=0;e=e.length&&(i=2*(e.length-1)-i),r[a++]=e[i]}r.sort(),n[t]=r[i]}return n}function hl(e,t){let n=10**t;return Math.round(e*n)/n}function gl(e){let t=Math.round(e);return Math.abs(e)%1==.5?t%2==0?t:t-1:t}function _l(e){let t=e.length,n=e[0].length,r=[t+1,n+1],i=Array.from({length:r[0]},()=>Array(r[1]).fill(1/0));i[0][0]=0;let a=Array.from({length:r[0]},()=>Array(r[1]).fill(-1));for(let t=1;t0||s>0;)switch(c.push(o-1),l.push(s-1),a[o][s]){case 0:--o,--s;break;case 1:--o;break;case 2:--s;break;default:throw Error(`Internal error in dynamic time warping. Unexpected trace[${o}, ${s}]. Please file a bug report.`)}return c.reverse(),l.reverse(),[c,l]}var vl=/* @__PURE__ */ (function(){let e=null;return function(t){if(!e){e=/* @__PURE__ */ new Float32Array(65536);let t=/* @__PURE__ */ new ArrayBuffer(4),n=new Uint32Array(t),r=new Float32Array(t);for(let t=0;t>10,s=t&1023;if(o===31)i=a|2139095040|s<<13;else if(o===0){if(s===0)i=a;else{let e=113;for(;!(s&1024);)s<<=1,--e;s&=-1025,i=a|e<<23|s<<13}}else i=a|o+112<<23|s<<13;n[0]=i,e[t]=r[0]}}let n=t.length,r=e,i=new Float32Array(n);for(let e=0;e[`webgpu`,`cuda`,`dml`,`webnn-gpu`].includes(e))}if(El.includes(e))return[Cl[e]??e];throw Error(`Unsupported device: "${e}". Should be one of: ${El.join(`, `)}.`)}var Ml=Promise.resolve(),Nl=null;async function Pl(){if(Nl)return Nl;if(!(k.useWasmCache&&typeof zl?.wasm?.wasmPaths==`object`&&zl?.wasm?.wasmPaths?.wasm&&zl?.wasm?.wasmPaths?.mjs)){if(O.IS_DENO_WEB_RUNTIME)throw Error(`env.useWasmCache=false is not supported in Deno's web runtime. Remove the useWasmCache override.`);return Nl=Promise.resolve(),Nl}return Nl=(async()=>{let e=zl.wasm.wasmPaths,t=!1;await Promise.all([e.wasm&&!Fc(e.wasm)?(async()=>{try{let n=await xl(Ic(e.wasm));n&&(zl.wasm.wasmBinary=n,t=!0)}catch(e){A.warn(`Failed to pre-load WASM binary:`,e)}})():Promise.resolve(),e.mjs&&!Fc(e.mjs)?(async()=>{try{let t=await Sl(Ic(e.mjs));t&&(zl.wasm.wasmPaths.mjs=t)}catch(e){A.warn(`Failed to pre-load WASM factory:`,e)}})():Promise.resolve()]),t||(zl.wasm.wasmPaths.mjs=e.mjs)})(),Nl}async function Fl(e,t,n){await Pl();let r=wl(k.logLevel??Xr.WARNING),i=()=>Al.create(e,{logSeverityLevel:r,...t}),a=await(O.IS_WEB_ENV?Ml=Ml.then(i):i());return a.config=n,a}var Il=Promise.resolve();async function Ll(e,t){let n=()=>e.run(t);return O.IS_WEB_ENV?Il=Il.then(n):n()}function Rl(e){return e instanceof Ol.Tensor}var zl=Ol?.env;function Bl(){return zl?.wasm?.proxy}if(zl){let e=function(e){zl.logLevel=Tl[wl(e)]};if(zl.wasm){if(!(typeof ServiceWorkerGlobalScope<`u`&&self instanceof ServiceWorkerGlobalScope)&&zl.versions?.web&&!zl.wasm.wasmPaths){let e=`https://cdn.jsdelivr.net/npm/onnxruntime-web@${zl.versions.web}/dist/`,t=`.asyncify`;O.IS_SAFARI_BELOW_26&&!O.IS_WEBGPU_AVAILABLE&&(t=``),zl.wasm.wasmPaths={mjs:`${e}ort-wasm-simd-threaded${t}.mjs`,wasm:`${e}ort-wasm-simd-threaded${t}.wasm`}}zl.wasm.proxy=!1}zl.webgpu&&(zl.webgpu.powerPreference=`high-performance`),e(k.logLevel??Xr.WARNING),k.backends.onnx={...zl,setLogLevel:e}}var Vl=async(e,t,n)=>{let r=await Fl(new Uint8Array(e),t);return(async e=>{let t=Bl(),i=Object.fromEntries(Object.entries(e).map(([e,n])=>[e,(t?n.clone():n).ort_tensor])),a=await Ll(r,i);return Array.isArray(n)?n.map(e=>new V(a[e])):new V(a[n])})},Hl=class{static session_options={};static get nearest_interpolate_4d(){return this._nearest_interpolate_4d||=Vl([8,10,18,0,58,129,1,10,41,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,18,10,4,109,111,100,101,34,7,110,101,97,114,101,115,116,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,21],this.session_options,`y`),this._nearest_interpolate_4d}static get bilinear_interpolate_4d(){return this._bilinear_interpolate_4d||=Vl([8,9,18,0,58,128,1,10,40,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,17,10,4,109,111,100,101,34,6,108,105,110,101,97,114,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bilinear_interpolate_4d}static get bicubic_interpolate_4d(){return this._bicubic_interpolate_4d||=Vl([8,9,18,0,58,127,10,39,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,16,10,4,109,111,100,101,34,5,99,117,98,105,99,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bicubic_interpolate_4d}static get matmul(){return this._matmul||=Vl([8,9,18,0,58,55,10,17,10,1,97,10,1,98,18,1,99,34,6,77,97,116,77,117,108,18,1,114,90,9,10,1,97,18,4,10,2,8,1,90,9,10,1,98,18,4,10,2,8,1,98,9,10,1,99,18,4,10,2,8,1,66,2,16,20],this.session_options,`c`),this._matmul}static get stft(){return this._stft||=Vl([8,7,18,0,58,148,1,10,38,10,1,115,10,1,106,10,1,119,10,1,108,18,1,111,34,4,83,84,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,115,90,26,10,1,115,18,21,10,19,8,1,18,15,10,3,18,1,98,10,3,18,1,115,10,3,18,1,99,90,11,10,1,106,18,6,10,4,8,7,18,0,90,16,10,1,119,18,11,10,9,8,1,18,5,10,3,18,1,119,90,11,10,1,108,18,6,10,4,8,7,18,0,98,31,10,1,111,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,102,10,3,18,1,100,10,3,18,1,99,66,2,16,17],this.session_options,`o`),this._stft}static get rfft(){return this._rfft||=Vl([8,9,58,93,10,33,10,1,120,10,0,10,1,97,18,1,121,34,3,68,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,100,90,19,10,1,120,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,1,90,11,10,1,97,18,6,10,4,8,7,18,0,98,19,10,1,121,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,2,66,2,16,20],this.session_options,`y`),this._rfft}static get top_k(){return this._top_k||=Vl([8,10,18,0,58,73,10,18,10,1,120,10,1,107,18,1,118,18,1,105,34,4,84,111,112,75,18,1,116,90,9,10,1,120,18,4,10,2,8,1,90,15,10,1,107,18,10,10,8,8,7,18,4,10,2,8,1,98,9,10,1,118,18,4,10,2,8,1,98,9,10,1,105,18,4,10,2,8,7,66,2,16,21],this.session_options,[`v`,`i`]),this._top_k}static get slice(){return this._slice||=Vl([8,7,18,0,58,96,10,25,10,1,120,10,1,115,10,1,101,10,1,97,10,1,116,18,1,121,34,5,83,108,105,99,101,18,1,114,90,9,10,1,120,18,4,10,2,8,1,90,9,10,1,115,18,4,10,2,8,7,90,9,10,1,101,18,4,10,2,8,7,90,9,10,1,97,18,4,10,2,8,7,90,9,10,1,116,18,4,10,2,8,7,98,9,10,1,121,18,4,10,2,8,1,66,2,16,13],this.session_options,`y`),this._slice}},Ul=Object.freeze({auto:`auto`,gpu:`gpu`,cpu:`cpu`,wasm:`wasm`,webgpu:`webgpu`,cuda:`cuda`,dml:`dml`,coreml:`coreml`,webnn:`webnn`,"webnn-npu":`webnn-npu`,"webnn-gpu":`webnn-gpu`,"webnn-cpu":`webnn-cpu`}),Wl=O.IS_NODE_ENV?`cpu`:`wasm`;function Gl(e,t,{warn:n}={}){return e?typeof e==`string`?e:e.hasOwnProperty(t)?e[t]:(n&&n(`device not specified for "${t}". Using the default device (${Wl}).`),Wl):Wl}var Kl=/* @__PURE__ */ (function(){let e;return async function(){if(e===void 0){if(!O.IS_WEBGPU_AVAILABLE)e=!1;else try{e=(await navigator.gpu.requestAdapter()).features.has(`shader-f16`)}catch{e=!1}}return e}})(),ql=Object.freeze({auto:`auto`,fp32:`fp32`,fp16:`fp16`,q8:`q8`,int8:`int8`,uint8:`uint8`,q4:`q4`,bnb4:`bnb4`,q4f16:`q4f16`,q2:`q2`,q2f16:`q2f16`,q1:`q1`,q1f16:`q1f16`}),Jl=ql.fp32,Yl=Object.freeze({[Ul.wasm]:ql.q8}),Xl=Object.freeze({[ql.fp32]:``,[ql.fp16]:`_fp16`,[ql.int8]:`_int8`,[ql.uint8]:`_uint8`,[ql.q8]:`_quantized`,[ql.q4]:`_q4`,[ql.q2]:`_q2`,[ql.q1]:`_q1`,[ql.q4f16]:`_q4f16`,[ql.q2f16]:`_q2f16`,[ql.q1f16]:`_q1f16`,[ql.bnb4]:`_bnb4`});function Zl(e,t,n,{configDtype:r=null,warn:i}={}){let a,o=!1;e&&typeof e!=`string`?e.hasOwnProperty(t)?a=e[t]:(a=null,o=!0):a=e;let s;if(a===ql.auto){if(r){let e=typeof r==`string`?r:r?.[t];if(e&&e!==ql.auto&&ql.hasOwnProperty(e))return e}s=Yl[n]??Jl}else s=a&&ql.hasOwnProperty(a)?a:Yl[n]??Jl;return o&&i&&i(`dtype not specified for "${t}". Using the default dtype (${s}) for this device (${n}).`),s}var Ql=Object.freeze({float32:Float32Array,float16:typeof Float16Array<`u`?Float16Array:Uint16Array,float64:Float64Array,string:Array,int8:Int8Array,uint8:Uint8Array,int16:Int16Array,uint16:Uint16Array,int32:Int32Array,uint32:Uint32Array,int64:BigInt64Array,uint64:BigUint64Array,bool:Uint8Array,uint4:Uint8Array,int4:Int8Array}),V=class e{get dims(){return this.ort_tensor.dims}set dims(e){this.ort_tensor.dims=e}get type(){return this.ort_tensor.type}get data(){return this.ort_tensor.data}get size(){return this.ort_tensor.size}get location(){return this.ort_tensor.location}ort_tensor;constructor(...e){return this.ort_tensor=Rl(e[0])?e[0]:new br(e[0],e[1],e[2]),new Proxy(this,{get:(e,t)=>{if(typeof t==`string`){let n=Number(t);if(Number.isInteger(n))return e._getitem(n)}return e[t]},set:(e,t,n)=>e[t]=n})}dispose(){this.ort_tensor.dispose()}*[Symbol.iterator](){let[e,...t]=this.dims;if(t.length>0){let n=t.reduce((e,t)=>e*t);for(let r=0;r0){let e=r.reduce((e,t)=>e*t);return this._subarray(t,e,r)}return new e(this.type,[this.data[t]],r)}_subarray(t,n,r){let i=t*n,a=(t+1)*n,o=`subarray`in this.data?this.data.subarray(i,a):this.data.slice(i,a);return new e(this.type,o,r)}item(){let e=this.data;if(e.length!==1)throw Error(`a Tensor with ${e.length} elements cannot be converted to Scalar`);return e[0]}tolist(){return $l(this.data,this.dims)}sigmoid(){return this.clone().sigmoid_()}sigmoid_(){let e=this.data;for(let t=0;t0||r>0&&n<0?r+n:r}return this}clone(){return new e(this.type,this.data.slice(),this.dims.slice())}slice(...t){let n=[],r=[];for(let e=0;ea)throw Error(`Invalid slice: ${i}`);let o=[Math.max(t,0),Math.min(a,this.dims[e])];r.push(o),n.push(o[1]-o[0])}else throw Error(`Invalid slice: ${i}`)}let i=r.map(([e,t])=>t-e),a=i.reduce((e,t)=>e*t),o=this.data,s=new o.constructor(a),c=this.stride(),l=!0;for(let e=1;e=0;--n){let e=i[n];t+=(a%e+r[n][0])*c[n],a=Math.floor(a/e)}s[e]=o[t]}return new e(this.type,s,n)}permute(...e){return eu(this,e)}transpose(...e){return this.permute(...e)}sum(e=null,t=!1){return this.norm(1,e,t)}norm(t=`fro`,n=null,r=!1){if(t===`fro`)t=2;else if(typeof t==`string`)throw Error(`Unsupported norm: ${t}`);let i=this.data,a=i instanceof BigInt64Array||i instanceof BigUint64Array;if(a&&t!==1)throw Error(`Expected a floating point tensor as input. Got ${this.type}`);let o,s;if(a?(o=(e,t)=>e+t,s=0n):(o=(e,n)=>e+n**t,s=0),n===null){let n=i.reduce(o,s);return t!==1&&(n**=1/t),new e(this.type,[n],[])}let[c,l,u]=fu(o,this,n,r);if(t!==1)for(let e=0;e=0;--r){let e=this.dims[r];if(r!==t){let t=i%e;n+=t*a,a*=this.dims[r]}i=Math.floor(i/e)}r[e]/=i[n]}return this}normalize(e=2,t=1){return this.clone().normalize_(e,t)}stride(){return hu(this.dims)}squeeze(t=null){return new e(this.type,this.data,cu(this.dims,t))}squeeze_(e=null){return this.dims=cu(this.dims,e),this}unsqueeze(t){return new e(this.type,this.data,lu(this.dims,t))}unsqueeze_(e){return this.dims=lu(this.dims,e),this}flatten_(e=0,t=-1){t=(t+this.dims.length)%this.dims.length;let n=this.dims.slice(0,e),r=this.dims.slice(e,t+1),i=this.dims.slice(t+1);return this.dims=[...n,r.reduce((e,t)=>e*t,1),...i],this}flatten(e=0,t=-1){return this.clone().flatten_(e,t)}view(...t){let n=-1;for(let e=0;er===n?e:e*t,1);t[n]=r.length/e}return new e(this.type,r,t)}neg_(){let e=this.data;for(let t=0;tt);return new e(`bool`,n,this.dims)}lt(t){let n=new Uint8Array(this.data.length),r=this.data;for(let e=0;eMath.min(e,t),this,t,n,1/0);return new e(r,i,a)}max(t=null,n=!1){if(t===null){let t=ll(this.data)[0];return new e(this.type,[t],[])}let[r,i,a]=fu((e,t)=>Math.max(e,t),this,t,n,-1/0);return new e(r,i,a)}argmin(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=cl(this.data)[1];return new e(`int64`,[BigInt(r)],[])}argmax(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=ll(this.data)[1];return new e(`int64`,[BigInt(r)],[])}repeat(...t){if(t.lengthe===1)){if(t.length===this.dims.length)return this.clone();let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims);return new e(this.type,this.data.slice(),r)}let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims),i=r.map((e,n)=>e*t[n]),a=i.reduce((e,t)=>e*t,1),o=this.data,s=new o.constructor(a),c=hu(r),l=hu(i);for(let e=0;eBigInt(Math.floor(e)):BigInt;else if(this.type===`float16`&&t==`float32`&&this.data instanceof Uint16Array)return new e(t,vl(this.data),this.dims);return new e(t,Ql[t].from(this.data,n),this.dims)}};function $l(e,t){let n=e.length;if(n!==(t.length===0?1:t.reduce((e,t)=>e*t)))throw Error(`cannot reshape array of size ${n} into shape (${t})`);let r=e;for(let e=t.length-1;e>=0;e--)r=r.reduce((n,r)=>{let i=n[n.length-1];return i.lengthnew V(`int64`,e,[e.length]);async function ou(e,t,n,r,i){return await(await Hl.slice)({x:e,s:au(t),e:au(n),a:au(r),t:au(i??Array(r.length).fill(1))})}function su(e,t){let n=e.data,r=t.data,i=[e.dims[0],e.dims[2]],a=new n.constructor(i[0]*i[1]),[o,s,c]=e.dims,l=0;for(let e=0;ee!==1):typeof t==`number`?e[t]===1&&e.splice(t,1):Array.isArray(t)&&(e=e.filter((e,n)=>e!==1||!t.includes(n))),e}function lu(e,t){return t=uu(t,e.length+1),e=e.slice(),e.splice(t,0,1),e}function uu(e,t,n=null,r=!0){if(e<-t||e>=t){if(r)throw Error(`IndexError: index ${e} is out of bounds for dimension${n===null?``:` `+n} with size ${t}`);return e<-t?0:t}return e<0&&(e=(e%t+t)%t),e}function H(e,t=0){t=uu(t,e[0].dims.length);let n=e[0].dims.slice();n[t]=e.reduce((e,n)=>e+n.dims[t],0);let r=n.reduce((e,t)=>e*t,1),i=new e[0].data.constructor(r),a=e[0].type;if(t===0){let t=0;for(let n of e){let e=n.data;i.set(e,t),t+=e.length}}else{let r=0;for(let a=0;a=0;--i){let e=s[i],l=o%e;i===t&&(l+=r),a+=l*c,c*=n[i],o=Math.floor(o/e)}i[a]=o[e]}r+=s[t]}}return new V(a,i,n)}function du(e,t=0){return H(e.map(e=>e.unsqueeze(t)),t)}function fu(e,t,n,r=!1,i=null){let a=t.data,o=t.dims;n=uu(n,o.length);let s=o.slice();s[n]=1;let c=new a.constructor(a.length/o[n]);i!==null&&c.fill(i);for(let t=0;t=0;--e){let t=o[e];if(e!==n){let n=i%t;r+=n*a,a*=s[e]}i=Math.floor(i/t)}c[r]=e(c[r],a[t],t,r)}return r||s.splice(n,1),[t.type,c,s]}function pu(e,t=null,n=1,r=!1){let i=e.data,a=e.dims;if(t===null){let t=i.reduce((e,t)=>e+t,0)/i.length,r=Math.sqrt(i.reduce((e,n)=>e+(n-t)**2,0)/(i.length-n)),a=new V(e.type,[t],[]);return[new V(e.type,[r],[]),a]}t=uu(t,a.length);let o=mu(e,t,r),s=o.data,[c,l,u]=fu((e,t,n,r)=>e+(t-s[r])**2,e,t,r);for(let e=0;ee+t,0);return new V(e.type,[t/i.length],[])}t=uu(t,r.length);let[a,o,s]=fu((e,t)=>e+t,e,t,n);if(r[t]!==1)for(let e=0;e=0;--n)t[n]=r,r*=e[n];return t}function gu(e,t,n,r){return new V(n,new r(e.reduce((e,t)=>e*t,1)).fill(t),e)}function _u(e,t){let n,r;if(typeof t==`number`)n=`float32`,r=Float32Array;else if(typeof t==`bigint`)n=`int64`,r=BigInt64Array;else if(typeof t==`boolean`)n=`bool`,r=Uint8Array;else throw Error(`Unsupported data type: ${typeof t}`);return gu(e,t,n,r)}function vu(e,t){return _u(e.dims,t)}function yu(e){return gu(e,1n,`int64`,BigInt64Array)}function bu(e){return yu(e.dims)}function xu(e){return gu(e,0n,`int64`,BigInt64Array)}function Su(e){return xu(e.dims)}function Cu(e){let t=e.reduce((e,t)=>e*t,1);return new V(`float32`,Float32Array.from({length:t},()=>bc.gauss()),e)}function wu(e,t){if(e.dims.length!==2)throw Error(`The tensor must have 2 dimensions`);if(e.dims.at(-1)%8!=0)throw Error(`The last dimension of the tensor must be a multiple of 8`);if(![`binary`,`ubinary`].includes(t))throw Error(`The precision must be either 'binary' or 'ubinary'`);let n=t===`binary`,r=n?`int8`:`uint8`,i=n?Int8Array:Uint8Array,a=e.data,o=new i(a.length/8);for(let e=0;e0),r=Math.floor(e/8),i=e%8;o[r]|=t<<7-i,n&&i===0&&(o[r]-=128)}return new V(r,o,[e.dims[0],e.dims[1]/8])}async function Tu(e){if(!e)throw Error(`modelId is required for get_tokenizer_files`);return(await Kc(e,`tokenizer_config.json`,{})).exists?[`tokenizer.json`,`tokenizer_config.json`]:[]}async function Eu(e,t){let n=await Tu(e);return await Promise.all(n.map(n=>rl(e,n,!0,t)))}function Du(e){let t=e.dims;switch(t.length){case 1:return e.tolist();case 2:if(t[0]!==1)throw Error("Unable to decode tensor with `batch size !== 1`. Use `tokenizer.batch_decode(...)` for batched inputs.");return e.tolist()[0];default:throw Error(`Expected tensor to have 1-2 dimensions, got ${t.length}.`)}}var Ou=[`bos_token`,`eos_token`,`unk_token`,`sep_token`,`pad_token`,`cls_token`,`mask_token`];function ku(e,t,n,r){for(let i of Object.keys(e)){let a=t-e[i].length,o=n(i),s=Array(a).fill(o);e[i]=r===`right`?ai(e[i],s):ai(s,e[i])}}function Au(e,t){for(let n of Object.keys(e))e[n].length=t}function ju(e,...t){for(let n of t){if(!Object.hasOwn(e,n))continue;let t=e[n];if(t){if(typeof t==`object`){if(t.__type===`AddedToken`)return t.content;throw Error(`Unknown token: ${t}`)}return t}}return null}function Mu(e){let t=[];for(let n of e.get_added_tokens_decoder().values())n.special&&t.push(n);return t}var U=class extends $r{return_token_type_ids=!1;padding_side=`right`;constructor(e,t){if(super(),this._tokenizerJSON=e,this._tokenizerConfig=t,this._tokenizer=new Do(e,t),this.config=t,this.padding_side=t.padding_side??this.padding_side,this.mask_token=ju(t,`mask_token`),this.mask_token_id=this._tokenizer.token_to_id(this.mask_token),this.pad_token=ju(t,`pad_token`,`eos_token`),this.pad_token_id=this._tokenizer.token_to_id(this.pad_token),this.sep_token=ju(t,`sep_token`),this.sep_token_id=this._tokenizer.token_to_id(this.sep_token),this.unk_token=ju(t,`unk_token`),this.unk_token_id=this._tokenizer.token_to_id(this.unk_token),this.bos_token=ju(t,`bos_token`),this.bos_token_id=this._tokenizer.token_to_id(this.bos_token),this.eos_token=ju(t,`eos_token`),this.eos_token_id=this._tokenizer.token_to_id(this.eos_token),this.chat_template=t.chat_template??null,Array.isArray(this.chat_template)){let e=/* @__PURE__ */ Object.create(null);for(let{name:t,template:n}of this.chat_template){if(typeof t!=`string`||typeof n!=`string`)throw Error(`Chat template must be a list of objects with "name" and "template" properties`);e[t]=n}this.chat_template=e}this._compiled_template_cache=/* @__PURE__ */ new Map;let n=Mu(this._tokenizer);this.all_special_ids=n.map(e=>e.id),this.all_special_tokens=n.map(e=>e.content)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let o=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a});return new this(...o)}get_vocab(){return this._tokenizer.get_vocab()}get model_max_length(){return this._tokenizerConfig.model_max_length??1/0}get add_eos_token(){return this._tokenizerConfig.add_eos_token}get add_bos_token(){return this._tokenizerConfig.add_bos_token}convert_tokens_to_ids(e){return typeof e==`string`?this._tokenizer.token_to_id(e):e.map(e=>this._tokenizer.token_to_id(e))}_call(e,t={}){let{text_pair:n=null,add_special_tokens:r=!0,padding:i=!1,return_token_type_ids:a=null}=t,{truncation:o=null,max_length:s=null}=t,c=t.return_tensor??!0,l=Array.isArray(e),u;if(l){if(e.length===0)throw Error(`text array must be non-empty`);if(n!==null){if(!Array.isArray(n))throw Error(`text_pair must also be an array`);if(e.length!==n.length)throw Error(`text and text_pair must have the same length`);u=e.map((e,t)=>this._encode_plus(e,{text_pair:n[t],add_special_tokens:r,return_token_type_ids:a}))}else u=e.map(e=>this._encode_plus(e,{add_special_tokens:r,return_token_type_ids:a}))}else{if(e==null)throw Error(`text may not be null or undefined`);if(Array.isArray(n))throw Error("When specifying `text_pair`, since `text` is a string, `text_pair` must also be a string (i.e., not an array).");u=[this._encode_plus(e,{text_pair:n,add_special_tokens:r,return_token_type_ids:a})]}if(s===null?s=this.model_max_length:o===null&&(i===!0?(A.warn("`max_length` is ignored when `padding: true` and there is no truncation strategy. To pad to max length, use `padding: 'max_length'`."),s=this.model_max_length):i===!1&&(A.warn("Truncation was not explicitly activated but `max_length` is provided a specific value, please use `truncation: true` to explicitly truncate examples to max length."),o=!0)),i===!0&&(s=Math.min(ll(u.map(e=>e.input_ids.length))[0],s??1/0)),s=Math.min(s,this.model_max_length??1/0),i||o)for(let e=0;es?o&&Au(u[e],s):i&&ku(u[e],s,e=>e===`input_ids`?this.pad_token_id:0,this.padding_side);let d={};if(c){if(!(i&&o)&&u.some(e=>{for(let t of Object.keys(e))if(e[t].length!==u[0][t]?.length)return!0;return!1}))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=true' and 'truncation=true' to have batched tensors with the same length.`);let e=[u.length,u[0].input_ids.length];for(let t of Object.keys(u[0]))d[t]=new V(`int64`,BigInt64Array.from(u.flatMap(e=>e[t]).map(BigInt)),e)}else{for(let e of Object.keys(u[0]))d[e]=u.map(t=>t[e]);if(!l)for(let e of Object.keys(d))d[e]=d[e][0]}return d}_encode_text(e){return e===null?null:this._tokenizer.encode(e).tokens}_encode_plus(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{ids:i,attention_mask:a,token_type_ids:o}=this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r??this.return_token_type_ids});return{input_ids:i,attention_mask:a,...o?{token_type_ids:o}:{}}}tokenize(e,{pair:t=null,add_special_tokens:n=!1}={}){return this._tokenizer.tokenize(e,{text_pair:t,add_special_tokens:n})}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){return this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r}).ids}batch_decode(e,t={}){return e instanceof V&&(e=e.tolist()),e.map(e=>this.decode(e,t))}decode(e,t={}){if(e instanceof V&&(e=Du(e)),!Array.isArray(e)||e.length===0||!ni(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);return this.decode_single(e,t)}decode_single(e,{skip_special_tokens:t=!1,clean_up_tokenization_spaces:n=null}){return this._tokenizer.decode(e,{skip_special_tokens:t,clean_up_tokenization_spaces:n})}get_chat_template({chat_template:e=null,tools:t=null}={}){if(this.chat_template&&typeof this.chat_template==`object`){let n=this.chat_template;if(e!==null&&Object.hasOwn(n,e))e=n[e];else if(e===null){if(t!==null&&`tool_use`in n)e=n.tool_use;else if(`default`in n)e=n.default;else throw Error(`This model has multiple chat templates with no default specified! Please either pass a chat template or the name of the template you wish to use to the 'chat_template' argument. Available template names are ${Object.keys(n).sort()}.`)}}else if(e===null){if(this.chat_template)e=this.chat_template;else throw Error(`Cannot use apply_chat_template() because tokenizer.chat_template is not set and no template argument was passed! For information about writing templates and setting the tokenizer.chat_template attribute, please see the documentation at https://huggingface.co/docs/transformers/main/en/chat_templating`)}return e}apply_chat_template(e,t={}){let{tools:n=null,documents:r=null,chat_template:i=null,add_generation_prompt:a=!1,tokenize:o=!0,padding:s=!1,truncation:c=!1,max_length:l=null,return_tensor:u=!0,return_dict:d=!0,tokenizer_kwargs:f={},...p}=t;if(i=this.get_chat_template({chat_template:i,tools:n}),typeof i!=`string`)throw Error(`chat_template must be a string, but got ${typeof i}`);let m=this._compiled_template_cache.get(i);m===void 0&&(m=new mc(i),this._compiled_template_cache.set(i,m));let h=/* @__PURE__ */ Object.create(null);for(let e of Ou){let t=ju(this.config,e);t&&(h[e]=t)}let g=m.render({messages:e,add_generation_prompt:a,tools:n,documents:r,...h,...p});if(o){let e=this._call(g,{add_special_tokens:!1,padding:s,truncation:c,max_length:l,return_tensor:u,...f});return d?e:e.input_ids}return g}};function Nu(e,t,n,r){if(!(`language_codes`in e)||!Array.isArray(e.language_codes))throw Error("Tokenizer must have `language_codes` attribute set and it should be an array of language ids.");if(!(`languageRegex`in e)||!(e.languageRegex instanceof RegExp))throw Error("Tokenizer must have `languageRegex` attribute set and it should be a regular expression.");if(!(`lang_to_token`in e)||typeof e.lang_to_token!=`function`)throw Error("Tokenizer must have `lang_to_token` attribute set and it should be a function.");let i=r.src_lang,a=r.tgt_lang;if(!e.language_codes.includes(a))throw Error(`Target language code "${a}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);if(i!==void 0){if(!e.language_codes.includes(i))throw Error(`Source language code "${i}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);let t=e._tokenizer.post_processor?.config;if(t&&`single`in t){for(let n of t.single)if(`SpecialToken`in n&&e.languageRegex.test(n.SpecialToken.id)){n.SpecialToken.id=e.lang_to_token(i);break}}}return r.forced_bos_token_id=e._tokenizer.token_to_id(e.lang_to_token(a)),e._call(t,n)}var Pu={};Sr(Pu,{AlbertTokenizer:()=>Fu,AutoTokenizer:()=>W,BartTokenizer:()=>Iu,BertTokenizer:()=>Lu,BlenderbotSmallTokenizer:()=>Ru,BlenderbotTokenizer:()=>zu,BloomTokenizer:()=>Bu,CLIPTokenizer:()=>Hu,CamembertTokenizer:()=>Vu,CodeGenTokenizer:()=>Wu,CodeLlamaTokenizer:()=>Uu,CohereAsrTokenizer:()=>Ku,CohereTokenizer:()=>Gu,ConvBertTokenizer:()=>qu,DebertaTokenizer:()=>Yu,DebertaV2Tokenizer:()=>Ju,DistilBertTokenizer:()=>Xu,ElectraTokenizer:()=>Zu,EsmTokenizer:()=>Qu,FalconTokenizer:()=>$u,GPT2Tokenizer:()=>nd,GPTNeoXTokenizer:()=>td,GemmaTokenizer:()=>ed,HerbertTokenizer:()=>rd,LlamaTokenizer:()=>id,M2M100Tokenizer:()=>ad,MBart50Tokenizer:()=>cd,MBartTokenizer:()=>sd,MPNetTokenizer:()=>dd,MarianTokenizer:()=>od,MgpstrTokenizer:()=>ld,MobileBertTokenizer:()=>ud,NllbTokenizer:()=>fd,NougatTokenizer:()=>pd,PreTrainedTokenizer:()=>U,Qwen2Tokenizer:()=>md,RoFormerTokenizer:()=>gd,RobertaTokenizer:()=>hd,SiglipTokenizer:()=>_d,SpeechT5Tokenizer:()=>vd,SqueezeBertTokenizer:()=>yd,T5Tokenizer:()=>bd,TokenizersBackend:()=>U,VitsTokenizer:()=>Sd,Wav2Vec2CTCTokenizer:()=>Cd,WhisperTokenizer:()=>Ad,XLMRobertaTokenizer:()=>jd,XLMTokenizer:()=>Md});var Fu=class extends U{return_token_type_ids=!0},Iu=class extends U{},Lu=class extends U{return_token_type_ids=!0},Ru=class extends U{},zu=class extends U{},Bu=class extends U{},Vu=class extends U{},Hu=class extends U{},Uu=class extends U{},Wu=class extends U{},Gu=class extends U{},Ku=class extends U{},qu=class extends U{return_token_type_ids=!0},Ju=class extends U{return_token_type_ids=!0},Yu=class extends U{return_token_type_ids=!0},Xu=class extends U{},Zu=class extends U{return_token_type_ids=!0},Qu=class extends U{},$u=class extends U{},ed=class extends U{},td=class extends U{},nd=class extends U{},rd=class extends U{return_token_type_ids=!0},id=class extends U{padding_side=`left`},ad=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^__[a-z]{2,3}__$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e.slice(2,-2)),this.lang_to_token=e=>`__${e}__`}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},od=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^(>>\w+<<)\s*/g,this.supported_language_codes=Array.from(this.get_vocab().keys()).filter(e=>this.languageRegex.test(e)),A.warn('WARNING: `MarianTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}_encode_text(e){if(e===null)return null;let[t,...n]=e.trim().split(this.languageRegex);if(n.length===0)return super._encode_text(t);if(n.length===2){let[e,t]=n;return this.supported_language_codes.includes(e)||A.warn(`Unsupported language code "${e}" detected, which may lead to unexpected behavior. Should be one of: ${JSON.stringify(this.supported_language_codes)}`),ai([e],super._encode_text(t))}}},sd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{2}_[A-Z]{2}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},cd=class extends sd{},ld=class extends U{},ud=class extends U{return_token_type_ids=!0},dd=class extends U{},fd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{3}_[A-Z][a-z]{3}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},pd=class extends U{},md=class extends U{},hd=class extends U{},gd=class extends U{return_token_type_ids=!0},_d=class extends U{},vd=class extends U{},yd=class extends U{return_token_type_ids=!0},bd=class extends U{},xd=class extends mo{decode_chain(e){let t=``;for(let n=1;n[t,e]),[`burmese`,`my`],[`valencian`,`ca`],[`flemish`,`nl`],[`haitian`,`ht`],[`letzeburgesch`,`lb`],[`pushto`,`ps`],[`panjabi`,`pa`],[`moldavian`,`ro`],[`moldovan`,`ro`],[`sinhalese`,`si`],[`castilian`,`es`]]);function Dd(e){e=e.toLowerCase();let t=Ed.get(e);if(t===void 0){let n=e.match(/^<\|([a-z]{2})\|>$/);if(n&&(e=n[1]),Td.has(e))t=e;else{let t=e.length===2?Td.keys():Td.values();throw Error(`Language "${e}" is not supported. Must be one of: ${JSON.stringify(Array.from(t))}`)}}return t}var Od=/* @__PURE__ */ RegExp(`^[\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E]+$`,`gu`),kd=.1,Ad=class extends U{get timestamp_begin(){return this._tokenizer.token_to_id(`<|notimestamps|>`)+1}_decode_asr(e,{return_timestamps:t=!1,return_language:n=!1,time_precision:r=null,force_full_sequences:i=!0}={}){if(r===null)throw Error(`Must specify time_precision`);let a=null,o=t===`word`;function s(){return{language:a,timestamp:[null,null],text:``}}let c=[],l=s(),u=0,d=this.timestamp_begin,f=d+1500,p=[],m=[],h=!1,g=null,_=new Set(this.all_special_ids);for(let n of e){let e=n.tokens,i=o?n.token_timestamps:null,v=null,y=d;if(`stride`in n){let[t,i,a]=n.stride;if(u-=i,g=t-a,i&&(y=i/r+d),a)for(let t=e.length-1;t>=0;--t){let n=Number(e[t]);if(n>=d){if(v!==null&&(n-d)*r=d&&g<=f){let e=hl((g-d)*r+u,2);if(v!==null&&g>=v)h=!0;else if(h||p.length>0&&g0&&l.timestamp[1]!==null))for(let e of l.words)e.timestamp[1]>l.timestamp[1]&&l.timestamp[1]>=e.timestamp[0]&&(e.timestamp[1]=l.timestamp[1]);c.push(l),p=[],b=[],m=[],x=[],l=s()}}else if(b.push(g),o){let e=hl(i[n]+u,2),t;if(n+10?(p.push(b),o&&m.push(x)):p.every(e=>e.length===0)&&(l=s(),p=[],b=[],m=[],x=[])}if(p.length>0){if(i&&t)throw Error(`Whisper did not predict an ending timestamp, which can happen if audio is cut off in the middle of a word. Also make sure WhisperTimeStampLogitsProcessor was used during generation.`);let[e,n]=this.findLongestCommonSequence(p,m),r=this.decode(e);l.text=r,o&&(l.words=this.collateWordTimestamps(e,n,a)),c.push(l)}let v=/* @__PURE__ */ Object.create(null),y=c.map(e=>e.text).join(``);if(t||n){for(let e=0;e0,o=a?[]:null,s=a?t[0]:null;for(let c=1;ce===g[n]&&s[i+n][0]-kd<=t[c][m+n][0]).length:p.filter((e,t)=>e===g[t]).length;let v=e/1e4,y=_/e+v;_>1&&y>u&&(u=y,d=[i,o,m,h])}let[p,m,h,g]=d,_=Math.floor((m+p)/2),v=Math.floor((g+h)/2);if(a&&u===0&&r>0){let e=s[r-1][0],n=t[c].findIndex(t=>t[0]>=e);v=n===-1?l.length:n}i.push(...n.slice(0,_)),n=l.slice(v),r=n.length,a&&(o.push(...s.slice(0,_)),s=t[c].slice(v))}return i.push(...n),a?(o.push(...s),[i,o]):[i,[]]}collateWordTimestamps(e,t,n){let[r,i,a]=this.combineTokensIntoWords(e,n),o=[];for(let e=0;e=r){let e=((t-r)*n).toFixed(2);i.push(`<|${e}|>`),i.push([])}else i[i.length-1].push(t);return i=i.map(e=>typeof e==`string`?e:super.decode(e,t)),i.join(``)}splitTokensOnUnicode(e){let t=this.decode(e,{decode_with_timestamps:!0}),n=[],r=[],i=[],a=[],o=[],s=0;for(let c=0;c=this._tokenizer.token_to_id(`<|endoftext|>`),d=s.startsWith(` `),f=s.trim(),p=Od.test(f);if(u||d||p||i.length===0)i.push(s),a.push(c),o.push(l);else{let e=i.length-1;i[e]+=s,a[e].push(...c),o[e].push(...l)}}return[i,a,o]}mergePunctuations(e,t,n,r,i){let a=structuredClone(e),o=structuredClone(t),s=structuredClone(n),c=a.length-2,l=a.length-1;for(;c>=0;)a[c].startsWith(` `)&&r.includes(a[c].trim())?(a[l]=a[c]+a[l],o[l]=ai(o[c],o[l]),s[l]=ai(s[c],s[l]),a[c]=``,o[c]=[],s[c]=[]):l=c,--c;for(c=0,l=1;le),o.filter(e=>e.length>0),s.filter(e=>e.length>0)]}},jd=class extends U{},Md=class extends U{return_token_type_ids=!0;constructor(e,t){super(e,t),A.warn('WARNING: `XLMTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}},W=class{static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let[o,s]=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a}),c=s.tokenizer_class?.replace(/Fast$/,``)??`PreTrainedTokenizer`,l=Pu[c];return l||=(A.warn(`Unknown tokenizer class "${c}", attempting to construct from base class.`),U),new l(o,s)}},Nd=`https://github.com/huggingface/transformers.js/issues/new/choose`,Pd=`preprocessor_config.json`,Fd=`preprocessor_config.json`,Id=`processor_config.json`,Ld=`chat_template.jinja`,G=class extends $r{static classes=[`image_processor_class`,`tokenizer_class`,`feature_extractor_class`];static uses_processor_config=!1;static uses_chat_template_file=!1;constructor(e,t,n){super(),this.config=e,this.components=t,this.chat_template=n}get image_processor(){return this.components.image_processor}get tokenizer(){return this.components.tokenizer}get feature_extractor(){return this.components.feature_extractor}apply_chat_template(e,t={}){if(!this.tokenizer)throw Error(`Unable to apply chat template without a tokenizer.`);return this.tokenizer.apply_chat_template(e,{tokenize:!1,chat_template:this.chat_template??void 0,...t})}batch_decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.batch_decode(...e)}decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.decode(...e)}async _call(e,...t){for(let n of[this.image_processor,this.feature_extractor,this.tokenizer])if(n)return n(e,...t);throw Error(`No image processor, feature extractor, or tokenizer found.`)}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([this.uses_processor_config?rl(e,Id,!0,t):{},Promise.all(this.classes.filter(e=>e in this).map(async n=>{let r=await this[n].from_pretrained(e,t);return[n.replace(/_class$/,``),r]})).then(Object.fromEntries),this.uses_chat_template_file?nl(e,Ld,!0,t):null]);return new this(n,r,i)}};Sr({},{ChatterboxProcessor:()=>Mf,CohereAsrProcessor:()=>Pf,Florence2Processor:()=>Sm,Gemma3Processor:()=>Cm,Gemma3nProcessor:()=>wm,Gemma4Processor:()=>Tm,Glm46VProcessor:()=>Dm,GraniteSpeechProcessor:()=>Om,GroundingDinoProcessor:()=>Am,Idefics3Processor:()=>Pm,JinaCLIPProcessor:()=>Im,Lfm2VlProcessor:()=>Lm,LlavaProcessor:()=>Rm,MgpstrProcessor:()=>Bm,MoonshineProcessor:()=>Vm,OwlViTProcessor:()=>Hm,PaliGemmaProcessor:()=>Gm,Phi3VProcessor:()=>Jm,PixtralProcessor:()=>Ym,Processor:()=>G,PyAnnoteProcessor:()=>Xm,Qwen2VLProcessor:()=>Em,Qwen2_5_VLProcessor:()=>Zm,Qwen3VLProcessor:()=>Qm,Sam2Processor:()=>eh,Sam2VideoProcessor:()=>th,SamProcessor:()=>$m,SmolVLMProcessor:()=>Pm,SpeechT5Processor:()=>nh,UltravoxProcessor:()=>rh,VLChatProcessor:()=>Fm,VoxtralProcessor:()=>ch,VoxtralRealtimeProcessor:()=>mh,Wav2Vec2Processor:()=>hh,Wav2Vec2ProcessorWithLM:()=>gh,WhisperProcessor:()=>_h});var Rd=class extends $r{constructor(e){super(),this.config=e}static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t);return new this(n)}};function zd(e,t){if(!(e instanceof Float32Array||e instanceof Float64Array))throw Error(`${t} expects input to be a Float32Array or a Float64Array, but got ${e?.constructor?.name??typeof e} instead. If using the feature extractor directly, remember to use \`load_audio(url, sampling_rate)\` to obtain the raw audio data of the file/url.`)}var Bd={};Sr(Bd,{ASTFeatureExtractor:()=>df,ChatterboxFeatureExtractor:()=>pf,ClapFeatureExtractor:()=>mf,CohereAsrFeatureExtractor:()=>_f,DacFeatureExtractor:()=>vf,EncodecFeatureExtractor:()=>ff,FeatureExtractor:()=>Rd,Gemma3nAudioFeatureExtractor:()=>yf,Gemma4AudioFeatureExtractor:()=>bf,GraniteSpeechFeatureExtractor:()=>xf,MoonshineFeatureExtractor:()=>Sf,ParakeetFeatureExtractor:()=>gf,PyAnnoteFeatureExtractor:()=>Cf,SeamlessM4TFeatureExtractor:()=>wf,SnacFeatureExtractor:()=>Tf,SpeechT5FeatureExtractor:()=>Ef,VoxtralRealtimeFeatureExtractor:()=>kf,Wav2Vec2FeatureExtractor:()=>Df,WeSpeakerFeatureExtractor:()=>Of,WhisperFeatureExtractor:()=>Af});var Vd={fromWeb:()=>{}};async function Hd(e,t){if(O.IS_BROWSER_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save a file from a Web Worker.`);let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e,r.click(),r.remove(),URL.revokeObjectURL(n)}else if(O.IS_FS_AVAILABLE){let n=t.stream();Vd.fromWeb(n),Cr.createWriteStream(e),await void 0}else throw Error(`Unable to save because filesystem is disabled in this environment.`)}async function Ud(e,t){if(typeof AudioContext>`u`)throw Error("Unable to load audio from path/URL since `AudioContext` is not available in your environment. Instead, audio data should be passed directly to the pipeline/processor. For more information and some example code, see https://huggingface.co/docs/transformers.js/guides/node-audio-processing.");let n=await(await Jc(e)).arrayBuffer(),r=new AudioContext({sampleRate:t});t===void 0&&A.warn(`No sampling rate provided, using default of ${r.sampleRate}Hz.`);let i=await r.decodeAudioData(n),a;if(i.numberOfChannels===2){let e=Math.sqrt(2),t=i.getChannelData(0),n=i.getChannelData(1);a=new Float32Array(t.length);for(let r=0;r2595*Math.log10(1+e/700),kaldi:e=>1127*Math.log(1+e/700),slaney:(e,t=1e3,n=15,r=27/Math.log(6.4))=>e>=t?n+Math.log(e/t)*r:3*e/200};function Yd(e,t=`htk`){let n=Jd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}var Xd={htk:e=>700*(10**(e/2595)-1),kaldi:e=>700*(Math.exp(e/1127)-1),slaney:(e,t=1e3,n=15,r=Math.log(6.4)/27)=>e>=n?t*Math.exp(r*(e-n)):200*e/3};function Zd(e,t=`htk`){let n=Xd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}function Qd(e,t){let n=Float64Array.from({length:t.length-1},(e,n)=>t[n+1]-t[n]),r=Array.from({length:e.length},()=>Array(t.length));for(let n=0;nArray(e.length));for(let t=0;te+r*n)}function ef(e,t,n,r,i,a=null,o=`htk`,s=!1){if(a!==null&&a!==`slaney`)throw Error(`norm must be one of null or "slaney"`);if(e<2)throw Error(`Require num_frequency_bins: ${e} >= 2`);if(n>r)throw Error(`Require min_frequency: ${n} <= max_frequency: ${r}`);let c=$d(Yd(n,o),Yd(r,o),t+2),l=Zd(c,o),u;if(s){let t=i/((e-1)*2);u=Yd(Float64Array.from({length:e},(e,n)=>n*t),o),l=c}else u=$d(0,Math.floor(i/2),e);let d=Qd(u,l);if(a!==null&&a===`slaney`)for(let n=0;ni)throw Error(`frame_length (${n}) may not be larger than fft_length (${i})`);if(w!==n)throw Error(`Length of the window (${w}) must equal frame_length (${n})`);if(r<=0)throw Error(`hop_length must be greater than zero`);if(a===null&&d!==null)throw Error("You have provided `mel_filters` but `power` is `None`. Mel spectrogram computation is not yet supported for complex-valued spectrogram. Specify `power` to fix this issue.");if(!u)throw Error("`preemphasis_htk_flavor=false` is not currently supported.");if(o){let t=Math.floor(n/2);switch(s){case`reflect`:e=tf(e,t,t);break;case`constant`:{let n=new e.constructor(e.length+2*t);n.set(e,t),e=n;break}case`semicausal`:{let n=new e.constructor(e.length+t);n.set(e,t),e=n;break}default:throw Error(`pad_mode="${s}" not implemented yet.`)}}let te=Math.floor(1+Math.floor((e.length-n)/r));y!==null&&tete?x&&(ie=b):ie=re=b);let ae=new pl(i),oe=new Float64Array(i),se=new Float64Array(ae.outputBufferSize),ce=new Float32Array(ne*ie);for(let i=0;i=1;--e)oe[e]-=l*oe[e-1];oe[0]*=1-l}for(let e=0;ee**.85);break;default:throw Error(`Unknown window type ${t}.`)}if(n&&(o=o.subarray(0,e)),r===null||e===r)return o;if(e>r)throw Error(`Length of the window (${e}) may not be larger than frame_length (${r})`);let s=new Float64Array(r),c=i?Math.floor((r-e)/2):0;return s.set(o,c),s}function cf(e,t){let n=e.reduce((e,t)=>e+t.length,0),r=/* @__PURE__ */ new ArrayBuffer(44),i=new DataView(r);return lf(i,0,`RIFF`),i.setUint32(4,36+n*4,!0),lf(i,8,`WAVE`),lf(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,3,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*4,!0),i.setUint16(32,4,!0),i.setUint16(34,32,!0),lf(i,36,`data`),i.setUint32(40,n*4,!0),new Blob([r,...e.map(e=>e.buffer instanceof ArrayBuffer?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e.slice())],{type:`audio/wav`})}function lf(e,t,n){for(let r=0;re+t.length,0),t=new Float32Array(e),n=0;for(let e of this.audio)t.set(e,n),n+=e.length;return t}return this.audio}toBlob(){let e=this.audio;return e instanceof Float32Array&&(e=[e]),cf(e,this.sampling_rate)}async save(e){return Hd(e,this.toBlob())}},df=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hann`,{periodic:!1}),this.mean=this.config.mean,this.std=this.config.std}async _extract_fbank_features(e,t){return of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e){zd(e,`ASTFeatureExtractor`);let t=await this._extract_fbank_features(e,this.config.max_length);if(this.config.do_normalize){let e=this.std*2,n=t.data;for(let t=0;t0){if(n===`rand_trunc`){let n=Math.floor(bc.random()*(a+1));e=e.subarray(n,n+t),i=await this._extract_fbank_features(e,this.mel_filters_slaney,this.config.nb_max_samples)}else throw Error(`Truncation strategy "${n}" not implemented`)}else{if(a<0){let n=new Float64Array(t);if(n.set(e),r===`repeat`)for(let r=e.length;r=1;--n)e[n]-=t*e[n-1];return await of(e,this.window,this.window.length,this.config.hop_length,{fft_length:this.config.n_fft,power:2,mel_filters:this.config.mel_filters,log_mel:`log`,mel_floor:-1/0,pad_mode:`constant`,center:!0,transpose:!0,mel_offset:2**-24})}async _call(e){zd(e,`ParakeetFeatureExtractor`);let t=await this._extract_fbank_features(e),n=Math.floor((e.length+Math.floor(this.config.n_fft/2)*2-this.config.n_fft)/this.config.hop_length),r=t.data;r.fill(0,n*t.dims[1]);let[i,a]=t.dims,o=new Float64Array(a),s=new Float64Array(a);for(let e=0;e1?n-1:1;for(let e=0;e=l){s.push(e.slice(c,l));break}let t=Math.max(c,c+a-o),n=Math.min(c+a,l),i;i=n<=t?c+a:this._find_split_point_energy(e,t,n,r),i=Math.max(c+1,Math.min(i,l)),s.push(e.slice(c,i)),c=i}return s}_find_split_point_energy(e,t,n,r){let i=n-t;if(i<=r)return Math.floor((t+n)/2);let a=1/0,o=t,s=i-r;for(let n=0;n<=s;n+=r){let i=0;for(let a=0;at&&(e=e.slice(0,t)),r&&e.length%i!==0){let t=i-e.length%i,n=new Float64Array(e.length+t);n.set(e),this.config.padding_value!==0&&n.fill(this.config.padding_value,e.length),e=n}let a=await this._extract_fbank_features(e,this.config.max_length),o=_u([1,a.dims[0]],!0);return{input_features:a.unsqueeze_(0),input_features_mask:o}}},bf=class extends yf{async _extract_fbank_features(e,t){let{frame_length:n,hop_length:r,fft_length:i}=this.config,a=Math.floor(n/2),o=Math.floor((e.length+a-(n+1))/r)+1;return of(e,this.window,n,r,{fft_length:i,center:!0,pad_mode:`semicausal`,onesided:!0,preemphasis:this.config.preemphasis,preemphasis_htk_flavor:this.config.preemphasis_htk_flavor,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:this.config.mel_floor,mel_floor_mode:`add`,remove_dc_offset:!1,transpose:!0,max_num_frames:o})}async _call(e,t={}){zd(e,`Gemma4AudioFeatureExtractor`);let n=e.length,r=await super._call(e,t),{input_features:i}=r,[,a,o]=i.dims,{frame_length:s,hop_length:c}=this.config,l=Math.floor(s/2),u=s+1,d=new Uint8Array(n+l+(t.pad_to_multiple_of??128));d.fill(1,l,l+n);let f=new Uint8Array(a);for(let e=0;e({id:e,start:t*n,end:r*n,confidence:i/(r-t)})))}return r}},wf=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`povey`,{periodic:!1})}async _extract_fbank_features(e,t){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e,{padding:t=!0,pad_to_multiple_of:n=2,do_normalize_per_mel_bins:r=!0,return_attention_mask:i=!0}={}){zd(e,`SeamlessM4TFeatureExtractor`);let a=await this._extract_fbank_features(e,this.config.max_length);if(r){let[e,t]=a.dims,n=a.data;for(let r=0;r0){let n=new Float32Array(t*(e+s));n.set(r),n.fill(this.config.padding_value,r.length);let c=e+s;a=new V(a.type,n,[c,t]),i&&(o=new V(`int64`,new BigInt64Array(c),[1,c]),o.data.fill(1n,0,e))}}let[s,c]=a.dims,l=this.config.stride;if(s%l!==0)throw Error(`The number of frames (${s}) must be a multiple of the stride (${l}).`);let u=a.view(1,Math.floor(s/l),c*l),d={input_features:u};if(i){let e=u.dims[1],t=new BigInt64Array(e);if(o){let e=o.data;for(let n=1,r=0;ne+t,0)/e.length,n=e.reduce((e,n)=>e+(n-t)**2,0)/e.length;return e.map(e=>(e-t)/Math.sqrt(n+1e-7))}async _call(e){zd(e,`Wav2Vec2FeatureExtractor`),e instanceof Float64Array&&(e=new Float32Array(e));let t=e;this.config.do_normalize&&(t=this._zero_mean_unit_var_norm(t));let n=[1,t.length];return{input_values:new V(`float32`,t,n),attention_mask:new V(`int64`,new BigInt64Array(t.length).fill(1n),n)}}},Of=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hamming`,{periodic:!1}),this.min_num_frames=this.config.min_num_frames}async _extract_fbank_features(e){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,transpose:!0,min_num_frames:this.min_num_frames})}async _call(e){zd(e,`WeSpeakerFeatureExtractor`);let t=(await this._extract_fbank_features(e)).unsqueeze_(0);if(this.config.fbank_centering_span===null){let e=t.mean(1).data,n=t.data,[r,i,a]=t.dims;for(let t=0;tr?(e.length>this.config.n_samples&&A.warn("Attempting to extract features for audio longer than 30 seconds. If using a pipeline to extract transcript from a long audio clip, remember to specify `chunk_length_s` and/or `stride_length_s`."),n=e.slice(0,r)):(n=new Float32Array(r),n.set(e)),{input_features:(await this._extract_fbank_features(n)).unsqueeze_(0)}}},jf=class{static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t),r=n.feature_extractor_type,i=Bd[r];if(!i)throw Error(`Unknown feature_extractor_type: '${r}'. Please report this at ${Nd}.`);return new i(n)}},Mf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;async _call(e,t=null){let n=this.tokenizer(e),r=t?await this.feature_extractor(t):{};return{...n,...r}}},Nf=/* @__PURE__ */ new Set([`ja`,`zh`]),Pf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;get_decoder_prompt_ids(e=`en`){let t=[`▁`,`<|startofcontext|>`,`<|startoftranscript|>`,`<|emo:undefined|>`,`<|${e}|>`,`<|${e}|>`,`<|pnc|>`,`<|noitn|>`,`<|notimestamp|>`,`<|nodiarize|>`];return this.tokenizer.convert_tokens_to_ids(t)}static join_chunks(e,t=`en`){let n=e.filter(e=>e&&e.trim());if(n.length===0)return``;let r=Nf.has(t)?``:` `;return[n[0].trimEnd(),...n.slice(1).map(e=>e.trim())].join(r)}async _call(e){return await this.feature_extractor(e)}},Ff={},If,Lf,Rf;if(O.IS_WEB_ENV)If=(e,t)=>{if(!self.OffscreenCanvas)throw Error(`OffscreenCanvas not supported by this environment.`);return new self.OffscreenCanvas(e,t)},Rf=self.createImageBitmap,Lf=self.ImageData;else if(Ff)Rf=async e=>{let t=(await e.metadata()).channels,{data:n,info:r}=await e.rotate().raw().toBuffer({resolveWithObject:!0}),i=new Vf(new Uint8ClampedArray(n),r.width,r.height,r.channels);return t!==void 0&&t!==r.channels&&i.convert(t),i};else throw Error(`Unable to load image processing library.`);var zf={0:`nearest`,1:`lanczos`,2:`bilinear`,3:`bicubic`,4:`box`,5:`hamming`},Bf=/* @__PURE__ */ new Map([[`png`,`image/png`],[`jpg`,`image/jpeg`],[`jpeg`,`image/jpeg`],[`gif`,`image/gif`]]),Vf=class e{constructor(e,t,n,r){this.data=e,this.width=t,this.height=n,this.channels=r}get size(){return[this.width,this.height]}static async read(t){if(t instanceof e)return t;if(typeof t==`string`||t instanceof URL)return await this.fromURL(t);if(t instanceof Blob)return await this.fromBlob(t);if(typeof HTMLCanvasElement<`u`&&t instanceof HTMLCanvasElement||typeof OffscreenCanvas<`u`&&t instanceof OffscreenCanvas)return this.fromCanvas(t);throw Error(`Unsupported input type: ${typeof t}`)}static fromCanvas(t){if(!O.IS_WEB_ENV)throw Error(`fromCanvas() is only supported in browser environments.`);let n=t.getContext(`2d`).getImageData(0,0,t.width,t.height).data;return new e(n,t.width,t.height,4)}static async fromURL(e){let t=await Jc(e);if(t.status!==200)throw Error(`Unable to read image from "${e}" (${t.status} ${t.statusText})`);let n=await t.blob();return this.fromBlob(n)}static async fromBlob(e){if(O.IS_WEB_ENV){let t=await Rf(e),n=If(t.width,t.height).getContext(`2d`);return n.drawImage(t,0,0),new this(n.getImageData(0,0,t.width,t.height).data,t.width,t.height,4)}{let t=Ff(await e.arrayBuffer());return await Rf(t)}}static fromTensor(t,n=`CHW`){if(t.dims.length!==3)throw Error(`Tensor should have 3 dimensions, but has ${t.dims.length} dimensions.`);if(n===`CHW`)t=t.permute(1,2,0);else if(n!==`HWC`)throw Error(`Unsupported channel format: ${n}`);if(!(t.data instanceof Uint8ClampedArray||t.data instanceof Uint8Array))throw Error(`Unsupported tensor type: ${t.type}`);switch(t.dims[2]){case 1:case 2:case 3:case 4:return new e(t.data,t.dims[1],t.dims[0],t.dims[2]);default:throw Error(`Unsupported number of channels: ${t.dims[2]}`)}}grayscale(){if(this.channels===1)return this;let e=new Uint8ClampedArray(this.width*this.height*1);switch(this.channels){case 3:case 4:for(let t=0,n=0;t=0?c=r:u=-r,i>=0?l=i:d=-i,s.drawImage(o,c,l,t,n,u,d,t,n),new e(s.getImageData(0,0,t,n).data,t,n,4).convert(a)}{let e=this.toSharp();if(r>=0&&i>=0)e=e.extract({left:Math.floor(r),top:Math.floor(i),width:t,height:n});else if(r<=0&&i<=0){let a=Math.floor(-i),o=Math.floor(-r);e=e.extend({top:a,left:o,right:t-this.width-o,bottom:n-this.height-a})}else{let a=[0,0],o=0;i<0?(a[0]=Math.floor(-i),a[1]=n-this.height-a[0]):o=Math.floor(i);let s=[0,0],c=0;r<0?(s[0]=Math.floor(-r),s[1]=t-this.width-s[0]):c=Math.floor(r),e=e.extend({top:a[0],bottom:a[1],left:s[0],right:s[1]}).extract({left:c,top:o,width:t,height:n})}return await Rf(e)}}async toBlob(e=`image/png`,t=1){if(!O.IS_WEB_ENV)throw Error(`toBlob() is only supported in browser environments.`);return await this.toCanvas().convertToBlob({type:e,quality:t})}toTensor(e=`CHW`){let t=new V(`uint8`,new Uint8Array(this.data),[this.height,this.width,this.channels]);if(e!==`HWC`){if(e===`CHW`)t=t.permute(2,0,1);else throw Error(`Unsupported channel format: ${e}`)}return t}toCanvas(){if(!O.IS_WEB_ENV)throw Error(`toCanvas() is only supported in browser environments.`);let e=this.clone().rgba(),t=If(e.width,e.height),n=new Lf(e.data,e.width,e.height);return t.getContext(`2d`).putImageData(n,0,0),t}split(){let{data:t,width:n,height:r,channels:i}=this,a=t.constructor,o=t.length/i,s=Array.from({length:i},()=>new a(o));for(let e=0;enew e(t,n,r,1))}_update(e,t,n,r=null){return this.data=e,this.width=t,this.height=n,r!==null&&(this.channels=r),this}clone(){return new e(this.data.slice(),this.width,this.height,this.channels)}convert(e){if(this.channels===e)return this;switch(e){case 1:this.grayscale();break;case 3:this.rgb();break;case 4:this.rgba();break;default:throw Error(`Conversion failed due to unsupported number of channels: ${this.channels}`)}return this}async save(e){if(O.IS_WEB_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save an image from a Web Worker.`);let t=e.split(`.`).pop().toLowerCase(),n=Bf.get(t)??`image/png`;return Hd(e,await this.toBlob(n))}if(O.IS_FS_AVAILABLE)await this.toSharp().toFile(e);else throw Error(`Unable to save the image because filesystem is disabled in this environment.`)}toSharp(){if(O.IS_WEB_ENV)throw Error(`toSharp() is only supported in server-side environments.`);return Ff(this.data,{raw:{width:this.width,height:this.height,channels:this.channels}})}};Vf.read.bind(Vf);function Hf(e,t,n=0,r=null){let i=e/t,a=gl(i)*t;return r!==null&&a>r&&(a=Math.floor(i)*t),at&&i.push(e)}else{let e=ll(n.data)[1];if(e===c-1||(a=ol(n.data),a[e]e*o[(t+1)%2])),u.boxes.push(n),u.classes.push(t),u.scores.push(a[t])}}l.push(u)}return l}function Kf(e,t=null){let n=e.logits,r=n.dims[0];if(t!==null&&t.length!==r)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let i=[];for(let e=0;el[n]&&(l[n]=t[n],u[n]=e)}let d=Array(a.dims[0]);for(let e=0;ee!==void 0);i.push({segmentation:c,labels:f})}return i}function qf(e,t,n,r){let i=[],a=[],o=[];for(let s=0;sn&&(i.push(l),a.push(d),o.push(u))}return[i,a,o]}function Jf(e,t,n,r=.5,i=.8){let a=[],o=0,s=0,c=t[n].data;for(let t=0;t=r&&++s;let l=o>0&&s>0;return l&&=o/s>i,[l,a]}function Yf(e,t,n,r,i,a=null,o=null){let[s,c]=o??e[0].dims,l=new V(`int32`,new Int32Array(s*c),[s,c]),u=[];if(o!==null)for(let t=0;tf[e]&&(d[e]=n,f[e]=i[e])}let p=0,m=l.data;for(let a=0;a200)throw Error(`absolute aspect ratio must be smaller than 200, got ${Math.max(e,t)/Math.min(e,t)}`);let o=Math.round(e/n)*n,s=Math.round(t/n)*n;if(a*o*s>i){let r=Math.sqrt(a*e*t/i);o=Math.max(n,Math.floor(e/r/n)*n),s=Math.max(n,Math.floor(t/r/n)*n)}else if(a*o*si?c=Math.floor(i*s/r):i>r&&(s=Math.floor(r*c/i)),await e.resize(c,s,{resample:n}))}async crop_margin(e,t=200){let n=e.clone().grayscale(),r=cl(n.data)[0],i=ll(n.data)[0]-r;if(i===0)return e;let a=t/255,o=n.width,s=n.height,c=0,l=0,u=n.data;for(let e=0;ethis.preprocess(e)));return{pixel_values:du(n.map(e=>e.pixel_values),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}static async from_pretrained(e,t={}){let n=await rl(e,Fd,!0,t);return new this(n)}},$f={};Sr($f,{BeitFeatureExtractor:()=>ep,BitImageProcessor:()=>tp,CHMv2ImageProcessor:()=>rp,CLIPFeatureExtractor:()=>ap,CLIPImageProcessor:()=>ip,ChineseCLIPFeatureExtractor:()=>np,ConvNextFeatureExtractor:()=>sp,ConvNextImageProcessor:()=>op,DINOv3ViTImageProcessor:()=>fp,DPTFeatureExtractor:()=>gp,DPTImageProcessor:()=>hp,DeiTFeatureExtractor:()=>lp,DeiTImageProcessor:()=>cp,DetrFeatureExtractor:()=>dp,DetrImageProcessor:()=>up,DonutFeatureExtractor:()=>mp,DonutImageProcessor:()=>pp,EfficientNetImageProcessor:()=>_p,GLPNFeatureExtractor:()=>wp,Gemma3ImageProcessor:()=>vp,Gemma4ImageProcessor:()=>xp,Glm46VImageProcessor:()=>Cp,GroundingDinoImageProcessor:()=>Tp,Idefics3ImageProcessor:()=>Ep,ImageFeatureExtractor:()=>K,ImageProcessor:()=>K,JinaCLIPImageProcessor:()=>Op,Lfm2VlImageProcessor:()=>Pp,LlavaOnevisionImageProcessor:()=>Fp,Mask2FormerImageProcessor:()=>Rp,MaskFormerFeatureExtractor:()=>Lp,MaskFormerImageProcessor:()=>Ip,MobileNetV1FeatureExtractor:()=>Bp,MobileNetV1ImageProcessor:()=>zp,MobileNetV2FeatureExtractor:()=>Hp,MobileNetV2ImageProcessor:()=>Vp,MobileNetV3FeatureExtractor:()=>Wp,MobileNetV3ImageProcessor:()=>Up,MobileNetV4FeatureExtractor:()=>Kp,MobileNetV4ImageProcessor:()=>Gp,MobileViTFeatureExtractor:()=>Jp,MobileViTImageProcessor:()=>qp,NougatImageProcessor:()=>Yp,OwlViTFeatureExtractor:()=>Zp,OwlViTImageProcessor:()=>Xp,Owlv2ImageProcessor:()=>Qp,Phi3VImageProcessor:()=>im,PixtralImageProcessor:()=>am,PvtImageProcessor:()=>om,Qwen2VLImageProcessor:()=>Sp,RTDetrImageProcessor:()=>sm,Sam2ImageProcessor:()=>cm,Sam3ImageProcessor:()=>cm,SamImageProcessor:()=>cm,SapiensFeatureExtractor:()=>um,SapiensImageProcessor:()=>lm,SegformerFeatureExtractor:()=>fm,SegformerImageProcessor:()=>dm,SiglipImageProcessor:()=>pm,SmolVLMImageProcessor:()=>Ep,Swin2SRImageProcessor:()=>mm,VLMImageProcessor:()=>Dp,ViTFeatureExtractor:()=>gm,ViTImageProcessor:()=>hm,VitMatteImageProcessor:()=>_m,VitPoseImageProcessor:()=>vm,YolosFeatureExtractor:()=>bm,YolosImageProcessor:()=>ym});var ep=class extends K{},tp=class extends K{},np=class extends K{},rp=class extends K{},ip=class extends K{},ap=class extends ip{},op=class extends K{constructor(e){super(e),this.crop_pct=this.config.crop_pct??224/256}async resize(e){let t=this.size?.shortest_edge;if(t===void 0)throw Error(`Size dictionary must contain 'shortest_edge' key.`);if(t<384){let n=Math.floor(t/this.crop_pct),[r,i]=this.get_resize_output_image_size(e,{shortest_edge:n});e=await e.resize(r,i,{resample:this.resample}),e=await e.center_crop(t,t)}else e=await e.resize(t,t,{resample:this.resample});return e}},sp=class extends op{},cp=class extends K{},lp=class extends cp{},up=class extends K{async _call(e){let t=await super._call(e),n=_u([t.pixel_values.dims[0],64,64],1n);return{...t,pixel_mask:n}}post_process_object_detection(...e){return Gf(...e)}post_process_panoptic_segmentation(...e){return Zf(...e)}post_process_instance_segmentation(...e){return Qf(...e)}},dp=class extends up{},fp=class extends K{},pp=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t,s=this.image_mean;Array.isArray(this.image_mean)||(s=Array(o).fill(s));let c=this.image_std;Array.isArray(c)||(c=Array(o).fill(s));let l=s.map((e,t)=>-e/c[t]);return super.pad_image(e,t,n,{center:!0,constant_values:l,...r})}},mp=class extends pp{},hp=class extends K{},gp=class extends hp{},_p=class extends K{constructor(e){super(e),this.include_top=this.config.include_top??!0,this.include_top&&(this.image_std=this.image_std.map(e=>e*e))}},vp=class extends K{};function yp(e,t,n,r,i){let a=r*n**2,o=Math.sqrt(a/(e*t)),s=i*n,c=Math.floor(o*e/s)*s,l=Math.floor(o*t/s)*s;if(c===0&&l===0)throw Error(`Attempting to resize to a 0 x 0 image. Resized height should be divisible by \`pooling_kernel_size * patch_size\`=${s}.`);let u=Math.floor(r/i**2)*s;return c===0?(c=s,l=Math.min(Math.floor(t/e)*s,u)):l===0&&(l=s,c=Math.min(Math.floor(e/t)*s,u)),[c,l]}function bp(e,t,n,r,i,a,o){let s=Math.floor(t/i),c=Math.floor(n/i),l=s*c,u=i*i*r,d=new Float32Array(a*u),f=0;for(let t=0;ta),0));let l=a.dims[0]/o,u=a.dims[1],d=Math.floor(a.dims[2]/c),f=Math.floor(a.dims[3]/c);return{pixel_values:a.view(l,o,u,Math.floor(d/s),s,c,Math.floor(f/s),s,c).permute(0,3,6,4,7,2,1,5,8).view(l*d*f,u*o*c*c),image_grid_thw:new V(`int64`,[l,d,f],[1,3]),original_sizes:r,reshaped_input_sizes:i}}},Cp=class extends Sp{get_resize_output_image_size(e,t){let n=this.patch_size*this.merge_size,r=this.config.temporal_patch_size??2;return Xf(e.height,e.width,n,this.min_pixels,this.max_pixels,r)}},wp=class extends K{},Tp=class extends K{async _call(e){let t=await super._call(e),n=t.pixel_values.dims,r=yu([n[0],n[2],n[3]]);return{...t,pixel_mask:r}}},Ep=class extends K{constructor(e){super(e),this.do_image_splitting=e.do_image_splitting??!0,this.max_image_size=e.max_image_size}get_resize_for_vision_encoder(e,t){let[n,r]=e.dims.slice(-2),i=r/n;return r>=n?(r=Math.ceil(r/t)*t,n=Math.floor(r/i),n=Math.ceil(n/t)*t):(n=Math.ceil(n/t)*t,r=Math.floor(n*i),r=Math.ceil(r/t)*t),{height:n,width:r}}async _call(e,{do_image_splitting:t=null,return_row_col_info:n=!1}={}){let r;if(!Array.isArray(e))r=[[e]];else{if(e.length===0||!e[0])throw Error(`No images provided.`);r=Array.isArray(e[0])?e:[e]}let i=[],a=[],o=[],s=[],c=[];for(let e of r){let n=await Promise.all(e.map(e=>this.preprocess(e)));s.push(...n.map(e=>e.original_size)),c.push(...n.map(e=>e.reshaped_input_size)),n.forEach(e=>e.pixel_values.unsqueeze_(0));let{longest_edge:r}=this.max_image_size,l;if(t??this.do_image_splitting){let e=Array(n.length),t=Array(n.length);l=await Promise.all(n.map(async(n,i)=>{let a=this.get_resize_for_vision_encoder(n.pixel_values,r),o=await nu(n.pixel_values,{size:[a.height,a.width]}),{frames:s,num_splits_h:c,num_splits_w:l}=await this.split_image(o,this.max_image_size);return e[i]=c,t[i]=l,H(s,0)})),a.push(e),o.push(t)}else{let e=[r,r];l=await Promise.all(n.map(t=>nu(t.pixel_values,{size:e}))),a.push(Array(n.length).fill(0)),o.push(Array(n.length).fill(0))}i.push(H(l,0))}let l=i.length,[u,d,f,p]=i[0].dims,m,h;if(l===1)m=i[0].unsqueeze_(0),h=_u([l,u,f,p],!0);else{let e=Math.max(...i.map(e=>e.dims.at(0)));h=_u([l,e,f,p],!0);let t=h.data,n=e*f*p;for(let r=0;rn||o>r){s=Math.ceil(a/n),c=Math.ceil(o/r);let t=Math.ceil(a/s),l=Math.ceil(o/c);for(let n=0;ne*this.rescale_factor)}pad_image(e,t,n,r){return super.pad_image(e,t,n,{constant_values:this.constant_values,center:!0,...r})}},Op=class extends K{constructor(e){let{resize_mode:t,fill_color:n,interpolation:r,size:i,...a}=e,o=t===`squash`?{width:i,height:i}:t===`shortest`?{shortest_edge:i}:{longest_edge:i},s=r===`bicubic`?3:2;super({...a,size:o,resample:s,do_center_crop:!0,crop_size:i,do_normalize:!0})}};function kp(e,t){return Math.round(e/t)*t}function Ap(e,t,n,r,i){let a=1/0,o=[1,1],s=n*r;for(let n of t){let t=Math.abs(e-n[0]/n[1]);t.5*i*i*n[0]*n[1]&&(o=n)}return o}function jp(e,t){let n=[],r=/* @__PURE__ */ new Set;for(let i=e;i<=t;++i)for(let a=1;a<=i;++a)for(let o=1;o<=i;++o){let i=a*o;if(i>=e&&i<=t){let e=a<<16|o;r.has(e)||(r.add(e),n.push([a,o]))}}return n.sort((e,t)=>e[0]*e[1]-t[0]*t[1])}function Mp(e,t){let[n,r,i,a]=e.dims,o=Math.floor(i/t),s=Math.floor(a/t),c=t*t*r,l=e.data,u=new Float32Array(n*o*s*c),d=i*a;for(let e=0;ethis.max_image_tokens*(this.encoder_patch_size*this.downsample_factor)**2*this.max_pixels_tolerance}_get_grid_layout(e,t){let n=jp(this.min_tiles,this.max_tiles),[r,i]=Ap(t/e,n,t,e,this.tile_size);return{grid_width:r,grid_height:i,target_width:this.tile_size*r,target_height:this.tile_size*i}}async _call(e,{return_row_col_info:t=null}={}){let n;n=Array.isArray(e)?Array.isArray(e[0])?e:[e]:[[e]];let r=[],i=[],a=[],o=[],s=[],c=[];for(let e of n){let t=await Promise.all(e.map(e=>this.preprocess(e,{do_pad:!1})));for(let{pixel_values:e}of t){let[,t,n]=e.dims,l=e.unsqueeze_(0),u=this.encoder_patch_size*this.downsample_factor,d=u**2,[f,p]=Xf(Math.max(u,t),Math.max(u,n),u,this.min_image_tokens*d,this.max_image_tokens*d).map(e=>Math.max(u,e)),m,h=1,g=1,_=this._is_image_too_large(t,n),v=this.do_image_splitting&&(this.min_tiles!==1||this.max_tiles!==1);if(_&&v){let{grid_width:e,grid_height:r,target_width:i,target_height:a}=this._get_grid_layout(t,n);h=r,g=e;let o=await nu(l,{size:[a,i]});m=[];for(let t=0;t(e-this.image_mean[t])/this.image_std[t]);return super.pad_image(e,t,{width:s,height:o},{center:!0,constant_values:c,...r})}async _call(e,{num_crops:t=null}={}){if(this._num_crops=t??=this.config.num_crops,t<4||rm(t)%1!=0)throw Error(`num_crops must be a square number >= 4`);Array.isArray(e)||(e=[e]);let n=e.length,r=await Promise.all(e.map(e=>this.preprocess(e))),i=r.map(e=>e.original_size),a=r.map(e=>e.reshaped_input_size),o=[];for(let{pixel_values:e}of r){e.unsqueeze_(0);let[n,r]=e.dims.slice(-2),i=await nu(e,{size:[$p,$p],mode:`bicubic`});if(t>0){let a=[],s=rm(t),c=nm(r/s),l=nm(n/s);for(let t=0;te.map(e=>$p*tm(e/$p)));return{pixel_values:s,original_sizes:i,reshaped_input_sizes:a,image_sizes:new V(`int64`,c.flat(),[n,2]),num_img_tokens:c.map(([e,t])=>this.calc_num_image_tokens_from_image_size(t,e))}}},am=class extends K{get_resize_output_image_size(e,t){let{longest_edge:n}=t;if(n===void 0)throw Error(`size must contain 'longest_edge'`);let[r,i]=e.size,a=Math.max(r,i)/n,o=r,s=i;a>1&&(o=Math.floor(r/a),s=Math.floor(i/a));let{patch_size:c,spatial_merge_size:l}=this.config;if(!l)throw Error(`config must contain 'spatial_merge_size'`);let u=c*l,d=Math.floor((o-1)/u)+1,f=Math.floor((s-1)/u)+1;return[d*u,f*u]}},om=class extends K{},sm=class extends K{post_process_object_detection(...e){return Gf(...e)}},cm=class extends K{reshape_input_points(e,t,n,r=!1){e=structuredClone(e);let i=ii(e);if(i.length===3)r||(i=[1,...i]),e=[e];else if(i.length!==4)throw Error("The input_points must be a 4D tensor of shape `batch_size`, `point_batch_size`, `nb_points_per_image`, `2`.");for(let r=0;re!==t.dims[n]))throw Error(`The first ${n.length} dimensions of 'input_points' and 'input_labels' must be the same.`);return new V(`int64`,e.flat(1/0).map(BigInt),n)}async _call(e,{input_points:t=null,input_labels:n=null,input_boxes:r=null}={}){let i=await super._call(e);if(t&&(i.input_points=this.reshape_input_points(t,i.original_sizes,i.reshaped_input_sizes)),n){if(!i.input_points)throw Error("`input_points` must be provided if `input_labels` are provided.");i.input_labels=this.add_input_labels(n,i.input_points)}return r&&(i.input_boxes=this.reshape_input_points(r,i.original_sizes,i.reshaped_input_sizes,!0)),i}async post_process_masks(e,t,n,{mask_threshold:r=0,binarize:i=!0,pad_size:a=null}={}){let o=[];a=a??this.pad_size??this.size;let s=[a.height,a.width];for(let a=0;ar&&(t[n]=1);u=new V(`bool`,t,u.dims)}o.push(u)}return o}generate_crop_boxes(e,t,{crop_n_layers:n=0,overlap_ratio:r=512/1500,points_per_crop:i=32,crop_n_points_downscale_factor:a=1}={}){}},lm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},um=class extends lm{},dm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},fm=class extends dm{},pm=class extends K{},mm=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t;return super.pad_image(e,t,{width:a+(n-a%n)%n,height:i+(n-i%n)%n},{mode:`symmetric`,center:!1,constant_values:-1,...r})}},hm=class extends K{},gm=class extends hm{},_m=class extends K{async _call(e,t){Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let n=await Promise.all(e.map(e=>this.preprocess(e))),r=await Promise.all(t.map(e=>this.preprocess(e,{do_normalize:!1,do_convert_rgb:!1,do_convert_grayscale:!0})));return{pixel_values:du(n.map((e,t)=>H([e.pixel_values,r[t].pixel_values],0)),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}},vm=class extends K{post_process_pose_estimation(e,t,{threshold:n=null}={}){let r=e.tolist(),[i,a,o,s]=e.dims,c=[];for(let e=0;e/gm,bboxes:/([^<]+)?/gm},this.size_per_bin=1e3}construct_prompts(e){typeof e==`string`&&(e=[e]);let t=[];for(let n of e)if(this.task_prompts_without_inputs.has(n))t.push(this.task_prompts_without_inputs.get(n));else{for(let[e,r]of this.task_prompts_with_input)if(n.includes(e)){t.push(r.replaceAll(`{input}`,n).replaceAll(e,``));break}t.length!==e.length&&t.push(n)}return t}post_process_generation(e,t,n){let r=this.tasks_answer_post_processing_type.get(t)??`pure_text`;e=e.replaceAll(``,``).replaceAll(``,``);let i;switch(r){case`pure_text`:i=e;break;case`description_with_bboxes`:case`bboxes`:case`phrase_grounding`:case`ocr`:let a=r===`ocr`?`quad_boxes`:`bboxes`,o=e.matchAll(this.regexes[a]),s=[],c=[];for(let[e,t,...r]of o)s.push(t?t.trim():s.at(-1)??``),c.push(r.map((e,t)=>(Number(e)+.5)/this.size_per_bin*n[t%2]));i={labels:s,[a]:c};break;default:throw Error(`Task "${t}" (of type "${r}") not yet implemented.`)}return{[t]:i}}async _call(e,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=await this.image_processor(e,n),i=t?this.tokenizer(this.construct_prompts(t),n):{};return{...r,...i}}},Cm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.image_seq_length=this.config.image_seq_length;let{boi_token:r,image_token:i,eoi_token:a}=this.tokenizer.config;this.boi_token=r,this.image_token=i,this.eoi_token=a;let o=i.repeat(this.image_seq_length);this.full_image_sequence=` +`,Zs=`{%- `,Qs=` -%}`,B=Object.freeze({CONDITIONAL:0,LOGICAL_OR:1,LOGICAL_AND:2,LOGICAL_NOT:3,COMPARISON:4,ADDITIVE:5,MULTIPLICATIVE:6,EXPONENTIATION:7,TEST:8,FILTER:9,UNARY_SIGN:10,ATOM:11});function $s(e){switch(e.operator.type){case`ExponentiationBinaryOperator`:return B.EXPONENTIATION;case`MultiplicativeBinaryOperator`:return B.MULTIPLICATIVE;case`AdditiveBinaryOperator`:return B.ADDITIVE;case`ComparisonBinaryOperator`:return B.COMPARISON;case`Identifier`:return e.operator.value===`and`?B.LOGICAL_AND:e.operator.value===`in`||e.operator.value===`not in`?B.COMPARISON:B.LOGICAL_OR}return B.LOGICAL_OR}function ec(e){switch(e.type){case`SelectExpression`:case`Ternary`:return B.CONDITIONAL;case`BinaryExpression`:return $s(e);case`UnaryExpression`:return e.operator.value===`not`?B.LOGICAL_NOT:B.UNARY_SIGN;case`TestExpression`:return B.TEST;case`FilterExpression`:return B.FILTER;default:return B.ATOM}}function tc(e,t){let n=V(e);return ec(e)oc(e,t,n)).join(Xs)}function ac(e){return e.map(e=>V(e)).join(`, `)}function oc(e,t,n){let r=n.repeat(t);switch(e.type){case`Program`:return ic(e.body,t,n);case`If`:return sc(e,t,n);case`For`:return cc(e,t,n);case`Set`:return lc(e,t,n);case`Macro`:return uc(e,t,n);case`Break`:return r+rc(`break`);case`Continue`:return r+rc(`continue`);case`CallStatement`:return dc(e,t,n);case`FilterStatement`:return fc(e,t,n);case`Comment`:return r+`{# `+e.value+` #}`;default:return r+`{{- `+V(e)+` -}}`}}function sc(e,t,n){let r=n.repeat(t),i=[],a=e;for(;a&&(i.push({test:a.test,body:a.body}),a.alternate.length===1&&a.alternate[0].type===`If`);)a=a.alternate[0];let o=r+rc(`if`,V(i[0].test))+Xs+ic(i[0].body,t+1,n);for(let e=1;e0&&(o+=Xs+r+rc(`else`)+Xs+ic(a.alternate,t+1,n)),o+=Xs+r+rc(`endif`),o}function cc(e,t,n){let r=n.repeat(t),i=``;if(e.iterable.type===`SelectExpression`){let t=e.iterable;i=`${V(t.lhs)} if ${V(t.test)}`}else i=V(e.iterable);let a=r+rc(`for`,V(e.loopvar),`in`,i)+Xs+ic(e.body,t+1,n);return e.defaultBlock.length>0&&(a+=Xs+r+rc(`else`)+Xs+ic(e.defaultBlock,t+1,n)),a+=Xs+r+rc(`endfor`),a}function lc(e,t,n){let r=n.repeat(t),i=V(e.assignee),a=e.value?V(e.value):``,o=r+rc(`set`,`${i}${e.value?` = `+a:``}`);return e.body.length===0?o:o+Xs+ic(e.body,t+1,n)+Xs+r+rc(`endset`)}function uc(e,t,n){let r=n.repeat(t),i=ac(e.args);return r+rc(`macro`,`${e.name.value}(${i})`)+Xs+ic(e.body,t+1,n)+Xs+r+rc(`endmacro`)}function dc(e,t,n){let r=n.repeat(t),i=e.callerArgs&&e.callerArgs.length>0?`(${ac(e.callerArgs)})`:``,a=V(e.call),o=r+rc(`call${i}`,a)+Xs;return o+=ic(e.body,t+1,n)+Xs,o+=r+rc(`endcall`),o}function fc(e,t,n){let r=n.repeat(t),i=r+rc(`filter`,e.filter.type===`Identifier`?e.filter.value:V(e.filter))+Xs;return i+=ic(e.body,t+1,n)+Xs,i+=r+rc(`endfilter`),i}function V(e){switch(e.type){case`SpreadExpression`:return`*${V(e.argument)}`;case`KeywordSpreadExpression`:return`**${V(e.argument)}`;case`Identifier`:return e.value;case`IntegerLiteral`:return`${e.value}`;case`FloatLiteral`:{let t=e.value;return Object.is(t,-0)?`-0.0`:t%1==0?t.toFixed(1):t.toString()}case`StringLiteral`:return JSON.stringify(e.value);case`BinaryExpression`:{let t=e,n=$s(t),r=tc(t.left,n),i=tc(t.right,n+1);return`${r} ${t.operator.value} ${i}`}case`UnaryExpression`:{let t=e,n=t.argument.type===`UnaryExpression`?ec(t):B.ATOM;return t.operator.value+(t.operator.value===`not`?` `:``)+tc(t.argument,n)}case`CallExpression`:{let t=e,n=ac(t.args);return`${V(t.callee)}(${n})`}case`MemberExpression`:{let t=e,n=tc(t.object,B.ATOM),r=V(t.property);return!t.computed&&t.property.type!==`Identifier`&&t.property.type!==`IntegerLiteral`&&(r=`(${r})`),t.computed?`${n}[${r}]`:`${n}.${r}`}case`FilterExpression`:{let t=e,n=tc(t.operand,B.FILTER);return t.filter.type===`CallExpression`?`${n} | ${V(t.filter)}`:`${n} | ${t.filter.value}`}case`SelectExpression`:{let t=e;return`${tc(t.lhs,B.LOGICAL_OR)} if ${tc(t.test,B.LOGICAL_OR)}`}case`TestExpression`:{let t=e;return`${tc(t.operand,B.TEST)} is${t.negate?` not`:``} ${t.test.value}`}case`ArrayLiteral`:case`TupleLiteral`:{let t=ac(e.value),n=e.type===`ArrayLiteral`?`[]`:`()`;return`${n[0]}${t}${n[1]}`}case`ObjectLiteral`:return`{${Array.from(e.value.entries()).map(([e,t])=>`${V(e)}: ${V(t)}`).join(`, `)}}`;case`SliceExpression`:{let t=e;return`${t.start?V(t.start):``}:${t.stop?V(t.stop):``}${t.step?`:${V(t.step)}`:``}`}case`KeywordArgumentExpression`:{let t=e;return`${t.key.value}=${V(t.value)}`}case`Ternary`:{let t=e;return`${tc(t.trueExpr,B.LOGICAL_OR)} if ${tc(t.condition,B.LOGICAL_OR)} else ${tc(t.falseExpr,B.CONDITIONAL)}`}default:throw Error(`Unknown expression type: ${e.type}`)}}var pc=class{parsed;constructor(e){let t=Ro(e,{lstrip_blocks:!0,trim_blocks:!0});this.parsed=_s(t)}render(e){let t=new Rs;if(zs(t),e)for(let[n,r]of Object.entries(e))t.set(n,r);return new Js(t).run(this.parsed).value}format(e){return nc(this.parsed,e?.indent||` `)}},mc={txt:`text/plain`,html:`text/html`,css:`text/css`,js:`text/javascript`,json:`application/json`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`},hc=class e{constructor(e){if(this.filePath=e,this.headers=new Headers,this.exists=Cr.existsSync(e),this.exists){this.status=200,this.statusText=`OK`;let t=Cr.statSync(e);this.headers.set(`content-length`,t.size.toString()),this.updateContentType();let n=Cr.createReadStream(e);this.body=new ReadableStream({start(e){n.on(`data`,t=>e.enqueue(t)),n.on(`end`,()=>e.close()),n.on(`error`,t=>e.error(t))},cancel(){n.destroy()}})}else this.status=404,this.statusText=`Not Found`,this.body=null}updateContentType(){let e=this.filePath.toString().split(`.`).pop().toLowerCase();this.headers.set(`content-type`,mc[e]??`application/octet-stream`)}clone(){let t=new e(this.filePath);return t.exists=this.exists,t.status=this.status,t.statusText=this.statusText,t.headers=new Headers(this.headers),t}async arrayBuffer(){return(await Cr.promises.readFile(this.filePath)).buffer}async blob(){let e=await Cr.promises.readFile(this.filePath);return new Blob([e],{type:this.headers.get(`content-type`)})}async text(){return await Cr.promises.readFile(this.filePath,`utf8`)}async json(){return JSON.parse(await this.text())}},gc=class{constructor(e){this._mt=/* @__PURE__ */ new Uint32Array(624),this._idx=625,this._gauss_next=null,this._random_fn=this.random.bind(this),this.seed(e)}seed(e){if(e==null){if(O.IS_CRYPTO_AVAILABLE){let t=/* @__PURE__ */ new Uint32Array(1);crypto.getRandomValues(t),e=t[0]}else e=Date.now()>>>0}let t=this._mt,n=(e,t)=>Math.imul(e,t)>>>0,r=[];for(let t=e||0;t>0;t=Math.floor(t/4294967296))r.push(t&4294967295);r.length||r.push(0),t[0]=19650218;for(let e=1;e<624;++e)t[e]=n(1812433253,t[e-1]^t[e-1]>>>30)+e>>>0;let i=1,a=0;for(let e=Math.max(624,r.length);e>0;--e,++i,++a)i>=624&&(t[0]=t[623],i=1),a>=r.length&&(a=0),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1664525))+r[a]+a>>>0;for(let e=623;e>0;--e,++i)i>=624&&(t[0]=t[623],i=1),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1566083941))-i>>>0;t[0]=2147483648,this._idx=624,this._gauss_next=null}_int32(){let e=this._mt;if(this._idx>=624){for(let t=0;t<624;++t){let n=e[t]&2147483648|e[(t+1)%624]&2147483647;e[t]=(e[(t+397)%624]^n>>>1^(n&1?2567483615:0))>>>0}this._idx=0}let t=e[this._idx++];return t^=t>>>11,t^=t<<7&2636928640,t^=t<<15&4022730752,t^=t>>>18,t>>>0}random(){return((this._int32()>>>5)*67108864+(this._int32()>>>6))/9007199254740992}gauss(e=0,t=1){let n=this._gauss_next;if(this._gauss_next=null,n===null){let e=this.random()*2*Math.PI,t=Math.sqrt(-2*Math.log(1-this.random()));n=Math.cos(e)*t,this._gauss_next=Math.sin(e)*t}return e+n*t}shuffle(e){for(let t=e.length-1;t>0;--t){let n=32-Math.clz32(t+1),r=this._int32()>>>32-n;for(;r>t;)r=this._int32()>>>32-n;let i=e[t];e[t]=e[r],e[r]=i}}choices(e,t){return e[_c(this._random_fn,t)]}};function _c(e,t){let n=0;for(let e=0;e_c(yc.random,e),xc=new gc,Sc=class{constructor(e){this.path=e}async match(e){let t=new hc(wr.join(this.path,e));if(t.exists)return t}async put(e,t,n=void 0){let r=wr.join(this.path,e),i=r+`.tmp.${O.IS_PROCESS_AVAILABLE?process.pid:Date.now()}.${xc._int32().toString(36)}`;try{let e=t.headers.get(`Content-Length`),a=parseInt(e??`0`),o=0;await Cr.promises.mkdir(wr.dirname(r),{recursive:!0});let s=Cr.createWriteStream(i),c=t.body.getReader();for(;;){let{done:e,value:t}=await c.read();if(e)break;await new Promise((e,n)=>{s.write(t,t=>{if(t){n(t);return}e()})}),o+=t.length;let r=a?o/a*100:0;n?.({progress:r,loaded:o,total:a})}await new Promise((e,t)=>{s.close(n=>n?t(n):e())}),await Cr.promises.rename(i,r)}catch(e){try{await Cr.promises.unlink(i)}catch{}throw e}}async delete(e){let t=wr.join(this.path,e);try{return await Cr.promises.unlink(t),!0}catch{return!1}}},Cc={400:`Bad request error occurred while trying to load file`,401:`Unauthorized access to file`,403:`Forbidden access to file`,404:`Could not locate file`,408:`Request timeout error occurred while trying to load file`,500:`Internal server error error occurred while trying to load file`,502:`Bad gateway error occurred while trying to load file`,503:`Service unavailable error occurred while trying to load file`,504:`Gateway timeout error occurred while trying to load file`},wc=100,Tc=/^(\b[\w\-.]+\b\/)?\b[\w\-.]{1,96}\b$/;function Ec(...e){return e=e.map((t,n)=>(n&&(t=t.replace(/* @__PURE__ */ RegExp(`^/`),``)),n!==e.length-1&&(t=t.replace(/* @__PURE__ */ RegExp(`/$`),``)),t)),e.join(`/`)}function Dc(e,t=null,n=null){let r;try{r=new URL(e)}catch{return!1}return!(t&&!t.includes(r.protocol)||n&&!n.includes(r.hostname))}function Oc(e){return!(!Tc.test(e)||e.includes(`..`)||e.includes(`--`)||e.endsWith(`.git`)||e.endsWith(`.ipynb`))}function kc(e,t={},...n){return JSON.stringify([e,t.revision??`main`,t.cache_dir??null,t.local_files_only??!1,...n])}var Ac=class extends Error{constructor(e,{status:t=null}={}){super(e),this.name=`ModelFileNotFoundError`,this.status=t}},jc=/* @__PURE__ */ new Set([401,403,404]);function Mc(e,t,n){if(!n)return null;let r=`${Cc[e]??`Error (${e}) occurred while trying to load file`}: "${t}".`;throw jc.has(e)?new Ac(r,{status:e}):Error(r)}async function Nc(e,t,n){let r=e.headers.get(`Content-Length`),i=r?parseInt(r,10):n??0;r===null&&!n&&A.warn(`Unable to determine content-length from response headers. Will expand buffer when needed.`);let a=new Uint8Array(i),o=0,s=e.body.getReader();async function c(){let{done:e,value:n}=await s.read();if(e)return;let r=o+n.length;if(r>i){i=r;let e=new Uint8Array(i);e.set(a),a=e}return a.set(n,o),o=r,t({progress:o/i*100,loaded:o,total:i}),c()}return await c(),a}function Pc(e){return Dc(e,[`blob:`])}function Fc(e,{allowUnresolved:t=!1}={}){let n;if(typeof location<`u`&&location.href)n=location.href;else if(import.meta.url)n=import.meta.url;else return e;try{return new URL(e,n).href}catch(n){if(!t)throw n;return e}}var Ic=`SHA-256`,Lc=`experimental_transformers-hash-cache`,Rc=e=>({algorithm:Ic,value:e}),zc=class{#e=null;_getHashCache=()=>(this.#e??=caches.open(Lc),this.#e);static isAvailable=()=>typeof navigator<`u`&&`crossOriginStorage`in navigator;match=async e=>{let t=await this._getFileHash(e);if(t)try{let e=await(await navigator.crossOriginStorage.requestFileHandle(Rc(t))).getFile();return new Response(e,{headers:{"Content-Length":String(e.size)}})}catch{return}};put=async(e,t)=>{let n=await this._getFileHash(e);if(n){let e=await t.blob();await this._storeBlobInCOS(e,n)}else this._processAndStore(e,t.body)};_storeBlobInCOS=async(e,t)=>{let n=await(await navigator.crossOriginStorage.requestFileHandle(Rc(t),{create:!0,origins:`*`})).createWritable();await n.write(e),await n.close()};_processAndStore=async(e,t)=>{try{let n=[];for await(let e of t)n.push(e);let r=new Blob(n),i=await this._getBlobHash(r);await this._storeBlobInCOS(r,i);try{await(await this._getHashCache()).put(e,new Response(i))}catch{}}catch{}};delete=async e=>{try{return await(await this._getHashCache()).delete(e)}catch{return!1}};_getFileHash=async e=>{try{let t=await this._getHashCache(),n=await t.match(e);if(n)return n.text();let r=await this._getLfsFileHash(e);return r?(await t.put(e,new Response(r)),r):null}catch{return null}};_getLfsFileHash=async e=>{if(!e.includes(`/resolve/`))return null;let t=e.replace(`/resolve/`,`/raw/`);try{let e=(await fetch(t).then(e=>e.text())).match(/^oid sha256:([0-9a-f]+)$/m);return e?e[1]:null}catch{return null}};_getBlobHash=async e=>{let t=await e.arrayBuffer(),n=await crypto.subtle.digest(Ic,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}};async function Bc(e=null){let t=null;if(k.useCustomCache){if(!k.customCache)throw Error("`env.useCustomCache=true`, but `env.customCache` is not defined.");if(!k.customCache.match||!k.customCache.put)throw Error("`env.customCache` must be an object which implements the `match` and `put` functions of the Web Cache API. For more information, see https://developer.mozilla.org/en-US/docs/Web/API/Cache");t=k.customCache}if(!t&&k.experimental_useCrossOriginStorage&&zc.isAvailable()&&(t=new zc),!t&&k.useBrowserCache){if(typeof caches>`u`)throw Error(`Browser cache is not available in this environment.`);try{t=await caches.open(k.cacheKey)}catch(e){A.warn(`An error occurred while opening the browser cache:`,e)}}if(!t&&k.useFSCache){if(!O.IS_FS_AVAILABLE)throw Error(`File System Cache is not available in this environment.`);t=new Sc(e??k.cacheDir)}return t}async function Vc(e,...t){for(let n of t)try{let t=await e.match(n);if(t)return t}catch{continue}}var Hc=new class{#e;#t;constructor(e){this.#e=e,this.#t=/* @__PURE__ */ new Map}get(e){if(!this.#t.has(e))return;let t=this.#t.get(e);return this.#t.delete(e),this.#t.set(e,t),t}put(e,t){this.#t.has(e)&&this.#t.delete(e),this.#t.set(e,t),this.#t.size>this.#e&&this.#t.delete(this.#t.keys().next().value)}delete(e){return this.#t.delete(e)}clear(){this.#t.clear()}}(100);function Uc(e,t){let n=Hc.get(e);if(n!==void 0)return n;let r=t().then(e=>e,t=>(Hc.delete(e),Promise.reject(t)));return Hc.put(e,r),r}async function Wc(e){if(!Dc(e,[`http:`,`https:`]))return null;let t=Jc(e);return t.set(`Range`,`bytes=0-0`),k.fetch(e,{method:`GET`,headers:t,cache:`no-store`})}function Gc(e,t,n={}){return Uc(kc(e,n,t),()=>Kc(e,t,n))}async function Kc(e,t,n){let r=await Bc(n?.cache_dir),{localPath:i,remoteURL:a,proposedCacheKey:o,validModelId:s}=Yc(e,t,n,r),c=await Xc(r,i,o);if(c!==void 0&&typeof c!=`string`){let e=c.headers.get(`content-length`),t=c.headers.get(`content-type`);return{exists:!0,size:e?parseInt(e,10):void 0,contentType:t||void 0,fromCache:!0}}if(k.allowLocalModels&&!Dc(i,[`http:`,`https:`]))try{let e=await qc(i);if(typeof e!=`string`&&e.status!==404){let t=e.headers.get(`content-length`),n=e.headers.get(`content-type`);return{exists:!0,size:t?parseInt(t,10):void 0,contentType:n||void 0,fromCache:!1}}}catch{}if(k.allowRemoteModels&&!n.local_files_only&&s){let e=await Wc(a);if(e&&e.status>=200&&e.status<300){let t,n=e.headers.get(`content-type`);if(e.status===206){let n=e.headers.get(`content-range`);if(n){let e=n.match(/bytes \d+-\d+\/(\d+)/);e&&(t=parseInt(e[1],10))}}else if(e.status===200)try{await e.body?.cancel()}catch{}if(t===void 0){let n=e.headers.get(`content-length`);t=n?parseInt(n,10):void 0}return{exists:!0,size:t,contentType:n||void 0,fromCache:!1}}e&&e.status!==404&&e.status!==416&&Mc(e.status,a,!0)}return{exists:!1,fromCache:!1}}async function qc(e){return k.useFS&&!Dc(e,[`http:`,`https:`,`blob:`])?new hc(e instanceof URL?e.protocol===`file:`?e.pathname:e.toString():e):k.fetch(e,{headers:Jc(e)})}function Jc(e){let t=typeof process<`u`&&process?.release?.name===`node`,n=new Headers;if(t){let t=!!{}.TESTING_REMOTELY,r=k.version;if(n.set(`User-Agent`,`transformers.js/${r}; is_ci/${t};`),Dc(e,[`http:`,`https:`],[`huggingface.co`,`hf.co`])){let e={}.HF_TOKEN??{}.HF_ACCESS_TOKEN;e&&n.set(`Authorization`,`Bearer ${e}`)}}return n}function Yc(e,t,n={},r=null){let i=n.revision??`main`,a=Ec(e,t),o=Oc(e),s=o?Ec(k.localModelPath,a):a,c=Ec(k.remoteHost,k.remotePathTemplate.replaceAll(`{model}`,e).replaceAll(`{revision}`,encodeURIComponent(i)),t);return{requestURL:a,localPath:s,remoteURL:c,proposedCacheKey:r instanceof Sc?i===`main`?a:Ec(e,i,t):c,validModelId:o}}async function Xc(e,t,n){if(e)return await Vc(e,t,n)}async function Zc(e,t,n,r,i,a,o={}){if(await n.match(r)===void 0&&!(typeof Cache<`u`&&n instanceof Cache&&!Dc(Fc(r,{allowUnresolved:!0}),[`http:`,`https:`]))){if(!a){let a=o.progress_callback?n=>ei(o.progress_callback,{status:`progress`,name:e,file:t,...n}):void 0;await n.put(r,i,a)}else if(typeof i!=`string`){let e=new Headers(i.headers);e.set(`content-length`,a.byteLength.toString()),await n.put(r,new Response(a,{headers:e})).catch(e=>{A.warn(`Unable to add response to browser cache: ${e}.`)})}}}async function Qc(e,t,n=!0,r={},i=!1,a=null){let{requestURL:o,localPath:s,remoteURL:c,proposedCacheKey:l,validModelId:u}=Yc(e,t,r,a),d,f=!1,p;p=await Xc(a,s,l);let m=p!==void 0;if(m)d=l;else{if(k.allowLocalModels){if(!Dc(o,[`http:`,`https:`]))try{p=await qc(s),d=s}catch(e){A.warn(`Unable to load from local path "${s}": "${e}"`)}else if(r.local_files_only)throw Error(`\`local_files_only=true\`, but attempted to load a remote file from: ${o}.`);else if(!k.allowRemoteModels)throw Error(`\`env.allowRemoteModels=false\`, but attempted to load a remote file from: ${o}.`)}if(p===void 0||typeof p!=`string`&&p.status===404){if(r.local_files_only||!k.allowRemoteModels){if(n)throw new Ac(`\`local_files_only=true\` or \`env.allowRemoteModels=false\` and file was not found locally at "${s}".`);return null}if(!u)throw new Ac(`Local file missing at "${s}" and download aborted due to invalid model ID "${e}".`);if(p=await qc(c),p.status!==200)return Mc(p.status,c,n);d=l}f=a&&typeof Response<`u`&&p instanceof Response&&p.status===200}ei(r.progress_callback,{status:`download`,name:e,file:t});let h;if(!(O.IS_NODE_ENV&&i)){let n;if(typeof p!=`string`){if(!r.progress_callback)n=new Uint8Array(await p.arrayBuffer());else if(m&&typeof navigator<`u`&&/firefox/i.test(navigator.userAgent))n=new Uint8Array(await p.arrayBuffer()),ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n.length,total:n.length});else{let i,a=p.headers.get(`content-length`);if(a)i=parseInt(a,10);else try{let n=await Gc(e,t,r);n.size&&(i=n.size)}catch{}n=await Nc(p,n=>{ei(r.progress_callback,{status:`progress`,name:e,file:t,...n})},i)}}h=n}if(f&&d&&typeof p!=`string`&&await Zc(e,t,a,d,p,h,r),O.IS_NODE_ENV&&i&&r.progress_callback&&typeof p!=`string`){let n=parseInt(p.headers.get(`content-length`),10)||0;ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n,total:n})}if(ei(r.progress_callback,{status:`done`,name:e,file:t}),h){if(!O.IS_NODE_ENV&&i)throw Error(`Cannot return path in a browser environment.`);return h}if(p instanceof hc)return p.filePath;let g=await a?.match(d);if(g instanceof hc)return g.filePath;if(g instanceof Response)return new Uint8Array(await g.arrayBuffer());if(typeof g==`string`)return g;throw Error(`Unable to get model file path or buffer.`)}var $c=/* @__PURE__ */ new Map;async function el(e,t,n=!0,r={},i=!1){if(!k.allowLocalModels){if(r.local_files_only)throw Error("Invalid configuration detected: local models are disabled (`env.allowLocalModels=false`) but you have requested to only use local models (`local_files_only=true`).");if(!k.allowRemoteModels)throw Error("Invalid configuration detected: both local and remote models are disabled. Fix by setting `env.allowLocalModels` or `env.allowRemoteModels` to `true`.")}let a=kc(e,r,t,n,i),{progress_callback:o}=r,s=o instanceof ti?o.loads:$c,c=s.get(a);return c||(ei(o,{status:`initiate`,name:e,file:t}),c=Bc(r.cache_dir).then(a=>Qc(e,t,n,r,i,a)),s===$c&&(c=c.finally(()=>$c.delete(a))),s.set(a,c)),await c}async function tl(e,t,n=!0,r={}){let i=await el(e,t,n,r,!1);return i===null?null:new TextDecoder(`utf-8`).decode(i)}async function nl(e,t,n=!0,r={}){let i=await tl(e,t,n,r);return i===null?{}:JSON.parse(i)}function rl(e,[t,n,r],[i,a],o=`bilinear`,s=!1){let c=a/r,l=i/n,u=new e.constructor(i*a*t),d=n*r,f=i*a;for(let o=0;o=0;--e)i[e]=a,r[e]=t[n[e]],a*=r[e];let a=n.map((e,t)=>i[n.indexOf(t)]),o=new e.constructor(e.length);for(let n=0;n=0;--e)r+=i%t[e]*a[e],i=Math.floor(i/t[e]);o[r]=e[n]}return[o,r]}function al(e){let t=cl(e)[0],n=e.map(e=>Math.exp(e-t)),r=n.reduce((e,t)=>e+t,0);return n.map(e=>e/r)}function ol(e){let t=cl(e)[0],n=0;for(let r=0;re-t-r)}function sl(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;rt&&(t=e[r],n=r);return[t,n]}function ll(e){return e>0&&!(e&e-1)}var ul=class{constructor(e){if(this.size=e|0,this.size<=1||!ll(this.size))throw Error(`FFT size must be a power of two larger than 1`);this._csize=e<<1,this.table=new Float64Array(this.size*2);for(let e=0;ee;e<<=1)++t;this._width=t%2==0?t-1:t,this._bitrev=new Int32Array(1<>>t&3)<>>1);for(let t=0;t>>1]=e[t];return n}toComplexArray(e,t){let n=t||this.createComplexArray();for(let t=0;t>>1],n[t+1]=0;return n}transform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,1)}realTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._realTransform4(e,t,1)}inverseTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,-1);for(let t=0;t>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>2;for(o=0;o>>1,i>>>1)}else for(o=0,s=0;o>>1,i>>>1,n)}let l=this.table;for(i>>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>1,s=t>>>1,c=s>>>1;for(o=0;o>>1;for(let t=2;t>1;++t){let n=(t+1-e)**2/2,r=Math.sqrt(s**2+c**2)**n,o=n*Math.atan2(c,s),l=2*t;i[l]=r*Math.cos(o),i[l+1]=r*Math.sin(o),a[l]=i[l],a[l+1]=-i[l+1]}this._slicedChirpBuffer=i.subarray(t,n),this._f=new ul(r>>1),this._f.transform(this._chirpBuffer,a)}_transform(e,t,n){let r=this._buffer1,i=this._buffer2,a=this._outBuffer1,o=this._outBuffer2,s=this._chirpBuffer,c=this._slicedChirpBuffer,l=this._a;if(n)for(let e=0;e>1];r[e]=i*c[e],r[n]=i*c[n]}else for(let e=0;e=e.length&&(i=2*(e.length-1)-i),r[a++]=e[i]}r.sort(),n[t]=r[i]}return n}function ml(e,t){let n=10**t;return Math.round(e*n)/n}function hl(e){let t=Math.round(e);return Math.abs(e)%1==.5?t%2==0?t:t-1:t}function gl(e){let t=e.length,n=e[0].length,r=[t+1,n+1],i=Array.from({length:r[0]},()=>Array(r[1]).fill(1/0));i[0][0]=0;let a=Array.from({length:r[0]},()=>Array(r[1]).fill(-1));for(let t=1;t0||s>0;)switch(c.push(o-1),l.push(s-1),a[o][s]){case 0:--o,--s;break;case 1:--o;break;case 2:--s;break;default:throw Error(`Internal error in dynamic time warping. Unexpected trace[${o}, ${s}]. Please file a bug report.`)}return c.reverse(),l.reverse(),[c,l]}var _l=/* @__PURE__ */ (function(){let e=null;return function(t){if(!e){e=/* @__PURE__ */ new Float32Array(65536);let t=/* @__PURE__ */ new ArrayBuffer(4),n=new Uint32Array(t),r=new Float32Array(t);for(let t=0;t>10,s=t&1023;if(o===31)i=a|2139095040|s<<13;else if(o===0){if(s===0)i=a;else{let e=113;for(;!(s&1024);)s<<=1,--e;s&=-1025,i=a|e<<23|s<<13}}else i=a|o+112<<23|s<<13;n[0]=i,e[t]=r[0]}}let n=t.length,r=e,i=new Float32Array(n);for(let e=0;e[`webgpu`,`cuda`,`dml`,`webnn-gpu`].includes(e))}if(Tl.includes(e))return[Sl[e]??e];throw Error(`Unsupported device: "${e}". Should be one of: ${Tl.join(`, `)}.`)}var jl=Promise.resolve(),Ml=null;async function Nl(){if(Ml)return Ml;if(!(k.useWasmCache&&typeof Rl?.wasm?.wasmPaths==`object`&&Rl?.wasm?.wasmPaths?.wasm&&Rl?.wasm?.wasmPaths?.mjs)){if(O.IS_DENO_WEB_RUNTIME)throw Error(`env.useWasmCache=false is not supported in Deno's web runtime. Remove the useWasmCache override.`);return Ml=Promise.resolve(),Ml}return Ml=(async()=>{let e=Rl.wasm.wasmPaths,t=!1;await Promise.all([e.wasm&&!Pc(e.wasm)?(async()=>{try{let n=await bl(Fc(e.wasm));n&&(Rl.wasm.wasmBinary=n,t=!0)}catch(e){A.warn(`Failed to pre-load WASM binary:`,e)}})():Promise.resolve(),e.mjs&&!Pc(e.mjs)?(async()=>{try{let t=await xl(Fc(e.mjs));t&&(Rl.wasm.wasmPaths.mjs=t)}catch(e){A.warn(`Failed to pre-load WASM factory:`,e)}})():Promise.resolve()]),t||(Rl.wasm.wasmPaths.mjs=e.mjs)})(),Ml}async function Pl(e,t,n){await Nl();let r=Cl(k.logLevel??Xr.WARNING),i=()=>kl.create(e,{logSeverityLevel:r,...t}),a=await(O.IS_WEB_ENV?jl=jl.then(i):i());return a.config=n,a}var Fl=Promise.resolve();async function Il(e,t){let n=()=>e.run(t);return O.IS_WEB_ENV?Fl=Fl.then(n):n()}function Ll(e){return e instanceof Dl.Tensor}var Rl=Dl?.env;function zl(){return Rl?.wasm?.proxy}if(Rl){let e=function(e){Rl.logLevel=wl[Cl(e)]};if(Rl.wasm){if(!(typeof ServiceWorkerGlobalScope<`u`&&self instanceof ServiceWorkerGlobalScope)&&Rl.versions?.web&&!Rl.wasm.wasmPaths){let e=`https://cdn.jsdelivr.net/npm/onnxruntime-web@${Rl.versions.web}/dist/`,t=`.asyncify`;O.IS_SAFARI_BELOW_26&&!O.IS_WEBGPU_AVAILABLE&&(t=``),Rl.wasm.wasmPaths={mjs:`${e}ort-wasm-simd-threaded${t}.mjs`,wasm:`${e}ort-wasm-simd-threaded${t}.wasm`}}Rl.wasm.proxy=!1}Rl.webgpu&&(Rl.webgpu.powerPreference=`high-performance`),e(k.logLevel??Xr.WARNING),k.backends.onnx={...Rl,setLogLevel:e}}var Bl=async(e,t,n)=>{let r=await Pl(new Uint8Array(e),t);return(async e=>{let t=zl(),i=Object.fromEntries(Object.entries(e).map(([e,n])=>[e,(t?n.clone():n).ort_tensor])),a=await Il(r,i);return Array.isArray(n)?n.map(e=>new H(a[e])):new H(a[n])})},Vl=class{static session_options={};static get nearest_interpolate_4d(){return this._nearest_interpolate_4d||=Bl([8,10,18,0,58,129,1,10,41,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,18,10,4,109,111,100,101,34,7,110,101,97,114,101,115,116,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,21],this.session_options,`y`),this._nearest_interpolate_4d}static get bilinear_interpolate_4d(){return this._bilinear_interpolate_4d||=Bl([8,9,18,0,58,128,1,10,40,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,17,10,4,109,111,100,101,34,6,108,105,110,101,97,114,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bilinear_interpolate_4d}static get bicubic_interpolate_4d(){return this._bicubic_interpolate_4d||=Bl([8,9,18,0,58,127,10,39,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,16,10,4,109,111,100,101,34,5,99,117,98,105,99,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bicubic_interpolate_4d}static get matmul(){return this._matmul||=Bl([8,9,18,0,58,55,10,17,10,1,97,10,1,98,18,1,99,34,6,77,97,116,77,117,108,18,1,114,90,9,10,1,97,18,4,10,2,8,1,90,9,10,1,98,18,4,10,2,8,1,98,9,10,1,99,18,4,10,2,8,1,66,2,16,20],this.session_options,`c`),this._matmul}static get stft(){return this._stft||=Bl([8,7,18,0,58,148,1,10,38,10,1,115,10,1,106,10,1,119,10,1,108,18,1,111,34,4,83,84,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,115,90,26,10,1,115,18,21,10,19,8,1,18,15,10,3,18,1,98,10,3,18,1,115,10,3,18,1,99,90,11,10,1,106,18,6,10,4,8,7,18,0,90,16,10,1,119,18,11,10,9,8,1,18,5,10,3,18,1,119,90,11,10,1,108,18,6,10,4,8,7,18,0,98,31,10,1,111,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,102,10,3,18,1,100,10,3,18,1,99,66,2,16,17],this.session_options,`o`),this._stft}static get rfft(){return this._rfft||=Bl([8,9,58,93,10,33,10,1,120,10,0,10,1,97,18,1,121,34,3,68,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,100,90,19,10,1,120,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,1,90,11,10,1,97,18,6,10,4,8,7,18,0,98,19,10,1,121,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,2,66,2,16,20],this.session_options,`y`),this._rfft}static get top_k(){return this._top_k||=Bl([8,10,18,0,58,73,10,18,10,1,120,10,1,107,18,1,118,18,1,105,34,4,84,111,112,75,18,1,116,90,9,10,1,120,18,4,10,2,8,1,90,15,10,1,107,18,10,10,8,8,7,18,4,10,2,8,1,98,9,10,1,118,18,4,10,2,8,1,98,9,10,1,105,18,4,10,2,8,7,66,2,16,21],this.session_options,[`v`,`i`]),this._top_k}static get slice(){return this._slice||=Bl([8,7,18,0,58,96,10,25,10,1,120,10,1,115,10,1,101,10,1,97,10,1,116,18,1,121,34,5,83,108,105,99,101,18,1,114,90,9,10,1,120,18,4,10,2,8,1,90,9,10,1,115,18,4,10,2,8,7,90,9,10,1,101,18,4,10,2,8,7,90,9,10,1,97,18,4,10,2,8,7,90,9,10,1,116,18,4,10,2,8,7,98,9,10,1,121,18,4,10,2,8,1,66,2,16,13],this.session_options,`y`),this._slice}},Hl=Object.freeze({auto:`auto`,gpu:`gpu`,cpu:`cpu`,wasm:`wasm`,webgpu:`webgpu`,cuda:`cuda`,dml:`dml`,coreml:`coreml`,webnn:`webnn`,"webnn-npu":`webnn-npu`,"webnn-gpu":`webnn-gpu`,"webnn-cpu":`webnn-cpu`}),Ul=O.IS_NODE_ENV?`cpu`:`wasm`;function Wl(e,t,{warn:n}={}){return e?typeof e==`string`?e:e.hasOwnProperty(t)?e[t]:(n&&n(`device not specified for "${t}". Using the default device (${Ul}).`),Ul):Ul}var Gl=/* @__PURE__ */ (function(){let e;return async function(){if(e===void 0){if(!O.IS_WEBGPU_AVAILABLE)e=!1;else try{e=(await navigator.gpu.requestAdapter()).features.has(`shader-f16`)}catch{e=!1}}return e}})(),Kl=Object.freeze({auto:`auto`,fp32:`fp32`,fp16:`fp16`,q8:`q8`,int8:`int8`,uint8:`uint8`,q4:`q4`,bnb4:`bnb4`,q4f16:`q4f16`,q2:`q2`,q2f16:`q2f16`,q1:`q1`,q1f16:`q1f16`}),ql=Kl.fp32,Jl=Object.freeze({[Hl.wasm]:Kl.q8}),Yl=Object.freeze({[Kl.fp32]:``,[Kl.fp16]:`_fp16`,[Kl.int8]:`_int8`,[Kl.uint8]:`_uint8`,[Kl.q8]:`_quantized`,[Kl.q4]:`_q4`,[Kl.q2]:`_q2`,[Kl.q1]:`_q1`,[Kl.q4f16]:`_q4f16`,[Kl.q2f16]:`_q2f16`,[Kl.q1f16]:`_q1f16`,[Kl.bnb4]:`_bnb4`});function Xl(e,t,n,{configDtype:r=null,warn:i}={}){let a,o=!1;e&&typeof e!=`string`?e.hasOwnProperty(t)?a=e[t]:(a=null,o=!0):a=e;let s;if(a===Kl.auto){if(r){let e=typeof r==`string`?r:r?.[t];if(e&&e!==Kl.auto&&Kl.hasOwnProperty(e))return e}s=Jl[n]??ql}else s=a&&Kl.hasOwnProperty(a)?a:Jl[n]??ql;return o&&i&&i(`dtype not specified for "${t}". Using the default dtype (${s}) for this device (${n}).`),s}var Zl=Object.freeze({float32:Float32Array,float16:typeof Float16Array<`u`?Float16Array:Uint16Array,float64:Float64Array,string:Array,int8:Int8Array,uint8:Uint8Array,int16:Int16Array,uint16:Uint16Array,int32:Int32Array,uint32:Uint32Array,int64:BigInt64Array,uint64:BigUint64Array,bool:Uint8Array,uint4:Uint8Array,int4:Int8Array}),H=class e{get dims(){return this.ort_tensor.dims}set dims(e){this.ort_tensor.dims=e}get type(){return this.ort_tensor.type}get data(){return this.ort_tensor.data}get size(){return this.ort_tensor.size}get location(){return this.ort_tensor.location}ort_tensor;constructor(...e){return this.ort_tensor=Ll(e[0])?e[0]:new br(e[0],e[1],e[2]),new Proxy(this,{get:(e,t)=>{if(typeof t==`string`){let n=Number(t);if(Number.isInteger(n))return e._getitem(n)}return e[t]},set:(e,t,n)=>e[t]=n})}dispose(){this.ort_tensor.dispose()}*[Symbol.iterator](){let[e,...t]=this.dims;if(t.length>0){let n=t.reduce((e,t)=>e*t);for(let r=0;r0){let e=r.reduce((e,t)=>e*t);return this._subarray(t,e,r)}return new e(this.type,[this.data[t]],r)}_subarray(t,n,r){let i=t*n,a=(t+1)*n,o=`subarray`in this.data?this.data.subarray(i,a):this.data.slice(i,a);return new e(this.type,o,r)}item(){let e=this.data;if(e.length!==1)throw Error(`a Tensor with ${e.length} elements cannot be converted to Scalar`);return e[0]}tolist(){return Ql(this.data,this.dims)}sigmoid(){return this.clone().sigmoid_()}sigmoid_(){let e=this.data;for(let t=0;t0||r>0&&n<0?r+n:r}return this}clone(){return new e(this.type,this.data.slice(),this.dims.slice())}slice(...t){let n=[],r=[];for(let e=0;ea)throw Error(`Invalid slice: ${i}`);let o=[Math.max(t,0),Math.min(a,this.dims[e])];r.push(o),n.push(o[1]-o[0])}else throw Error(`Invalid slice: ${i}`)}let i=r.map(([e,t])=>t-e),a=i.reduce((e,t)=>e*t),o=this.data,s=new o.constructor(a),c=this.stride(),l=!0;for(let e=1;e=0;--n){let e=i[n];t+=(a%e+r[n][0])*c[n],a=Math.floor(a/e)}s[e]=o[t]}return new e(this.type,s,n)}permute(...e){return $l(this,e)}transpose(...e){return this.permute(...e)}sum(e=null,t=!1){return this.norm(1,e,t)}norm(t=`fro`,n=null,r=!1){if(t===`fro`)t=2;else if(typeof t==`string`)throw Error(`Unsupported norm: ${t}`);let i=this.data,a=i instanceof BigInt64Array||i instanceof BigUint64Array;if(a&&t!==1)throw Error(`Expected a floating point tensor as input. Got ${this.type}`);let o,s;if(a?(o=(e,t)=>e+t,s=0n):(o=(e,n)=>e+n**t,s=0),n===null){let n=i.reduce(o,s);return t!==1&&(n**=1/t),new e(this.type,[n],[])}let[c,l,u]=du(o,this,n,r);if(t!==1)for(let e=0;e=0;--r){let e=this.dims[r];if(r!==t){let t=i%e;n+=t*a,a*=this.dims[r]}i=Math.floor(i/e)}r[e]/=i[n]}return this}normalize(e=2,t=1){return this.clone().normalize_(e,t)}stride(){return mu(this.dims)}squeeze(t=null){return new e(this.type,this.data,su(this.dims,t))}squeeze_(e=null){return this.dims=su(this.dims,e),this}unsqueeze(t){return new e(this.type,this.data,cu(this.dims,t))}unsqueeze_(e){return this.dims=cu(this.dims,e),this}flatten_(e=0,t=-1){t=(t+this.dims.length)%this.dims.length;let n=this.dims.slice(0,e),r=this.dims.slice(e,t+1),i=this.dims.slice(t+1);return this.dims=[...n,r.reduce((e,t)=>e*t,1),...i],this}flatten(e=0,t=-1){return this.clone().flatten_(e,t)}view(...t){let n=-1;for(let e=0;er===n?e:e*t,1);t[n]=r.length/e}return new e(this.type,r,t)}neg_(){let e=this.data;for(let t=0;tt);return new e(`bool`,n,this.dims)}lt(t){let n=new Uint8Array(this.data.length),r=this.data;for(let e=0;eMath.min(e,t),this,t,n,1/0);return new e(r,i,a)}max(t=null,n=!1){if(t===null){let t=cl(this.data)[0];return new e(this.type,[t],[])}let[r,i,a]=du((e,t)=>Math.max(e,t),this,t,n,-1/0);return new e(r,i,a)}argmin(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=sl(this.data)[1];return new e(`int64`,[BigInt(r)],[])}argmax(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=cl(this.data)[1];return new e(`int64`,[BigInt(r)],[])}repeat(...t){if(t.lengthe===1)){if(t.length===this.dims.length)return this.clone();let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims);return new e(this.type,this.data.slice(),r)}let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims),i=r.map((e,n)=>e*t[n]),a=i.reduce((e,t)=>e*t,1),o=this.data,s=new o.constructor(a),c=mu(r),l=mu(i);for(let e=0;eBigInt(Math.floor(e)):BigInt;else if(this.type===`float16`&&t==`float32`&&this.data instanceof Uint16Array)return new e(t,_l(this.data),this.dims);return new e(t,Zl[t].from(this.data,n),this.dims)}};function Ql(e,t){let n=e.length;if(n!==(t.length===0?1:t.reduce((e,t)=>e*t)))throw Error(`cannot reshape array of size ${n} into shape (${t})`);let r=e;for(let e=t.length-1;e>=0;e--)r=r.reduce((n,r)=>{let i=n[n.length-1];return i.lengthnew H(`int64`,e,[e.length]);async function au(e,t,n,r,i){return await(await Vl.slice)({x:e,s:iu(t),e:iu(n),a:iu(r),t:iu(i??Array(r.length).fill(1))})}function ou(e,t){let n=e.data,r=t.data,i=[e.dims[0],e.dims[2]],a=new n.constructor(i[0]*i[1]),[o,s,c]=e.dims,l=0;for(let e=0;ee!==1):typeof t==`number`?e[t]===1&&e.splice(t,1):Array.isArray(t)&&(e=e.filter((e,n)=>e!==1||!t.includes(n))),e}function cu(e,t){return t=lu(t,e.length+1),e=e.slice(),e.splice(t,0,1),e}function lu(e,t,n=null,r=!0){if(e<-t||e>=t){if(r)throw Error(`IndexError: index ${e} is out of bounds for dimension${n===null?``:` `+n} with size ${t}`);return e<-t?0:t}return e<0&&(e=(e%t+t)%t),e}function U(e,t=0){t=lu(t,e[0].dims.length);let n=e[0].dims.slice();n[t]=e.reduce((e,n)=>e+n.dims[t],0);let r=n.reduce((e,t)=>e*t,1),i=new e[0].data.constructor(r),a=e[0].type;if(t===0){let t=0;for(let n of e){let e=n.data;i.set(e,t),t+=e.length}}else{let r=0;for(let a=0;a=0;--i){let e=s[i],l=o%e;i===t&&(l+=r),a+=l*c,c*=n[i],o=Math.floor(o/e)}i[a]=o[e]}r+=s[t]}}return new H(a,i,n)}function uu(e,t=0){return U(e.map(e=>e.unsqueeze(t)),t)}function du(e,t,n,r=!1,i=null){let a=t.data,o=t.dims;n=lu(n,o.length);let s=o.slice();s[n]=1;let c=new a.constructor(a.length/o[n]);i!==null&&c.fill(i);for(let t=0;t=0;--e){let t=o[e];if(e!==n){let n=i%t;r+=n*a,a*=s[e]}i=Math.floor(i/t)}c[r]=e(c[r],a[t],t,r)}return r||s.splice(n,1),[t.type,c,s]}function fu(e,t=null,n=1,r=!1){let i=e.data,a=e.dims;if(t===null){let t=i.reduce((e,t)=>e+t,0)/i.length,r=Math.sqrt(i.reduce((e,n)=>e+(n-t)**2,0)/(i.length-n)),a=new H(e.type,[t],[]);return[new H(e.type,[r],[]),a]}t=lu(t,a.length);let o=pu(e,t,r),s=o.data,[c,l,u]=du((e,t,n,r)=>e+(t-s[r])**2,e,t,r);for(let e=0;ee+t,0);return new H(e.type,[t/i.length],[])}t=lu(t,r.length);let[a,o,s]=du((e,t)=>e+t,e,t,n);if(r[t]!==1)for(let e=0;e=0;--n)t[n]=r,r*=e[n];return t}function hu(e,t,n,r){return new H(n,new r(e.reduce((e,t)=>e*t,1)).fill(t),e)}function gu(e,t){let n,r;if(typeof t==`number`)n=`float32`,r=Float32Array;else if(typeof t==`bigint`)n=`int64`,r=BigInt64Array;else if(typeof t==`boolean`)n=`bool`,r=Uint8Array;else throw Error(`Unsupported data type: ${typeof t}`);return hu(e,t,n,r)}function _u(e,t){return gu(e.dims,t)}function vu(e){return hu(e,1n,`int64`,BigInt64Array)}function yu(e){return vu(e.dims)}function bu(e){return hu(e,0n,`int64`,BigInt64Array)}function xu(e){return bu(e.dims)}function Su(e){let t=e.reduce((e,t)=>e*t,1);return new H(`float32`,Float32Array.from({length:t},()=>yc.gauss()),e)}function Cu(e,t){if(e.dims.length!==2)throw Error(`The tensor must have 2 dimensions`);if(e.dims.at(-1)%8!=0)throw Error(`The last dimension of the tensor must be a multiple of 8`);if(![`binary`,`ubinary`].includes(t))throw Error(`The precision must be either 'binary' or 'ubinary'`);let n=t===`binary`,r=n?`int8`:`uint8`,i=n?Int8Array:Uint8Array,a=e.data,o=new i(a.length/8);for(let e=0;e0),r=Math.floor(e/8),i=e%8;o[r]|=t<<7-i,n&&i===0&&(o[r]-=128)}return new H(r,o,[e.dims[0],e.dims[1]/8])}async function wu(e){if(!e)throw Error(`modelId is required for get_tokenizer_files`);return(await Gc(e,`tokenizer_config.json`,{})).exists?[`tokenizer.json`,`tokenizer_config.json`]:[]}async function Tu(e,t){let n=await wu(e);return await Promise.all(n.map(n=>nl(e,n,!0,t)))}function Eu(e){let t=e.dims;switch(t.length){case 1:return e.tolist();case 2:if(t[0]!==1)throw Error("Unable to decode tensor with `batch size !== 1`. Use `tokenizer.batch_decode(...)` for batched inputs.");return e.tolist()[0];default:throw Error(`Expected tensor to have 1-2 dimensions, got ${t.length}.`)}}var Du=[`bos_token`,`eos_token`,`unk_token`,`sep_token`,`pad_token`,`cls_token`,`mask_token`];function Ou(e,t,n,r){for(let i of Object.keys(e)){let a=t-e[i].length,o=n(i),s=Array(a).fill(o);e[i]=r===`right`?ai(e[i],s):ai(s,e[i])}}function ku(e,t){for(let n of Object.keys(e))e[n].length=t}function Au(e,...t){for(let n of t){if(!Object.hasOwn(e,n))continue;let t=e[n];if(t){if(typeof t==`object`){if(t.__type===`AddedToken`)return t.content;throw Error(`Unknown token: ${t}`)}return t}}return null}function ju(e){let t=[];for(let n of e.get_added_tokens_decoder().values())n.special&&t.push(n);return t}var W=class extends $r{return_token_type_ids=!1;padding_side=`right`;constructor(e,t){if(super(),this._tokenizerJSON=e,this._tokenizerConfig=t,this._tokenizer=new Do(e,t),this.config=t,this.padding_side=t.padding_side??this.padding_side,this.mask_token=Au(t,`mask_token`),this.mask_token_id=this._tokenizer.token_to_id(this.mask_token),this.pad_token=Au(t,`pad_token`,`eos_token`),this.pad_token_id=this._tokenizer.token_to_id(this.pad_token),this.sep_token=Au(t,`sep_token`),this.sep_token_id=this._tokenizer.token_to_id(this.sep_token),this.unk_token=Au(t,`unk_token`),this.unk_token_id=this._tokenizer.token_to_id(this.unk_token),this.bos_token=Au(t,`bos_token`),this.bos_token_id=this._tokenizer.token_to_id(this.bos_token),this.eos_token=Au(t,`eos_token`),this.eos_token_id=this._tokenizer.token_to_id(this.eos_token),this.chat_template=t.chat_template??null,Array.isArray(this.chat_template)){let e=/* @__PURE__ */ Object.create(null);for(let{name:t,template:n}of this.chat_template){if(typeof t!=`string`||typeof n!=`string`)throw Error(`Chat template must be a list of objects with "name" and "template" properties`);e[t]=n}this.chat_template=e}this._compiled_template_cache=/* @__PURE__ */ new Map;let n=ju(this._tokenizer);this.all_special_ids=n.map(e=>e.id),this.all_special_tokens=n.map(e=>e.content)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let o=await Tu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a});return new this(...o)}get_vocab(){return this._tokenizer.get_vocab()}get model_max_length(){return this._tokenizerConfig.model_max_length??1/0}get add_eos_token(){return this._tokenizerConfig.add_eos_token}get add_bos_token(){return this._tokenizerConfig.add_bos_token}convert_tokens_to_ids(e){return typeof e==`string`?this._tokenizer.token_to_id(e):e.map(e=>this._tokenizer.token_to_id(e))}_call(e,t={}){let{text_pair:n=null,add_special_tokens:r=!0,padding:i=!1,return_token_type_ids:a=null}=t,{truncation:o=null,max_length:s=null}=t,c=t.return_tensor??!0,l=Array.isArray(e),u;if(l){if(e.length===0)throw Error(`text array must be non-empty`);if(n!==null){if(!Array.isArray(n))throw Error(`text_pair must also be an array`);if(e.length!==n.length)throw Error(`text and text_pair must have the same length`);u=e.map((e,t)=>this._encode_plus(e,{text_pair:n[t],add_special_tokens:r,return_token_type_ids:a}))}else u=e.map(e=>this._encode_plus(e,{add_special_tokens:r,return_token_type_ids:a}))}else{if(e==null)throw Error(`text may not be null or undefined`);if(Array.isArray(n))throw Error("When specifying `text_pair`, since `text` is a string, `text_pair` must also be a string (i.e., not an array).");u=[this._encode_plus(e,{text_pair:n,add_special_tokens:r,return_token_type_ids:a})]}if(s===null?s=this.model_max_length:o===null&&(i===!0?(A.warn("`max_length` is ignored when `padding: true` and there is no truncation strategy. To pad to max length, use `padding: 'max_length'`."),s=this.model_max_length):i===!1&&(A.warn("Truncation was not explicitly activated but `max_length` is provided a specific value, please use `truncation: true` to explicitly truncate examples to max length."),o=!0)),i===!0&&(s=Math.min(cl(u.map(e=>e.input_ids.length))[0],s??1/0)),s=Math.min(s,this.model_max_length??1/0),i||o)for(let e=0;es?o&&ku(u[e],s):i&&Ou(u[e],s,e=>e===`input_ids`?this.pad_token_id:0,this.padding_side);let d={};if(c){if(!(i&&o)&&u.some(e=>{for(let t of Object.keys(e))if(e[t].length!==u[0][t]?.length)return!0;return!1}))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=true' and 'truncation=true' to have batched tensors with the same length.`);let e=[u.length,u[0].input_ids.length];for(let t of Object.keys(u[0]))d[t]=new H(`int64`,BigInt64Array.from(u.flatMap(e=>e[t]).map(BigInt)),e)}else{for(let e of Object.keys(u[0]))d[e]=u.map(t=>t[e]);if(!l)for(let e of Object.keys(d))d[e]=d[e][0]}return d}_encode_text(e){return e===null?null:this._tokenizer.encode(e).tokens}_encode_plus(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{ids:i,attention_mask:a,token_type_ids:o}=this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r??this.return_token_type_ids});return{input_ids:i,attention_mask:a,...o?{token_type_ids:o}:{}}}tokenize(e,{pair:t=null,add_special_tokens:n=!1}={}){return this._tokenizer.tokenize(e,{text_pair:t,add_special_tokens:n})}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){return this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r}).ids}batch_decode(e,t={}){return e instanceof H&&(e=e.tolist()),e.map(e=>this.decode(e,t))}decode(e,t={}){if(e instanceof H&&(e=Eu(e)),!Array.isArray(e)||e.length===0||!ni(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);return this.decode_single(e,t)}decode_single(e,{skip_special_tokens:t=!1,clean_up_tokenization_spaces:n=null}){return this._tokenizer.decode(e,{skip_special_tokens:t,clean_up_tokenization_spaces:n})}get_chat_template({chat_template:e=null,tools:t=null}={}){if(this.chat_template&&typeof this.chat_template==`object`){let n=this.chat_template;if(e!==null&&Object.hasOwn(n,e))e=n[e];else if(e===null){if(t!==null&&`tool_use`in n)e=n.tool_use;else if(`default`in n)e=n.default;else throw Error(`This model has multiple chat templates with no default specified! Please either pass a chat template or the name of the template you wish to use to the 'chat_template' argument. Available template names are ${Object.keys(n).sort()}.`)}}else if(e===null){if(this.chat_template)e=this.chat_template;else throw Error(`Cannot use apply_chat_template() because tokenizer.chat_template is not set and no template argument was passed! For information about writing templates and setting the tokenizer.chat_template attribute, please see the documentation at https://huggingface.co/docs/transformers/main/en/chat_templating`)}return e}apply_chat_template(e,t={}){let{tools:n=null,documents:r=null,chat_template:i=null,add_generation_prompt:a=!1,tokenize:o=!0,padding:s=!1,truncation:c=!1,max_length:l=null,return_tensor:u=!0,return_dict:d=!0,tokenizer_kwargs:f={},...p}=t;if(i=this.get_chat_template({chat_template:i,tools:n}),typeof i!=`string`)throw Error(`chat_template must be a string, but got ${typeof i}`);let m=this._compiled_template_cache.get(i);m===void 0&&(m=new pc(i),this._compiled_template_cache.set(i,m));let h=/* @__PURE__ */ Object.create(null);for(let e of Du){let t=Au(this.config,e);t&&(h[e]=t)}let g=m.render({messages:e,add_generation_prompt:a,tools:n,documents:r,...h,...p});if(o){let e=this._call(g,{add_special_tokens:!1,padding:s,truncation:c,max_length:l,return_tensor:u,...f});return d?e:e.input_ids}return g}};function Mu(e,t,n,r){if(!(`language_codes`in e)||!Array.isArray(e.language_codes))throw Error("Tokenizer must have `language_codes` attribute set and it should be an array of language ids.");if(!(`languageRegex`in e)||!(e.languageRegex instanceof RegExp))throw Error("Tokenizer must have `languageRegex` attribute set and it should be a regular expression.");if(!(`lang_to_token`in e)||typeof e.lang_to_token!=`function`)throw Error("Tokenizer must have `lang_to_token` attribute set and it should be a function.");let i=r.src_lang,a=r.tgt_lang;if(!e.language_codes.includes(a))throw Error(`Target language code "${a}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);if(i!==void 0){if(!e.language_codes.includes(i))throw Error(`Source language code "${i}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);let t=e._tokenizer.post_processor?.config;if(t&&`single`in t){for(let n of t.single)if(`SpecialToken`in n&&e.languageRegex.test(n.SpecialToken.id)){n.SpecialToken.id=e.lang_to_token(i);break}}}return r.forced_bos_token_id=e._tokenizer.token_to_id(e.lang_to_token(a)),e._call(t,n)}var Nu={};Sr(Nu,{AlbertTokenizer:()=>Pu,AutoTokenizer:()=>G,BartTokenizer:()=>Fu,BertTokenizer:()=>Iu,BlenderbotSmallTokenizer:()=>Lu,BlenderbotTokenizer:()=>Ru,BloomTokenizer:()=>zu,CLIPTokenizer:()=>Vu,CamembertTokenizer:()=>Bu,CodeGenTokenizer:()=>Uu,CodeLlamaTokenizer:()=>Hu,CohereAsrTokenizer:()=>Gu,CohereTokenizer:()=>Wu,ConvBertTokenizer:()=>Ku,DebertaTokenizer:()=>Ju,DebertaV2Tokenizer:()=>qu,DistilBertTokenizer:()=>Yu,ElectraTokenizer:()=>Xu,EsmTokenizer:()=>Zu,FalconTokenizer:()=>Qu,GPT2Tokenizer:()=>td,GPTNeoXTokenizer:()=>ed,GemmaTokenizer:()=>$u,HerbertTokenizer:()=>nd,LlamaTokenizer:()=>rd,M2M100Tokenizer:()=>id,MBart50Tokenizer:()=>sd,MBartTokenizer:()=>od,MPNetTokenizer:()=>ud,MarianTokenizer:()=>ad,MgpstrTokenizer:()=>cd,MobileBertTokenizer:()=>ld,NllbTokenizer:()=>dd,NougatTokenizer:()=>fd,PreTrainedTokenizer:()=>W,Qwen2Tokenizer:()=>pd,RoFormerTokenizer:()=>hd,RobertaTokenizer:()=>md,SiglipTokenizer:()=>gd,SpeechT5Tokenizer:()=>_d,SqueezeBertTokenizer:()=>vd,T5Tokenizer:()=>yd,TokenizersBackend:()=>W,VitsTokenizer:()=>xd,Wav2Vec2CTCTokenizer:()=>Sd,WhisperTokenizer:()=>kd,XLMRobertaTokenizer:()=>Ad,XLMTokenizer:()=>jd});var Pu=class extends W{return_token_type_ids=!0},Fu=class extends W{},Iu=class extends W{return_token_type_ids=!0},Lu=class extends W{},Ru=class extends W{},zu=class extends W{},Bu=class extends W{},Vu=class extends W{},Hu=class extends W{},Uu=class extends W{},Wu=class extends W{},Gu=class extends W{},Ku=class extends W{return_token_type_ids=!0},qu=class extends W{return_token_type_ids=!0},Ju=class extends W{return_token_type_ids=!0},Yu=class extends W{},Xu=class extends W{return_token_type_ids=!0},Zu=class extends W{},Qu=class extends W{},$u=class extends W{},ed=class extends W{},td=class extends W{},nd=class extends W{return_token_type_ids=!0},rd=class extends W{padding_side=`left`},id=class extends W{constructor(e,t){super(e,t),this.languageRegex=/^__[a-z]{2,3}__$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e.slice(2,-2)),this.lang_to_token=e=>`__${e}__`}_build_translation_inputs(e,t,n){return Mu(this,e,t,n)}},ad=class extends W{constructor(e,t){super(e,t),this.languageRegex=/^(>>\w+<<)\s*/g,this.supported_language_codes=Array.from(this.get_vocab().keys()).filter(e=>this.languageRegex.test(e)),A.warn('WARNING: `MarianTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}_encode_text(e){if(e===null)return null;let[t,...n]=e.trim().split(this.languageRegex);if(n.length===0)return super._encode_text(t);if(n.length===2){let[e,t]=n;return this.supported_language_codes.includes(e)||A.warn(`Unsupported language code "${e}" detected, which may lead to unexpected behavior. Should be one of: ${JSON.stringify(this.supported_language_codes)}`),ai([e],super._encode_text(t))}}},od=class extends W{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{2}_[A-Z]{2}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Mu(this,e,t,n)}},sd=class extends od{},cd=class extends W{},ld=class extends W{return_token_type_ids=!0},ud=class extends W{},dd=class extends W{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{3}_[A-Z][a-z]{3}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Mu(this,e,t,n)}},fd=class extends W{},pd=class extends W{},md=class extends W{},hd=class extends W{return_token_type_ids=!0},gd=class extends W{},_d=class extends W{},vd=class extends W{return_token_type_ids=!0},yd=class extends W{},bd=class extends mo{decode_chain(e){let t=``;for(let n=1;n[t,e]),[`burmese`,`my`],[`valencian`,`ca`],[`flemish`,`nl`],[`haitian`,`ht`],[`letzeburgesch`,`lb`],[`pushto`,`ps`],[`panjabi`,`pa`],[`moldavian`,`ro`],[`moldovan`,`ro`],[`sinhalese`,`si`],[`castilian`,`es`]]);function Ed(e){e=e.toLowerCase();let t=Td.get(e);if(t===void 0){let n=e.match(/^<\|([a-z]{2})\|>$/);if(n&&(e=n[1]),wd.has(e))t=e;else{let t=e.length===2?wd.keys():wd.values();throw Error(`Language "${e}" is not supported. Must be one of: ${JSON.stringify(Array.from(t))}`)}}return t}var Dd=/* @__PURE__ */ RegExp(`^[\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E]+$`,`gu`),Od=.1,kd=class extends W{get timestamp_begin(){return this._tokenizer.token_to_id(`<|notimestamps|>`)+1}_decode_asr(e,{return_timestamps:t=!1,return_language:n=!1,time_precision:r=null,force_full_sequences:i=!0}={}){if(r===null)throw Error(`Must specify time_precision`);let a=null,o=t===`word`;function s(){return{language:a,timestamp:[null,null],text:``}}let c=[],l=s(),u=0,d=this.timestamp_begin,f=d+1500,p=[],m=[],h=!1,g=null,_=new Set(this.all_special_ids);for(let n of e){let e=n.tokens,i=o?n.token_timestamps:null,v=null,y=d;if(`stride`in n){let[t,i,a]=n.stride;if(u-=i,g=t-a,i&&(y=i/r+d),a)for(let t=e.length-1;t>=0;--t){let n=Number(e[t]);if(n>=d){if(v!==null&&(n-d)*r=d&&g<=f){let e=ml((g-d)*r+u,2);if(v!==null&&g>=v)h=!0;else if(h||p.length>0&&g0&&l.timestamp[1]!==null))for(let e of l.words)e.timestamp[1]>l.timestamp[1]&&l.timestamp[1]>=e.timestamp[0]&&(e.timestamp[1]=l.timestamp[1]);c.push(l),p=[],b=[],m=[],x=[],l=s()}}else if(b.push(g),o){let e=ml(i[n]+u,2),t;if(n+10?(p.push(b),o&&m.push(x)):p.every(e=>e.length===0)&&(l=s(),p=[],b=[],m=[],x=[])}if(p.length>0){if(i&&t)throw Error(`Whisper did not predict an ending timestamp, which can happen if audio is cut off in the middle of a word. Also make sure WhisperTimeStampLogitsProcessor was used during generation.`);let[e,n]=this.findLongestCommonSequence(p,m),r=this.decode(e);l.text=r,o&&(l.words=this.collateWordTimestamps(e,n,a)),c.push(l)}let v=/* @__PURE__ */ Object.create(null),y=c.map(e=>e.text).join(``);if(t||n){for(let e=0;e0,o=a?[]:null,s=a?t[0]:null;for(let c=1;ce===g[n]&&s[i+n][0]-Od<=t[c][m+n][0]).length:p.filter((e,t)=>e===g[t]).length;let v=e/1e4,y=_/e+v;_>1&&y>u&&(u=y,d=[i,o,m,h])}let[p,m,h,g]=d,_=Math.floor((m+p)/2),v=Math.floor((g+h)/2);if(a&&u===0&&r>0){let e=s[r-1][0],n=t[c].findIndex(t=>t[0]>=e);v=n===-1?l.length:n}i.push(...n.slice(0,_)),n=l.slice(v),r=n.length,a&&(o.push(...s.slice(0,_)),s=t[c].slice(v))}return i.push(...n),a?(o.push(...s),[i,o]):[i,[]]}collateWordTimestamps(e,t,n){let[r,i,a]=this.combineTokensIntoWords(e,n),o=[];for(let e=0;e=r){let e=((t-r)*n).toFixed(2);i.push(`<|${e}|>`),i.push([])}else i[i.length-1].push(t);return i=i.map(e=>typeof e==`string`?e:super.decode(e,t)),i.join(``)}splitTokensOnUnicode(e){let t=this.decode(e,{decode_with_timestamps:!0}),n=[],r=[],i=[],a=[],o=[],s=0;for(let c=0;c=this._tokenizer.token_to_id(`<|endoftext|>`),d=s.startsWith(` `),f=s.trim(),p=Dd.test(f);if(u||d||p||i.length===0)i.push(s),a.push(c),o.push(l);else{let e=i.length-1;i[e]+=s,a[e].push(...c),o[e].push(...l)}}return[i,a,o]}mergePunctuations(e,t,n,r,i){let a=structuredClone(e),o=structuredClone(t),s=structuredClone(n),c=a.length-2,l=a.length-1;for(;c>=0;)a[c].startsWith(` `)&&r.includes(a[c].trim())?(a[l]=a[c]+a[l],o[l]=ai(o[c],o[l]),s[l]=ai(s[c],s[l]),a[c]=``,o[c]=[],s[c]=[]):l=c,--c;for(c=0,l=1;le),o.filter(e=>e.length>0),s.filter(e=>e.length>0)]}},Ad=class extends W{},jd=class extends W{return_token_type_ids=!0;constructor(e,t){super(e,t),A.warn('WARNING: `XLMTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}},G=class{static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let[o,s]=await Tu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a}),c=s.tokenizer_class?.replace(/Fast$/,``)??`PreTrainedTokenizer`,l=Nu[c];return l||=(A.warn(`Unknown tokenizer class "${c}", attempting to construct from base class.`),W),new l(o,s)}},Md=`https://github.com/huggingface/transformers.js/issues/new/choose`,Nd=`preprocessor_config.json`,Pd=`preprocessor_config.json`,Fd=`processor_config.json`,Id=`chat_template.jinja`,K=class extends $r{static classes=[`image_processor_class`,`tokenizer_class`,`feature_extractor_class`];static uses_processor_config=!1;static uses_chat_template_file=!1;constructor(e,t,n){super(),this.config=e,this.components=t,this.chat_template=n}get image_processor(){return this.components.image_processor}get tokenizer(){return this.components.tokenizer}get feature_extractor(){return this.components.feature_extractor}apply_chat_template(e,t={}){if(!this.tokenizer)throw Error(`Unable to apply chat template without a tokenizer.`);return this.tokenizer.apply_chat_template(e,{tokenize:!1,chat_template:this.chat_template??void 0,...t})}batch_decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.batch_decode(...e)}decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.decode(...e)}async _call(e,...t){for(let n of[this.image_processor,this.feature_extractor,this.tokenizer])if(n)return n(e,...t);throw Error(`No image processor, feature extractor, or tokenizer found.`)}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([this.uses_processor_config?nl(e,Fd,!0,t):{},Promise.all(this.classes.filter(e=>e in this).map(async n=>{let r=await this[n].from_pretrained(e,t);return[n.replace(/_class$/,``),r]})).then(Object.fromEntries),this.uses_chat_template_file?tl(e,Id,!0,t):null]);return new this(n,r,i)}};Sr({},{ChatterboxProcessor:()=>jf,CohereAsrProcessor:()=>Nf,Florence2Processor:()=>xm,Gemma3Processor:()=>Sm,Gemma3nProcessor:()=>Cm,Gemma4Processor:()=>wm,Glm46VProcessor:()=>Em,GraniteSpeechProcessor:()=>Dm,GroundingDinoProcessor:()=>km,Idefics3Processor:()=>Nm,JinaCLIPProcessor:()=>Fm,Lfm2VlProcessor:()=>Im,LlavaProcessor:()=>Lm,MgpstrProcessor:()=>zm,MoonshineProcessor:()=>Bm,OwlViTProcessor:()=>Vm,PaliGemmaProcessor:()=>Wm,Phi3VProcessor:()=>qm,PixtralProcessor:()=>Jm,Processor:()=>K,PyAnnoteProcessor:()=>Ym,Qwen2VLProcessor:()=>Tm,Qwen2_5_VLProcessor:()=>Xm,Qwen3VLProcessor:()=>Zm,Sam2Processor:()=>$m,Sam2VideoProcessor:()=>eh,SamProcessor:()=>Qm,SmolVLMProcessor:()=>Nm,SpeechT5Processor:()=>th,UltravoxProcessor:()=>nh,VLChatProcessor:()=>Pm,VoxtralProcessor:()=>sh,VoxtralRealtimeProcessor:()=>ph,Wav2Vec2Processor:()=>mh,Wav2Vec2ProcessorWithLM:()=>hh,WhisperProcessor:()=>gh});var Ld=class extends $r{constructor(e){super(),this.config=e}static async from_pretrained(e,t={}){let n=await nl(e,Nd,!0,t);return new this(n)}};function Rd(e,t){if(!(e instanceof Float32Array||e instanceof Float64Array))throw Error(`${t} expects input to be a Float32Array or a Float64Array, but got ${e?.constructor?.name??typeof e} instead. If using the feature extractor directly, remember to use \`load_audio(url, sampling_rate)\` to obtain the raw audio data of the file/url.`)}var zd={};Sr(zd,{ASTFeatureExtractor:()=>uf,ChatterboxFeatureExtractor:()=>ff,ClapFeatureExtractor:()=>pf,CohereAsrFeatureExtractor:()=>gf,DacFeatureExtractor:()=>_f,EncodecFeatureExtractor:()=>df,FeatureExtractor:()=>Ld,Gemma3nAudioFeatureExtractor:()=>vf,Gemma4AudioFeatureExtractor:()=>yf,GraniteSpeechFeatureExtractor:()=>bf,MoonshineFeatureExtractor:()=>xf,ParakeetFeatureExtractor:()=>hf,PyAnnoteFeatureExtractor:()=>Sf,SeamlessM4TFeatureExtractor:()=>Cf,SnacFeatureExtractor:()=>wf,SpeechT5FeatureExtractor:()=>Tf,VoxtralRealtimeFeatureExtractor:()=>Of,Wav2Vec2FeatureExtractor:()=>Ef,WeSpeakerFeatureExtractor:()=>Df,WhisperFeatureExtractor:()=>kf});var Bd={fromWeb:()=>{}};async function Vd(e,t){if(O.IS_BROWSER_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save a file from a Web Worker.`);let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e,r.click(),r.remove(),URL.revokeObjectURL(n)}else if(O.IS_FS_AVAILABLE){let n=t.stream();Bd.fromWeb(n),Cr.createWriteStream(e),await void 0}else throw Error(`Unable to save because filesystem is disabled in this environment.`)}async function Hd(e,t){if(typeof AudioContext>`u`)throw Error("Unable to load audio from path/URL since `AudioContext` is not available in your environment. Instead, audio data should be passed directly to the pipeline/processor. For more information and some example code, see https://huggingface.co/docs/transformers.js/guides/node-audio-processing.");let n=await(await qc(e)).arrayBuffer(),r=new AudioContext({sampleRate:t});t===void 0&&A.warn(`No sampling rate provided, using default of ${r.sampleRate}Hz.`);let i=await r.decodeAudioData(n),a;if(i.numberOfChannels===2){let e=Math.sqrt(2),t=i.getChannelData(0),n=i.getChannelData(1);a=new Float32Array(t.length);for(let r=0;r2595*Math.log10(1+e/700),kaldi:e=>1127*Math.log(1+e/700),slaney:(e,t=1e3,n=15,r=27/Math.log(6.4))=>e>=t?n+Math.log(e/t)*r:3*e/200};function Jd(e,t=`htk`){let n=qd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}var Yd={htk:e=>700*(10**(e/2595)-1),kaldi:e=>700*(Math.exp(e/1127)-1),slaney:(e,t=1e3,n=15,r=Math.log(6.4)/27)=>e>=n?t*Math.exp(r*(e-n)):200*e/3};function Xd(e,t=`htk`){let n=Yd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}function Zd(e,t){let n=Float64Array.from({length:t.length-1},(e,n)=>t[n+1]-t[n]),r=Array.from({length:e.length},()=>Array(t.length));for(let n=0;nArray(e.length));for(let t=0;te+r*n)}function $d(e,t,n,r,i,a=null,o=`htk`,s=!1){if(a!==null&&a!==`slaney`)throw Error(`norm must be one of null or "slaney"`);if(e<2)throw Error(`Require num_frequency_bins: ${e} >= 2`);if(n>r)throw Error(`Require min_frequency: ${n} <= max_frequency: ${r}`);let c=Qd(Jd(n,o),Jd(r,o),t+2),l=Xd(c,o),u;if(s){let t=i/((e-1)*2);u=Jd(Float64Array.from({length:e},(e,n)=>n*t),o),l=c}else u=Qd(0,Math.floor(i/2),e);let d=Zd(u,l);if(a!==null&&a===`slaney`)for(let n=0;ni)throw Error(`frame_length (${n}) may not be larger than fft_length (${i})`);if(w!==n)throw Error(`Length of the window (${w}) must equal frame_length (${n})`);if(r<=0)throw Error(`hop_length must be greater than zero`);if(a===null&&d!==null)throw Error("You have provided `mel_filters` but `power` is `None`. Mel spectrogram computation is not yet supported for complex-valued spectrogram. Specify `power` to fix this issue.");if(!u)throw Error("`preemphasis_htk_flavor=false` is not currently supported.");if(o){let t=Math.floor(n/2);switch(s){case`reflect`:e=ef(e,t,t);break;case`constant`:{let n=new e.constructor(e.length+2*t);n.set(e,t),e=n;break}case`semicausal`:{let n=new e.constructor(e.length+t);n.set(e,t),e=n;break}default:throw Error(`pad_mode="${s}" not implemented yet.`)}}let te=Math.floor(1+Math.floor((e.length-n)/r));y!==null&&tete?x&&(ie=b):ie=re=b);let ae=new fl(i),oe=new Float64Array(i),se=new Float64Array(ae.outputBufferSize),ce=new Float32Array(ne*ie);for(let i=0;i=1;--e)oe[e]-=l*oe[e-1];oe[0]*=1-l}for(let e=0;ee**.85);break;default:throw Error(`Unknown window type ${t}.`)}if(n&&(o=o.subarray(0,e)),r===null||e===r)return o;if(e>r)throw Error(`Length of the window (${e}) may not be larger than frame_length (${r})`);let s=new Float64Array(r),c=i?Math.floor((r-e)/2):0;return s.set(o,c),s}function sf(e,t){let n=e.reduce((e,t)=>e+t.length,0),r=/* @__PURE__ */ new ArrayBuffer(44),i=new DataView(r);return cf(i,0,`RIFF`),i.setUint32(4,36+n*4,!0),cf(i,8,`WAVE`),cf(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,3,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*4,!0),i.setUint16(32,4,!0),i.setUint16(34,32,!0),cf(i,36,`data`),i.setUint32(40,n*4,!0),new Blob([r,...e.map(e=>e.buffer instanceof ArrayBuffer?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e.slice())],{type:`audio/wav`})}function cf(e,t,n){for(let r=0;re+t.length,0),t=new Float32Array(e),n=0;for(let e of this.audio)t.set(e,n),n+=e.length;return t}return this.audio}toBlob(){let e=this.audio;return e instanceof Float32Array&&(e=[e]),sf(e,this.sampling_rate)}async save(e){return Vd(e,this.toBlob())}},uf=class extends Ld{constructor(e){super(e);let t=this.config.sampling_rate,n=$d(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=of(400,`hann`,{periodic:!1}),this.mean=this.config.mean,this.std=this.config.std}async _extract_fbank_features(e,t){return af(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e){Rd(e,`ASTFeatureExtractor`);let t=await this._extract_fbank_features(e,this.config.max_length);if(this.config.do_normalize){let e=this.std*2,n=t.data;for(let t=0;t0){if(n===`rand_trunc`){let n=Math.floor(yc.random()*(a+1));e=e.subarray(n,n+t),i=await this._extract_fbank_features(e,this.mel_filters_slaney,this.config.nb_max_samples)}else throw Error(`Truncation strategy "${n}" not implemented`)}else{if(a<0){let n=new Float64Array(t);if(n.set(e),r===`repeat`)for(let r=e.length;r=1;--n)e[n]-=t*e[n-1];return await af(e,this.window,this.window.length,this.config.hop_length,{fft_length:this.config.n_fft,power:2,mel_filters:this.config.mel_filters,log_mel:`log`,mel_floor:-1/0,pad_mode:`constant`,center:!0,transpose:!0,mel_offset:2**-24})}async _call(e){Rd(e,`ParakeetFeatureExtractor`);let t=await this._extract_fbank_features(e),n=Math.floor((e.length+Math.floor(this.config.n_fft/2)*2-this.config.n_fft)/this.config.hop_length),r=t.data;r.fill(0,n*t.dims[1]);let[i,a]=t.dims,o=new Float64Array(a),s=new Float64Array(a);for(let e=0;e1?n-1:1;for(let e=0;e=l){s.push(e.slice(c,l));break}let t=Math.max(c,c+a-o),n=Math.min(c+a,l),i;i=n<=t?c+a:this._find_split_point_energy(e,t,n,r),i=Math.max(c+1,Math.min(i,l)),s.push(e.slice(c,i)),c=i}return s}_find_split_point_energy(e,t,n,r){let i=n-t;if(i<=r)return Math.floor((t+n)/2);let a=1/0,o=t,s=i-r;for(let n=0;n<=s;n+=r){let i=0;for(let a=0;at&&(e=e.slice(0,t)),r&&e.length%i!==0){let t=i-e.length%i,n=new Float64Array(e.length+t);n.set(e),this.config.padding_value!==0&&n.fill(this.config.padding_value,e.length),e=n}let a=await this._extract_fbank_features(e,this.config.max_length),o=gu([1,a.dims[0]],!0);return{input_features:a.unsqueeze_(0),input_features_mask:o}}},yf=class extends vf{async _extract_fbank_features(e,t){let{frame_length:n,hop_length:r,fft_length:i}=this.config,a=Math.floor(n/2),o=Math.floor((e.length+a-(n+1))/r)+1;return af(e,this.window,n,r,{fft_length:i,center:!0,pad_mode:`semicausal`,onesided:!0,preemphasis:this.config.preemphasis,preemphasis_htk_flavor:this.config.preemphasis_htk_flavor,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:this.config.mel_floor,mel_floor_mode:`add`,remove_dc_offset:!1,transpose:!0,max_num_frames:o})}async _call(e,t={}){Rd(e,`Gemma4AudioFeatureExtractor`);let n=e.length,r=await super._call(e,t),{input_features:i}=r,[,a,o]=i.dims,{frame_length:s,hop_length:c}=this.config,l=Math.floor(s/2),u=s+1,d=new Uint8Array(n+l+(t.pad_to_multiple_of??128));d.fill(1,l,l+n);let f=new Uint8Array(a);for(let e=0;e({id:e,start:t*n,end:r*n,confidence:i/(r-t)})))}return r}},Cf=class extends Ld{constructor(e){super(e);let t=this.config.sampling_rate,n=$d(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=of(400,`povey`,{periodic:!1})}async _extract_fbank_features(e,t){return e=e.map(e=>e*32768),af(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e,{padding:t=!0,pad_to_multiple_of:n=2,do_normalize_per_mel_bins:r=!0,return_attention_mask:i=!0}={}){Rd(e,`SeamlessM4TFeatureExtractor`);let a=await this._extract_fbank_features(e,this.config.max_length);if(r){let[e,t]=a.dims,n=a.data;for(let r=0;r0){let n=new Float32Array(t*(e+s));n.set(r),n.fill(this.config.padding_value,r.length);let c=e+s;a=new H(a.type,n,[c,t]),i&&(o=new H(`int64`,new BigInt64Array(c),[1,c]),o.data.fill(1n,0,e))}}let[s,c]=a.dims,l=this.config.stride;if(s%l!==0)throw Error(`The number of frames (${s}) must be a multiple of the stride (${l}).`);let u=a.view(1,Math.floor(s/l),c*l),d={input_features:u};if(i){let e=u.dims[1],t=new BigInt64Array(e);if(o){let e=o.data;for(let n=1,r=0;ne+t,0)/e.length,n=e.reduce((e,n)=>e+(n-t)**2,0)/e.length;return e.map(e=>(e-t)/Math.sqrt(n+1e-7))}async _call(e){Rd(e,`Wav2Vec2FeatureExtractor`),e instanceof Float64Array&&(e=new Float32Array(e));let t=e;this.config.do_normalize&&(t=this._zero_mean_unit_var_norm(t));let n=[1,t.length];return{input_values:new H(`float32`,t,n),attention_mask:new H(`int64`,new BigInt64Array(t.length).fill(1n),n)}}},Df=class extends Ld{constructor(e){super(e);let t=this.config.sampling_rate,n=$d(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=of(400,`hamming`,{periodic:!1}),this.min_num_frames=this.config.min_num_frames}async _extract_fbank_features(e){return e=e.map(e=>e*32768),af(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,transpose:!0,min_num_frames:this.min_num_frames})}async _call(e){Rd(e,`WeSpeakerFeatureExtractor`);let t=(await this._extract_fbank_features(e)).unsqueeze_(0);if(this.config.fbank_centering_span===null){let e=t.mean(1).data,n=t.data,[r,i,a]=t.dims;for(let t=0;tr?(e.length>this.config.n_samples&&A.warn("Attempting to extract features for audio longer than 30 seconds. If using a pipeline to extract transcript from a long audio clip, remember to specify `chunk_length_s` and/or `stride_length_s`."),n=e.slice(0,r)):(n=new Float32Array(r),n.set(e)),{input_features:(await this._extract_fbank_features(n)).unsqueeze_(0)}}},Af=class{static async from_pretrained(e,t={}){let n=await nl(e,Nd,!0,t),r=n.feature_extractor_type,i=zd[r];if(!i)throw Error(`Unknown feature_extractor_type: '${r}'. Please report this at ${Md}.`);return new i(n)}},jf=class extends K{static tokenizer_class=G;static feature_extractor_class=Af;async _call(e,t=null){let n=this.tokenizer(e),r=t?await this.feature_extractor(t):{};return{...n,...r}}},Mf=/* @__PURE__ */ new Set([`ja`,`zh`]),Nf=class extends K{static tokenizer_class=G;static feature_extractor_class=Af;static uses_processor_config=!0;get_decoder_prompt_ids(e=`en`){let t=[`▁`,`<|startofcontext|>`,`<|startoftranscript|>`,`<|emo:undefined|>`,`<|${e}|>`,`<|${e}|>`,`<|pnc|>`,`<|noitn|>`,`<|notimestamp|>`,`<|nodiarize|>`];return this.tokenizer.convert_tokens_to_ids(t)}static join_chunks(e,t=`en`){let n=e.filter(e=>e&&e.trim());if(n.length===0)return``;let r=Mf.has(t)?``:` `;return[n[0].trimEnd(),...n.slice(1).map(e=>e.trim())].join(r)}async _call(e){return await this.feature_extractor(e)}},Pf={},Ff,If,Lf;if(O.IS_WEB_ENV)Ff=(e,t)=>{if(!self.OffscreenCanvas)throw Error(`OffscreenCanvas not supported by this environment.`);return new self.OffscreenCanvas(e,t)},Lf=self.createImageBitmap,If=self.ImageData;else if(Pf)Lf=async e=>{let t=(await e.metadata()).channels,{data:n,info:r}=await e.rotate().raw().toBuffer({resolveWithObject:!0}),i=new Bf(new Uint8ClampedArray(n),r.width,r.height,r.channels);return t!==void 0&&t!==r.channels&&i.convert(t),i};else throw Error(`Unable to load image processing library.`);var Rf={0:`nearest`,1:`lanczos`,2:`bilinear`,3:`bicubic`,4:`box`,5:`hamming`},zf=/* @__PURE__ */ new Map([[`png`,`image/png`],[`jpg`,`image/jpeg`],[`jpeg`,`image/jpeg`],[`gif`,`image/gif`]]),Bf=class e{constructor(e,t,n,r){this.data=e,this.width=t,this.height=n,this.channels=r}get size(){return[this.width,this.height]}static async read(t){if(t instanceof e)return t;if(typeof t==`string`||t instanceof URL)return await this.fromURL(t);if(t instanceof Blob)return await this.fromBlob(t);if(typeof HTMLCanvasElement<`u`&&t instanceof HTMLCanvasElement||typeof OffscreenCanvas<`u`&&t instanceof OffscreenCanvas)return this.fromCanvas(t);throw Error(`Unsupported input type: ${typeof t}`)}static fromCanvas(t){if(!O.IS_WEB_ENV)throw Error(`fromCanvas() is only supported in browser environments.`);let n=t.getContext(`2d`).getImageData(0,0,t.width,t.height).data;return new e(n,t.width,t.height,4)}static async fromURL(e){let t=await qc(e);if(t.status!==200)throw Error(`Unable to read image from "${e}" (${t.status} ${t.statusText})`);let n=await t.blob();return this.fromBlob(n)}static async fromBlob(e){if(O.IS_WEB_ENV){let t=await Lf(e),n=Ff(t.width,t.height).getContext(`2d`);return n.drawImage(t,0,0),new this(n.getImageData(0,0,t.width,t.height).data,t.width,t.height,4)}{let t=Pf(await e.arrayBuffer());return await Lf(t)}}static fromTensor(t,n=`CHW`){if(t.dims.length!==3)throw Error(`Tensor should have 3 dimensions, but has ${t.dims.length} dimensions.`);if(n===`CHW`)t=t.permute(1,2,0);else if(n!==`HWC`)throw Error(`Unsupported channel format: ${n}`);if(!(t.data instanceof Uint8ClampedArray||t.data instanceof Uint8Array))throw Error(`Unsupported tensor type: ${t.type}`);switch(t.dims[2]){case 1:case 2:case 3:case 4:return new e(t.data,t.dims[1],t.dims[0],t.dims[2]);default:throw Error(`Unsupported number of channels: ${t.dims[2]}`)}}grayscale(){if(this.channels===1)return this;let e=new Uint8ClampedArray(this.width*this.height*1);switch(this.channels){case 3:case 4:for(let t=0,n=0;t=0?c=r:u=-r,i>=0?l=i:d=-i,s.drawImage(o,c,l,t,n,u,d,t,n),new e(s.getImageData(0,0,t,n).data,t,n,4).convert(a)}{let e=this.toSharp();if(r>=0&&i>=0)e=e.extract({left:Math.floor(r),top:Math.floor(i),width:t,height:n});else if(r<=0&&i<=0){let a=Math.floor(-i),o=Math.floor(-r);e=e.extend({top:a,left:o,right:t-this.width-o,bottom:n-this.height-a})}else{let a=[0,0],o=0;i<0?(a[0]=Math.floor(-i),a[1]=n-this.height-a[0]):o=Math.floor(i);let s=[0,0],c=0;r<0?(s[0]=Math.floor(-r),s[1]=t-this.width-s[0]):c=Math.floor(r),e=e.extend({top:a[0],bottom:a[1],left:s[0],right:s[1]}).extract({left:c,top:o,width:t,height:n})}return await Lf(e)}}async toBlob(e=`image/png`,t=1){if(!O.IS_WEB_ENV)throw Error(`toBlob() is only supported in browser environments.`);return await this.toCanvas().convertToBlob({type:e,quality:t})}toTensor(e=`CHW`){let t=new H(`uint8`,new Uint8Array(this.data),[this.height,this.width,this.channels]);if(e!==`HWC`){if(e===`CHW`)t=t.permute(2,0,1);else throw Error(`Unsupported channel format: ${e}`)}return t}toCanvas(){if(!O.IS_WEB_ENV)throw Error(`toCanvas() is only supported in browser environments.`);let e=this.clone().rgba(),t=Ff(e.width,e.height),n=new If(e.data,e.width,e.height);return t.getContext(`2d`).putImageData(n,0,0),t}split(){let{data:t,width:n,height:r,channels:i}=this,a=t.constructor,o=t.length/i,s=Array.from({length:i},()=>new a(o));for(let e=0;enew e(t,n,r,1))}_update(e,t,n,r=null){return this.data=e,this.width=t,this.height=n,r!==null&&(this.channels=r),this}clone(){return new e(this.data.slice(),this.width,this.height,this.channels)}convert(e){if(this.channels===e)return this;switch(e){case 1:this.grayscale();break;case 3:this.rgb();break;case 4:this.rgba();break;default:throw Error(`Conversion failed due to unsupported number of channels: ${this.channels}`)}return this}async save(e){if(O.IS_WEB_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save an image from a Web Worker.`);let t=e.split(`.`).pop().toLowerCase(),n=zf.get(t)??`image/png`;return Vd(e,await this.toBlob(n))}if(O.IS_FS_AVAILABLE)await this.toSharp().toFile(e);else throw Error(`Unable to save the image because filesystem is disabled in this environment.`)}toSharp(){if(O.IS_WEB_ENV)throw Error(`toSharp() is only supported in server-side environments.`);return Pf(this.data,{raw:{width:this.width,height:this.height,channels:this.channels}})}};Bf.read.bind(Bf);function Vf(e,t,n=0,r=null){let i=e/t,a=hl(i)*t;return r!==null&&a>r&&(a=Math.floor(i)*t),at&&i.push(e)}else{let e=cl(n.data)[1];if(e===c-1||(a=al(n.data),a[e]e*o[(t+1)%2])),u.boxes.push(n),u.classes.push(t),u.scores.push(a[t])}}l.push(u)}return l}function Gf(e,t=null){let n=e.logits,r=n.dims[0];if(t!==null&&t.length!==r)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let i=[];for(let e=0;el[n]&&(l[n]=t[n],u[n]=e)}let d=Array(a.dims[0]);for(let e=0;ee!==void 0);i.push({segmentation:c,labels:f})}return i}function Kf(e,t,n,r){let i=[],a=[],o=[];for(let s=0;sn&&(i.push(l),a.push(d),o.push(u))}return[i,a,o]}function qf(e,t,n,r=.5,i=.8){let a=[],o=0,s=0,c=t[n].data;for(let t=0;t=r&&++s;let l=o>0&&s>0;return l&&=o/s>i,[l,a]}function Jf(e,t,n,r,i,a=null,o=null){let[s,c]=o??e[0].dims,l=new H(`int32`,new Int32Array(s*c),[s,c]),u=[];if(o!==null)for(let t=0;tf[e]&&(d[e]=n,f[e]=i[e])}let p=0,m=l.data;for(let a=0;a200)throw Error(`absolute aspect ratio must be smaller than 200, got ${Math.max(e,t)/Math.min(e,t)}`);let o=Math.round(e/n)*n,s=Math.round(t/n)*n;if(a*o*s>i){let r=Math.sqrt(a*e*t/i);o=Math.max(n,Math.floor(e/r/n)*n),s=Math.max(n,Math.floor(t/r/n)*n)}else if(a*o*si?c=Math.floor(i*s/r):i>r&&(s=Math.floor(r*c/i)),await e.resize(c,s,{resample:n}))}async crop_margin(e,t=200){let n=e.clone().grayscale(),r=sl(n.data)[0],i=cl(n.data)[0]-r;if(i===0)return e;let a=t/255,o=n.width,s=n.height,c=0,l=0,u=n.data;for(let e=0;ethis.preprocess(e)));return{pixel_values:uu(n.map(e=>e.pixel_values),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}static async from_pretrained(e,t={}){let n=await nl(e,Pd,!0,t);return new this(n)}},Qf={};Sr(Qf,{BeitFeatureExtractor:()=>$f,BitImageProcessor:()=>ep,CHMv2ImageProcessor:()=>np,CLIPFeatureExtractor:()=>ip,CLIPImageProcessor:()=>rp,ChineseCLIPFeatureExtractor:()=>tp,ConvNextFeatureExtractor:()=>op,ConvNextImageProcessor:()=>ap,DINOv3ViTImageProcessor:()=>dp,DPTFeatureExtractor:()=>hp,DPTImageProcessor:()=>mp,DeiTFeatureExtractor:()=>cp,DeiTImageProcessor:()=>sp,DetrFeatureExtractor:()=>up,DetrImageProcessor:()=>lp,DonutFeatureExtractor:()=>pp,DonutImageProcessor:()=>fp,EfficientNetImageProcessor:()=>gp,GLPNFeatureExtractor:()=>Cp,Gemma3ImageProcessor:()=>_p,Gemma4ImageProcessor:()=>bp,Glm46VImageProcessor:()=>Sp,GroundingDinoImageProcessor:()=>wp,Idefics3ImageProcessor:()=>Tp,ImageFeatureExtractor:()=>q,ImageProcessor:()=>q,JinaCLIPImageProcessor:()=>Dp,Lfm2VlImageProcessor:()=>Np,LlavaOnevisionImageProcessor:()=>Pp,Mask2FormerImageProcessor:()=>Lp,MaskFormerFeatureExtractor:()=>Ip,MaskFormerImageProcessor:()=>Fp,MobileNetV1FeatureExtractor:()=>zp,MobileNetV1ImageProcessor:()=>Rp,MobileNetV2FeatureExtractor:()=>Vp,MobileNetV2ImageProcessor:()=>Bp,MobileNetV3FeatureExtractor:()=>Up,MobileNetV3ImageProcessor:()=>Hp,MobileNetV4FeatureExtractor:()=>Gp,MobileNetV4ImageProcessor:()=>Wp,MobileViTFeatureExtractor:()=>qp,MobileViTImageProcessor:()=>Kp,NougatImageProcessor:()=>Jp,OwlViTFeatureExtractor:()=>Xp,OwlViTImageProcessor:()=>Yp,Owlv2ImageProcessor:()=>Zp,Phi3VImageProcessor:()=>rm,PixtralImageProcessor:()=>im,PvtImageProcessor:()=>am,Qwen2VLImageProcessor:()=>xp,RTDetrImageProcessor:()=>om,Sam2ImageProcessor:()=>sm,Sam3ImageProcessor:()=>sm,SamImageProcessor:()=>sm,SapiensFeatureExtractor:()=>lm,SapiensImageProcessor:()=>cm,SegformerFeatureExtractor:()=>dm,SegformerImageProcessor:()=>um,SiglipImageProcessor:()=>fm,SmolVLMImageProcessor:()=>Tp,Swin2SRImageProcessor:()=>pm,VLMImageProcessor:()=>Ep,ViTFeatureExtractor:()=>hm,ViTImageProcessor:()=>mm,VitMatteImageProcessor:()=>gm,VitPoseImageProcessor:()=>_m,YolosFeatureExtractor:()=>ym,YolosImageProcessor:()=>vm});var $f=class extends q{},ep=class extends q{},tp=class extends q{},np=class extends q{},rp=class extends q{},ip=class extends rp{},ap=class extends q{constructor(e){super(e),this.crop_pct=this.config.crop_pct??224/256}async resize(e){let t=this.size?.shortest_edge;if(t===void 0)throw Error(`Size dictionary must contain 'shortest_edge' key.`);if(t<384){let n=Math.floor(t/this.crop_pct),[r,i]=this.get_resize_output_image_size(e,{shortest_edge:n});e=await e.resize(r,i,{resample:this.resample}),e=await e.center_crop(t,t)}else e=await e.resize(t,t,{resample:this.resample});return e}},op=class extends ap{},sp=class extends q{},cp=class extends sp{},lp=class extends q{async _call(e){let t=await super._call(e),n=gu([t.pixel_values.dims[0],64,64],1n);return{...t,pixel_mask:n}}post_process_object_detection(...e){return Wf(...e)}post_process_panoptic_segmentation(...e){return Xf(...e)}post_process_instance_segmentation(...e){return Zf(...e)}},up=class extends lp{},dp=class extends q{},fp=class extends q{pad_image(e,t,n,r={}){let[i,a,o]=t,s=this.image_mean;Array.isArray(this.image_mean)||(s=Array(o).fill(s));let c=this.image_std;Array.isArray(c)||(c=Array(o).fill(s));let l=s.map((e,t)=>-e/c[t]);return super.pad_image(e,t,n,{center:!0,constant_values:l,...r})}},pp=class extends fp{},mp=class extends q{},hp=class extends mp{},gp=class extends q{constructor(e){super(e),this.include_top=this.config.include_top??!0,this.include_top&&(this.image_std=this.image_std.map(e=>e*e))}},_p=class extends q{};function vp(e,t,n,r,i){let a=r*n**2,o=Math.sqrt(a/(e*t)),s=i*n,c=Math.floor(o*e/s)*s,l=Math.floor(o*t/s)*s;if(c===0&&l===0)throw Error(`Attempting to resize to a 0 x 0 image. Resized height should be divisible by \`pooling_kernel_size * patch_size\`=${s}.`);let u=Math.floor(r/i**2)*s;return c===0?(c=s,l=Math.min(Math.floor(t/e)*s,u)):l===0&&(l=s,c=Math.min(Math.floor(e/t)*s,u)),[c,l]}function yp(e,t,n,r,i,a,o){let s=Math.floor(t/i),c=Math.floor(n/i),l=s*c,u=i*i*r,d=new Float32Array(a*u),f=0;for(let t=0;ta),0));let l=a.dims[0]/o,u=a.dims[1],d=Math.floor(a.dims[2]/c),f=Math.floor(a.dims[3]/c);return{pixel_values:a.view(l,o,u,Math.floor(d/s),s,c,Math.floor(f/s),s,c).permute(0,3,6,4,7,2,1,5,8).view(l*d*f,u*o*c*c),image_grid_thw:new H(`int64`,[l,d,f],[1,3]),original_sizes:r,reshaped_input_sizes:i}}},Sp=class extends xp{get_resize_output_image_size(e,t){let n=this.patch_size*this.merge_size,r=this.config.temporal_patch_size??2;return Yf(e.height,e.width,n,this.min_pixels,this.max_pixels,r)}},Cp=class extends q{},wp=class extends q{async _call(e){let t=await super._call(e),n=t.pixel_values.dims,r=vu([n[0],n[2],n[3]]);return{...t,pixel_mask:r}}},Tp=class extends q{constructor(e){super(e),this.do_image_splitting=e.do_image_splitting??!0,this.max_image_size=e.max_image_size}get_resize_for_vision_encoder(e,t){let[n,r]=e.dims.slice(-2),i=r/n;return r>=n?(r=Math.ceil(r/t)*t,n=Math.floor(r/i),n=Math.ceil(n/t)*t):(n=Math.ceil(n/t)*t,r=Math.floor(n*i),r=Math.ceil(r/t)*t),{height:n,width:r}}async _call(e,{do_image_splitting:t=null,return_row_col_info:n=!1}={}){let r;if(!Array.isArray(e))r=[[e]];else{if(e.length===0||!e[0])throw Error(`No images provided.`);r=Array.isArray(e[0])?e:[e]}let i=[],a=[],o=[],s=[],c=[];for(let e of r){let n=await Promise.all(e.map(e=>this.preprocess(e)));s.push(...n.map(e=>e.original_size)),c.push(...n.map(e=>e.reshaped_input_size)),n.forEach(e=>e.pixel_values.unsqueeze_(0));let{longest_edge:r}=this.max_image_size,l;if(t??this.do_image_splitting){let e=Array(n.length),t=Array(n.length);l=await Promise.all(n.map(async(n,i)=>{let a=this.get_resize_for_vision_encoder(n.pixel_values,r),o=await tu(n.pixel_values,{size:[a.height,a.width]}),{frames:s,num_splits_h:c,num_splits_w:l}=await this.split_image(o,this.max_image_size);return e[i]=c,t[i]=l,U(s,0)})),a.push(e),o.push(t)}else{let e=[r,r];l=await Promise.all(n.map(t=>tu(t.pixel_values,{size:e}))),a.push(Array(n.length).fill(0)),o.push(Array(n.length).fill(0))}i.push(U(l,0))}let l=i.length,[u,d,f,p]=i[0].dims,m,h;if(l===1)m=i[0].unsqueeze_(0),h=gu([l,u,f,p],!0);else{let e=Math.max(...i.map(e=>e.dims.at(0)));h=gu([l,e,f,p],!0);let t=h.data,n=e*f*p;for(let r=0;rn||o>r){s=Math.ceil(a/n),c=Math.ceil(o/r);let t=Math.ceil(a/s),l=Math.ceil(o/c);for(let n=0;ne*this.rescale_factor)}pad_image(e,t,n,r){return super.pad_image(e,t,n,{constant_values:this.constant_values,center:!0,...r})}},Dp=class extends q{constructor(e){let{resize_mode:t,fill_color:n,interpolation:r,size:i,...a}=e,o=t===`squash`?{width:i,height:i}:t===`shortest`?{shortest_edge:i}:{longest_edge:i},s=r===`bicubic`?3:2;super({...a,size:o,resample:s,do_center_crop:!0,crop_size:i,do_normalize:!0})}};function Op(e,t){return Math.round(e/t)*t}function kp(e,t,n,r,i){let a=1/0,o=[1,1],s=n*r;for(let n of t){let t=Math.abs(e-n[0]/n[1]);t.5*i*i*n[0]*n[1]&&(o=n)}return o}function Ap(e,t){let n=[],r=/* @__PURE__ */ new Set;for(let i=e;i<=t;++i)for(let a=1;a<=i;++a)for(let o=1;o<=i;++o){let i=a*o;if(i>=e&&i<=t){let e=a<<16|o;r.has(e)||(r.add(e),n.push([a,o]))}}return n.sort((e,t)=>e[0]*e[1]-t[0]*t[1])}function jp(e,t){let[n,r,i,a]=e.dims,o=Math.floor(i/t),s=Math.floor(a/t),c=t*t*r,l=e.data,u=new Float32Array(n*o*s*c),d=i*a;for(let e=0;ethis.max_image_tokens*(this.encoder_patch_size*this.downsample_factor)**2*this.max_pixels_tolerance}_get_grid_layout(e,t){let n=Ap(this.min_tiles,this.max_tiles),[r,i]=kp(t/e,n,t,e,this.tile_size);return{grid_width:r,grid_height:i,target_width:this.tile_size*r,target_height:this.tile_size*i}}async _call(e,{return_row_col_info:t=null}={}){let n;n=Array.isArray(e)?Array.isArray(e[0])?e:[e]:[[e]];let r=[],i=[],a=[],o=[],s=[],c=[];for(let e of n){let t=await Promise.all(e.map(e=>this.preprocess(e,{do_pad:!1})));for(let{pixel_values:e}of t){let[,t,n]=e.dims,l=e.unsqueeze_(0),u=this.encoder_patch_size*this.downsample_factor,d=u**2,[f,p]=Yf(Math.max(u,t),Math.max(u,n),u,this.min_image_tokens*d,this.max_image_tokens*d).map(e=>Math.max(u,e)),m,h=1,g=1,_=this._is_image_too_large(t,n),v=this.do_image_splitting&&(this.min_tiles!==1||this.max_tiles!==1);if(_&&v){let{grid_width:e,grid_height:r,target_width:i,target_height:a}=this._get_grid_layout(t,n);h=r,g=e;let o=await tu(l,{size:[a,i]});m=[];for(let t=0;t(e-this.image_mean[t])/this.image_std[t]);return super.pad_image(e,t,{width:s,height:o},{center:!0,constant_values:c,...r})}async _call(e,{num_crops:t=null}={}){if(this._num_crops=t??=this.config.num_crops,t<4||nm(t)%1!=0)throw Error(`num_crops must be a square number >= 4`);Array.isArray(e)||(e=[e]);let n=e.length,r=await Promise.all(e.map(e=>this.preprocess(e))),i=r.map(e=>e.original_size),a=r.map(e=>e.reshaped_input_size),o=[];for(let{pixel_values:e}of r){e.unsqueeze_(0);let[n,r]=e.dims.slice(-2),i=await tu(e,{size:[Qp,Qp],mode:`bicubic`});if(t>0){let a=[],s=nm(t),c=tm(r/s),l=tm(n/s);for(let t=0;te.map(e=>Qp*em(e/Qp)));return{pixel_values:s,original_sizes:i,reshaped_input_sizes:a,image_sizes:new H(`int64`,c.flat(),[n,2]),num_img_tokens:c.map(([e,t])=>this.calc_num_image_tokens_from_image_size(t,e))}}},im=class extends q{get_resize_output_image_size(e,t){let{longest_edge:n}=t;if(n===void 0)throw Error(`size must contain 'longest_edge'`);let[r,i]=e.size,a=Math.max(r,i)/n,o=r,s=i;a>1&&(o=Math.floor(r/a),s=Math.floor(i/a));let{patch_size:c,spatial_merge_size:l}=this.config;if(!l)throw Error(`config must contain 'spatial_merge_size'`);let u=c*l,d=Math.floor((o-1)/u)+1,f=Math.floor((s-1)/u)+1;return[d*u,f*u]}},am=class extends q{},om=class extends q{post_process_object_detection(...e){return Wf(...e)}},sm=class extends q{reshape_input_points(e,t,n,r=!1){e=structuredClone(e);let i=ii(e);if(i.length===3)r||(i=[1,...i]),e=[e];else if(i.length!==4)throw Error("The input_points must be a 4D tensor of shape `batch_size`, `point_batch_size`, `nb_points_per_image`, `2`.");for(let r=0;re!==t.dims[n]))throw Error(`The first ${n.length} dimensions of 'input_points' and 'input_labels' must be the same.`);return new H(`int64`,e.flat(1/0).map(BigInt),n)}async _call(e,{input_points:t=null,input_labels:n=null,input_boxes:r=null}={}){let i=await super._call(e);if(t&&(i.input_points=this.reshape_input_points(t,i.original_sizes,i.reshaped_input_sizes)),n){if(!i.input_points)throw Error("`input_points` must be provided if `input_labels` are provided.");i.input_labels=this.add_input_labels(n,i.input_points)}return r&&(i.input_boxes=this.reshape_input_points(r,i.original_sizes,i.reshaped_input_sizes,!0)),i}async post_process_masks(e,t,n,{mask_threshold:r=0,binarize:i=!0,pad_size:a=null}={}){let o=[];a=a??this.pad_size??this.size;let s=[a.height,a.width];for(let a=0;ar&&(t[n]=1);u=new H(`bool`,t,u.dims)}o.push(u)}return o}generate_crop_boxes(e,t,{crop_n_layers:n=0,overlap_ratio:r=512/1500,points_per_crop:i=32,crop_n_points_downscale_factor:a=1}={}){}},cm=class extends q{post_process_semantic_segmentation(...e){return Gf(...e)}},lm=class extends cm{},um=class extends q{post_process_semantic_segmentation(...e){return Gf(...e)}},dm=class extends um{},fm=class extends q{},pm=class extends q{pad_image(e,t,n,r={}){let[i,a,o]=t;return super.pad_image(e,t,{width:a+(n-a%n)%n,height:i+(n-i%n)%n},{mode:`symmetric`,center:!1,constant_values:-1,...r})}},mm=class extends q{},hm=class extends mm{},gm=class extends q{async _call(e,t){Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let n=await Promise.all(e.map(e=>this.preprocess(e))),r=await Promise.all(t.map(e=>this.preprocess(e,{do_normalize:!1,do_convert_rgb:!1,do_convert_grayscale:!0})));return{pixel_values:uu(n.map((e,t)=>U([e.pixel_values,r[t].pixel_values],0)),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}},_m=class extends q{post_process_pose_estimation(e,t,{threshold:n=null}={}){let r=e.tolist(),[i,a,o,s]=e.dims,c=[];for(let e=0;e/gm,bboxes:/([^<]+)?/gm},this.size_per_bin=1e3}construct_prompts(e){typeof e==`string`&&(e=[e]);let t=[];for(let n of e)if(this.task_prompts_without_inputs.has(n))t.push(this.task_prompts_without_inputs.get(n));else{for(let[e,r]of this.task_prompts_with_input)if(n.includes(e)){t.push(r.replaceAll(`{input}`,n).replaceAll(e,``));break}t.length!==e.length&&t.push(n)}return t}post_process_generation(e,t,n){let r=this.tasks_answer_post_processing_type.get(t)??`pure_text`;e=e.replaceAll(``,``).replaceAll(``,``);let i;switch(r){case`pure_text`:i=e;break;case`description_with_bboxes`:case`bboxes`:case`phrase_grounding`:case`ocr`:let a=r===`ocr`?`quad_boxes`:`bboxes`,o=e.matchAll(this.regexes[a]),s=[],c=[];for(let[e,t,...r]of o)s.push(t?t.trim():s.at(-1)??``),c.push(r.map((e,t)=>(Number(e)+.5)/this.size_per_bin*n[t%2]));i={labels:s,[a]:c};break;default:throw Error(`Task "${t}" (of type "${r}") not yet implemented.`)}return{[t]:i}}async _call(e,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=await this.image_processor(e,n),i=t?this.tokenizer(this.construct_prompts(t),n):{};return{...r,...i}}},Sm=class extends K{static tokenizer_class=G;static image_processor_class=bm;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.image_seq_length=this.config.image_seq_length;let{boi_token:r,image_token:i,eoi_token:a}=this.tokenizer.config;this.boi_token=r,this.image_token=i,this.eoi_token=a;let o=i.repeat(this.image_seq_length);this.full_image_sequence=` ${r}${o}${a} -`}async _call(e,t=null,n={}){typeof e==`string`&&(e=[e]);let r;return t&&(r=await this.image_processor(t,n),e=e.map(e=>e.replaceAll(this.boi_token,this.full_image_sequence))),{...this.tokenizer(e,n),...r}}},wm=class extends G{static image_processor_class=xm;static feature_extractor_class=jf;static tokenizer_class=W;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_seq_length=this.config.audio_seq_length,this.image_seq_length=this.config.image_seq_length;let{audio_token_id:r,boa_token:i,audio_token:a,eoa_token:o,image_token_id:s,boi_token:c,image_token:l,eoi_token:u}=this.tokenizer.config;this.audio_token_id=r,this.boa_token=i,this.audio_token=a;let d=a.repeat(this.audio_seq_length);this.full_audio_sequence=` +`}async _call(e,t=null,n={}){typeof e==`string`&&(e=[e]);let r;return t&&(r=await this.image_processor(t,n),e=e.map(e=>e.replaceAll(this.boi_token,this.full_image_sequence))),{...this.tokenizer(e,n),...r}}},Cm=class extends K{static image_processor_class=bm;static feature_extractor_class=Af;static tokenizer_class=G;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_seq_length=this.config.audio_seq_length,this.image_seq_length=this.config.image_seq_length;let{audio_token_id:r,boa_token:i,audio_token:a,eoa_token:o,image_token_id:s,boi_token:c,image_token:l,eoi_token:u}=this.tokenizer.config;this.audio_token_id=r,this.boa_token=i,this.audio_token=a;let d=a.repeat(this.audio_seq_length);this.full_audio_sequence=` ${i}${d}${o} @@ -30,7 +30,7 @@ ${i}${d}${o} ${c}${f}${u} -`}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;n&&(i=await this.feature_extractor(n,r),e=e.map(e=>e.replaceAll(this.audio_token,this.full_audio_sequence)));let a;return t&&(a=await this.image_processor(t,r),e=e.map(e=>e.replaceAll(this.image_token,this.full_image_sequence))),{...this.tokenizer(e,r),...a,...i}}},Tm=class extends G{static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_ms_per_token=this.config.audio_ms_per_token??40,this.audio_seq_length=this.config.audio_seq_length??750,this.image_seq_length=this.config.image_seq_length??280;let{audio_token:r,boa_token:i,eoa_token:a,image_token:o,boi_token:s,eoi_token:c}=this.tokenizer.config;this.audio_token=r,this.boa_token=i,this.eoa_token=a,this.image_token=o,this.boi_token=s,this.eoi_token=c}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([rl(e,Id,!0,t),W.from_pretrained(e,t),nl(e,Ld,!1,t)]),a={tokenizer:r};return n.image_processor&&(a.image_processor=new xp(n.image_processor)),n.feature_extractor&&(a.feature_extractor=new bf(n.feature_extractor)),new this(n,a,i)}_compute_audio_num_tokens(e,t){let n=Math.round(t*20/1e3),r=Math.round(t*10/1e3),i=Math.floor(n/2),a=Math.floor((e+i-n-1)/r)+1;if(a<=0)return 0;for(let e=0;e<2;++e)a=Math.floor((a-1)/2)+1;return Math.min(a,this.audio_seq_length)}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;if(t){i=await this.image_processor(t,r);let n=i.num_soft_tokens_per_image,a=0;e=e.map(e=>e.replaceAll(this.image_token,()=>` +`}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;n&&(i=await this.feature_extractor(n,r),e=e.map(e=>e.replaceAll(this.audio_token,this.full_audio_sequence)));let a;return t&&(a=await this.image_processor(t,r),e=e.map(e=>e.replaceAll(this.image_token,this.full_image_sequence))),{...this.tokenizer(e,r),...a,...i}}},wm=class extends K{static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_ms_per_token=this.config.audio_ms_per_token??40,this.audio_seq_length=this.config.audio_seq_length??750,this.image_seq_length=this.config.image_seq_length??280;let{audio_token:r,boa_token:i,eoa_token:a,image_token:o,boi_token:s,eoi_token:c}=this.tokenizer.config;this.audio_token=r,this.boa_token=i,this.eoa_token=a,this.image_token=o,this.boi_token=s,this.eoi_token=c}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([nl(e,Fd,!0,t),G.from_pretrained(e,t),tl(e,Id,!1,t)]),a={tokenizer:r};return n.image_processor&&(a.image_processor=new bp(n.image_processor)),n.feature_extractor&&(a.feature_extractor=new yf(n.feature_extractor)),new this(n,a,i)}_compute_audio_num_tokens(e,t){let n=Math.round(t*20/1e3),r=Math.round(t*10/1e3),i=Math.floor(n/2),a=Math.floor((e+i-n-1)/r)+1;if(a<=0)return 0;for(let e=0;e<2;++e)a=Math.floor((a-1)/2)+1;return Math.min(a,this.audio_seq_length)}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;if(t){i=await this.image_processor(t,r);let n=i.num_soft_tokens_per_image,a=0;e=e.map(e=>e.replaceAll(this.image_token,()=>` ${this.boi_token}${this.image_token.repeat(n[a++])}${this.eoi_token} @@ -38,8 +38,8 @@ ${this.boi_token}${this.image_token.repeat(n[a++])}${this.eoi_token} ${this.boa_token}${this.audio_token.repeat(this._compute_audio_num_tokens(t[o++].length,i))}${this.eoa_token} -`))}return{...this.tokenizer(e,r),...i,...a}}},Em=class extends G{static image_processor_class=xm;static tokenizer_class=W;static image_token=`<|image_pad|>`;async _call(e,t=null,...n){Array.isArray(e)||(e=[e]);let r,i;if(t&&(r=await this.image_processor(t),i=r.image_grid_thw),i){let t=this.image_processor.config.merge_size**2,n=0,r=this.constructor.image_token,a=i.tolist();e=e.map(e=>{for(;e.includes(r);){let i=Number(a[n++].reduce((e,t)=>e*t,1n));e=e.replace(r,`<|placeholder|>`.repeat(Math.floor(i/t)))}return e.replaceAll(`<|placeholder|>`,r)})}return{...this.tokenizer(e),...r}}},Dm=class extends Em{static image_token=`<|image|>`},Om=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;_get_num_audio_features(e){let{hop_length:t}=this.feature_extractor.config.melspec_kwargs,{projector_window_size:n,projector_downsample_rate:r}=this.feature_extractor.config,i=Math.floor(n/r),a=Math.floor(e/t)+1,o=Math.floor(a/2);return Math.ceil(o/n)*i}async _call(e,t=null,n={}){if(Array.isArray(e))throw Error(`Batched inputs are not supported yet.`);let r={};if(t){let{input_features:n}=await this.feature_extractor(t);r.input_features=n;let i=this._get_num_audio_features(t.length);r.input_features_mask=new V(`bool`,new Uint8Array(i).fill(1),[1,i]);let a=this.config.audio_token??`<|audio|>`;if(!e.includes(a))throw Error(`The input text does not contain the audio token ${a}.`);e=e.replaceAll(a,a.repeat(i))}return{...this.tokenizer(e,{add_special_tokens:!1,...n}),...r}}};function km(e,t){let n=e.dims.at(-1)-1,r=e.tolist();r.fill(!1,0,1),r.fill(!1,n);let i=t.tolist();return r.map((e,t)=>e?t:null).filter(e=>e!==null).map(e=>i[e])}var Am=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t,n={}){let r=e?await this.image_processor(e,n):{};return{...t?this.tokenizer(t,n):{},...r}}post_process_grounded_object_detection(e,t,{box_threshold:n=.25,text_threshold:r=.25,target_sizes:i=null}={}){let{logits:a,pred_boxes:o}=e,s=a.dims[0];if(i!==null&&i.length!==s)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let c=a.dims.at(1),l=a.sigmoid(),u=l.max(-1).tolist(),d=o.tolist().map(e=>e.map(e=>Wf(e))),f=[];for(let e=0;ee.map((e,t)=>e*a[(t+1)%2])));let o=u[e],s=[],p=[],m=[];for(let i=0;i`+i.repeat(e);o+=` +`))}return{...this.tokenizer(e,r),...i,...a}}},Tm=class extends K{static image_processor_class=bm;static tokenizer_class=G;static image_token=`<|image_pad|>`;async _call(e,t=null,...n){Array.isArray(e)||(e=[e]);let r,i;if(t&&(r=await this.image_processor(t),i=r.image_grid_thw),i){let t=this.image_processor.config.merge_size**2,n=0,r=this.constructor.image_token,a=i.tolist();e=e.map(e=>{for(;e.includes(r);){let i=Number(a[n++].reduce((e,t)=>e*t,1n));e=e.replace(r,`<|placeholder|>`.repeat(Math.floor(i/t)))}return e.replaceAll(`<|placeholder|>`,r)})}return{...this.tokenizer(e),...r}}},Em=class extends Tm{static image_token=`<|image|>`},Dm=class extends K{static tokenizer_class=G;static feature_extractor_class=Af;static uses_processor_config=!0;_get_num_audio_features(e){let{hop_length:t}=this.feature_extractor.config.melspec_kwargs,{projector_window_size:n,projector_downsample_rate:r}=this.feature_extractor.config,i=Math.floor(n/r),a=Math.floor(e/t)+1,o=Math.floor(a/2);return Math.ceil(o/n)*i}async _call(e,t=null,n={}){if(Array.isArray(e))throw Error(`Batched inputs are not supported yet.`);let r={};if(t){let{input_features:n}=await this.feature_extractor(t);r.input_features=n;let i=this._get_num_audio_features(t.length);r.input_features_mask=new H(`bool`,new Uint8Array(i).fill(1),[1,i]);let a=this.config.audio_token??`<|audio|>`;if(!e.includes(a))throw Error(`The input text does not contain the audio token ${a}.`);e=e.replaceAll(a,a.repeat(i))}return{...this.tokenizer(e,{add_special_tokens:!1,...n}),...r}}};function Om(e,t){let n=e.dims.at(-1)-1,r=e.tolist();r.fill(!1,0,1),r.fill(!1,n);let i=t.tolist();return r.map((e,t)=>e?t:null).filter(e=>e!==null).map(e=>i[e])}var km=class extends K{static tokenizer_class=G;static image_processor_class=bm;async _call(e,t,n={}){let r=e?await this.image_processor(e,n):{};return{...t?this.tokenizer(t,n):{},...r}}post_process_grounded_object_detection(e,t,{box_threshold:n=.25,text_threshold:r=.25,target_sizes:i=null}={}){let{logits:a,pred_boxes:o}=e,s=a.dims[0];if(i!==null&&i.length!==s)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let c=a.dims.at(1),l=a.sigmoid(),u=l.max(-1).tolist(),d=o.tolist().map(e=>e.map(e=>Uf(e))),f=[];for(let e=0;ee.map((e,t)=>e*a[(t+1)%2])));let o=u[e],s=[],p=[],m=[];for(let i=0;i`+i.repeat(e);o+=` `}return o+=` -${r}${a}`+i.repeat(e)+`${r}`,o}function Mm(e,t,n,r){return`${t}${r}`+n.repeat(e)+`${t}`}function Nm(e,t,n,r,i,a){return e===0&&t===0?Mm(n,r,i,a):jm(n,e,t,r,i,a)}var Pm=class extends G{static image_processor_class=xm;static tokenizer_class=W;static uses_processor_config=!0;fake_image_token=``;image_token=``;global_img_token=``;async _call(e,t=null,n={}){n.return_row_col_info??=!0;let r;t&&(r=await this.image_processor(t,n)),Array.isArray(e)||(e=[e]);let i=r.rows??[Array(e.length).fill(0)],a=r.cols??[Array(e.length).fill(0)],o=this.config.image_seq_len,s=[],c=[];for(let t=0;tNm(e,l[t],o,this.fake_image_token,this.image_token,this.global_img_token)),d=n.split(this.image_token);if(d.length===0)throw Error(`The image token should be present in the text.`);let f=d[0];for(let e=0;ee.images).flatMap(e=>e.images).map(e=>Vf.read(e)));let r=this.tokenizer,i=r.apply_chat_template(e,{tokenize:!1,add_generation_prompt:!0,chat_template:n}),a=e=>r.encode(e,{add_special_tokens:!1}),o=i.split(this.image_tag),s=o.length-1;if(t.length!==s)throw Error(`Number of images provided (${t.length}) does not match number of "${this.image_tag}" image tags (${s})`);let[c,l,u]=r.convert_tokens_to_ids([this.image_tag,this.image_start_tag,this.image_end_tag]),d=a(o[0]),f=Array(d.length).fill(!1);for(let e=1;e0){let e=await this.image_processor(t);return e.pixel_values.unsqueeze_(0),{...m,...e}}return m}},Im=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e=null,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=e?this.tokenizer(e,n):{},i=t?await this.image_processor(t,n):{};return{...r,...i}}},Lm=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t=null,n={}){let{image_rows:r,image_cols:i,image_sizes:a,...o}=await this.image_processor(e,{...n,return_row_col_info:!0});if(t){let e=this.config.image_token??``,{tile_size:n=512,downsample_factor:o=2,encoder_patch_size:s=16,use_thumbnail:c=!0}=this.image_processor.config,l=e=>Math.ceil(Math.floor(e/s)/o),u=l(n)**2,d=this.config.image_start_token??`<|image_start|>`,f=this.config.image_end_token??`<|image_end|>`,p=this.config.image_thumbnail??`<|img_thumbnail|>`;Array.isArray(t)||(t=[t]);let m=0;t=t.map(t=>{let n=t.split(e);return n[0]+n.slice(1).map(t=>{let n=m++,[o,s]=a[n],h=r[n],g=i[n],_=l(o)*l(s),v=d;if(h>1||g>1){let t=e.repeat(u);for(let e=0;e`+t;c&&(v+=p+e.repeat(_))}else v+=e.repeat(_);return v+f+t}).join(``)})}return{...o,...t?this.tokenizer(t,n):{}}}},Rm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,patch_size:a,num_additional_image_tokens:o}=this.config,s=Math.floor(e/a)*Math.floor(n/a)+o;t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;e0?i.reduce((e,t)=>e*t,1):0;c.push(n),s.push(a)}return[i(c),s]}char_decode(e){return this.char_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}bpe_decode(e){return this.bpe_tokenizer.batch_decode(e)}wp_decode(e){return this.wp_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}batch_decode([e,t,n]){let[r,i]=this._decode_helper(e,`char`),[a,o]=this._decode_helper(t,`bpe`),[s,c]=this._decode_helper(n,`wp`),l=[],u=[];for(let e=0;e`;function Wm(e,t,n,r,i){return`${r.repeat(n*i)}${t}${e} -`}var Gm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!1;async _call(e,t=null,n={}){t||=(A.warn(`You are using PaliGemma without a text prefix. It will perform as a picture-captioning model.`),``),Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let r=this.tokenizer.bos_token,i=this.image_processor.config.image_seq_length,a;t.some(e=>e.includes(Um))?a=t.map(e=>{let t=e.replaceAll(Um,Um.repeat(i)),n=t.lastIndexOf(Um),a=n===-1?0:n+Um.length;return t.slice(0,a)+r+t.slice(a)+` -`}):(A.warn("You are passing both `text` and `images` to `PaliGemmaProcessor`. The processor expects special image tokens in the text, as many tokens as there are images per each text. It is recommended to add `` tokens in the very beginning of your text. For this call, we will infer how many images each text has and add special tokens."),a=t.map(t=>Wm(t,r,i,Um,e.length)));let o=this.tokenizer(a,n);return{...await this.image_processor(e,n),...o}}},Km=`<|image|>`,qm=/<\|image_\d+\|>/g,Jm=class extends G{static image_processor_class=xm;static tokenizer_class=W;async _call(e,t=null,{padding:n=!0,truncation:r=!0,num_crops:i=null}={}){Array.isArray(e)||(e=[e]);let a,o;if(t){o=await this.image_processor(t,{num_crops:i});let{num_img_tokens:s}=o,c=e.map((e,t)=>e.split(qm).join(Km.repeat(s[t])));a=this.tokenizer(c,{padding:n,truncation:r});let l=this.tokenizer._tokenizer.token_to_id(Km);a.input_ids.map_(e=>e==l?-e:e)}else a=this.tokenizer(e);return{...a,...o}}},Ym=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,image_break_token:a,image_end_token:o,patch_size:s,spatial_merge_size:c}=this.config,l=s*c,u=Math.floor(e/l),d=Math.floor(n/l);t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;esh(e,o)),c=s.map(e=>e.length),l=s.flat(),u=(await Promise.all(l.map(e=>this.feature_extractor(e,n)))).map(e=>e.input_features);r.audio_values=u.length>1?H(u,0):u[0];let d=i[0];for(let e=0;e0){if(l>Tc)throw Error(`The number of external data chunks (${l}) exceeds the maximum allowed value (${Tc}).`);let t=Th(o,l);for(let n of t){let t=`${r.subfolder??``}/${n}`;c.push(new Promise(async(i,a)=>{let o=await tl(e,t,!0,r,s);i(o instanceof Uint8Array?{path:n,data:o}:n)}))}}else a.externalData!==void 0&&(c=a.externalData.map(async t=>{if(typeof t.data==`string`){let n=await tl(e,t.data,!0,r);return{...t,data:n}}return t}));return Promise.all(c)}async function Oh(e,t,n,r=!1,i=void 0){let a=n.config?.[`transformers.js_config`]??{},o=Gl(n.device??a.device,t,{warn:e=>A.info(e)}),s=jl(o),c=a.device_config??{};c.hasOwnProperty(o)&&(a={...a,...c[o]});let l=Zl(n.dtype??a.dtype,t,o,{configDtype:a.dtype,warn:e=>A.info(e)});if(!Xl.hasOwnProperty(l))throw Error(`Invalid dtype: ${l}. Should be one of: ${Object.keys(ql).join(`, `)}`);if(o===`webgpu`&&!O.IS_NODE_ENV&&l===ql.fp16&&!await Kl())throw Error(`The device (${o}) does not support fp16.`);let u=Xl[l],d={...n.session_options};d.executionProviders??=s;let f=a.free_dimension_overrides;f?d.freeDimensionOverrides??=f:o.startsWith(`webnn`)&&!d.freeDimensionOverrides&&A.warn(`WebNN does not currently support dynamic shapes and requires 'free_dimension_overrides' to be set in config.json, preferably as a field within config["transformers.js_config"]["device_config"]["${o}"]. When 'free_dimension_overrides' is not set, you may experience significant performance degradation.`);let p=Eh(e,t,n,u),m=await Dh(e,t,u,n,n.use_external_data_format??a.use_external_data_format,d);if(m.length>0&&(!O.IS_NODE_ENV||m.some(e=>typeof e!=`string`))&&(d.externalData=m),r&&o===`webgpu`){let e=bh(n.config,{prefix:`present`,session_name:i});if(e.size>0&&!Bl()){let t={};for(let n of e)t[n]=`gpu-buffer`;d.preferredOutputLocation=t}}return{buffer_or_path:await p,session_options:d,session_config:{dtype:l,device:o}}}async function kh(e,t,n,r=void 0){return Object.fromEntries(await Promise.all(Object.keys(t).map(async i=>{let a=r?.[i]??!1,{buffer_or_path:o,session_options:s,session_config:c}=await Oh(e,t[i],n,a,i);return[i,await Fl(o,s,c)]})))}function Ah(e){for(let t in e)Rl(e[t])?e[t]=new V(e[t]):typeof e[t]==`object`&&Ah(e[t]);return e}async function q(e,t){let n=jh(e,t);try{return Ah(await Ll(e,Object.fromEntries(Object.entries(n).map(([e,t])=>{let n=t.ort_tensor;return O.IS_NODE_ENV&&typeof Float16Array<`u`&&n.cpuData instanceof Float16Array&&(n.cpuData=new Uint16Array(n.cpuData.buffer)),[e,n]}))))}catch(e){let t=Object.fromEntries(Object.entries(n).map(([e,t])=>{let n={type:t.type,dims:t.dims,location:t.location};return n.location!==`gpu-buffer`&&(n.data=t.data),[e,n]}));throw A.error(`An error occurred during model execution: "${e}".`),A.error(`Inputs given to model:`,t),e}}function jh(e,t){let n=/* @__PURE__ */ Object.create(null),r=[];for(let i of e.inputNames){let e=t[i];if(!(e instanceof V)){r.push(i);continue}n[i]=Bl()?e.clone():e}if(r.length>0)throw Error(`An error occurred during model execution: "Missing the following inputs: ${r.join(`, `)}.`);let i=Object.keys(t).length,a=e.inputNames.length;if(i>a){let n=Object.keys(t).filter(t=>!e.inputNames.includes(t));A.warn(`WARNING: Too many inputs were provided (${i} > ${a}). The following inputs will be ignored: "${n.join(`, `)}".`)}return n}var Mh=class{},Nh=class extends Mh{constructor({last_hidden_state:e,hidden_states:t=null,attentions:n=null}){super(),this.last_hidden_state=e,this.hidden_states=t,this.attentions=n}},J=class extends Mh{constructor({logits:e,...t}){super(),this.logits=e;let n=Object.values(t);n.length>0&&(this.attentions=n)}},Ph=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Fh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Ih=class extends Mh{constructor({start_logits:e,end_logits:t}){super(),this.start_logits=e,this.end_logits=t}},Lh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Rh=class extends Mh{constructor({logits:e,past_key_values:t}){super(),this.logits=e,this.past_key_values=t}},zh=class extends Mh{constructor({logits:e,past_key_values:t,encoder_outputs:n,decoder_attentions:r=null,cross_attentions:i=null}){super(),this.logits=e,this.past_key_values=t,this.encoder_outputs=n,this.decoder_attentions=r,this.cross_attentions=i}},Bh=class extends Mh{constructor({alphas:e}){super(),this.alphas=e}},Vh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Hh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Uh=class extends $r{constructor(){super(),this.processors=[]}push(e){this.processors.push(e)}extend(e){this.processors.push(...e)}_call(e,t){let n=t;for(let t of this.processors)n=t(e,n);return n}[Symbol.iterator](){return this.processors.values()}},Wh=class extends Vh{constructor(e){super(),this.bos_token_id=e}_call(e,t){for(let n=0;n=1&&i[i.length-1]>=this.timestamp_begin,o=i.length<2||i[i.length-2]>=this.timestamp_begin;if(a&&(o?r.subarray(this.timestamp_begin).fill(-1/0):r.subarray(0,this.eos_token_id).fill(-1/0)),e[n].length===this.begin_index&&this.max_initial_timestamp_index!==null){let e=this.timestamp_begin+this.max_initial_timestamp_index;r.subarray(e+1).fill(-1/0)}let s=sl(r);Math.log(s.subarray(this.timestamp_begin).map(Math.exp).reduce((e,t)=>e+t))>ll(s.subarray(0,this.timestamp_begin))[0]&&r.subarray(0,this.timestamp_begin).fill(-1/0)}return t}},Yh=class extends Vh{constructor(e){super(),this.no_repeat_ngram_size=e}getNgrams(e){let t=e.length,n=[];for(let r=0;r1 to use the classifier-free guidance processor, got guidance scale ${e}.`);this.guidance_scale=e}_call(e,t){if(t.dims[0]!==2*e.length)throw Error(`Logits should have twice the batch size of the input ids, the first half of batches corresponding to the conditional inputs, and the second half of batches corresponding to the unconditional inputs. Got batch size ${t.dims[0]} for the logits and ${e.length} for the input ids.`);let n=e.length,r=t.slice([0,n],null),i=t.slice([n,t.dims[0]],null);for(let e=0;ee.length>=this.max_length)}},og=class extends rg{constructor(e){super(),Array.isArray(e)||(e=[e]),this.eos_token_id=e}_call(e,t){return e.map(e=>{let t=e.at(-1);return this.eos_token_id.some(e=>t==e)})}},sg=class extends $r{constructor(e){super(),this.generation_config=e}async _call(e){return this.sample(e)}async sample(e){throw Error(`sample should be implemented in subclasses.`)}getLogits(e,t){let n=e.dims.at(-1),r=e.data;if(t===-1)r=r.slice(-n);else{let e=t*n;r=r.slice(e,e+n)}return r}randomSelect(e){return xc(e)}static getSampler(e){if(e.do_sample)return new lg(e);if(e.num_beams>1)return new ug(e);if(e.num_return_sequences>1)throw Error(`num_return_sequences has to be 1 when doing greedy search, but is ${e.num_return_sequences}.`);return new cg(e)}},cg=class extends sg{async sample(e){let t=ll(e.data)[1];return[[BigInt(t),0]]}},lg=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},()=>{let e=this.randomSelect(i);return[r.data[e],Math.log(i[e])]})}},ug=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},(e,t)=>[r.data[t],Math.log(i[t])])}},dg=class{constructor(e){if(e)for(let t in e){if(t in this)throw TypeError(`Key "${t}" conflicts with an existing property on DynamicCache`);let n=e[t];if(!(n instanceof V))throw TypeError(`Expected a Tensor for key "${t}", got ${typeof n}`);this[t]=n}}get_seq_length(){let e=this;if(Object.keys(e).length===0)return 0;for(let t in e)if(t.startsWith(`past_key_values.`))return e[t].dims.at(-2);throw Error(`Unable to determine sequence length from the cache.`)}update(e){for(let t in e){let n=this[t],r=e[t];n&&n!==r&&n.location===`gpu-buffer`&&n.dispose(),this[t]=r}}async dispose(){let e=[];for(let t of Object.values(this))t.location===`gpu-buffer`&&e.push(t.dispose());await Promise.all(e)}},Y={EncoderOnly:0,EncoderDecoder:1,Seq2Seq:2,Vision2Seq:3,DecoderOnly:4,DecoderOnlyWithoutHead:5,MaskGeneration:6,ImageTextToText:7,Musicgen:8,MultiModality:9,Phi3V:10,AudioTextToText:11,AutoEncoder:12,ImageAudioTextToText:13,Supertonic:14,Chatterbox:15,VoxtralRealtime:16},fg={[Y.DecoderOnly]:{sessions:(e,t)=>({model:t.model_file_name??`model`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.DecoderOnlyWithoutHead]:{sessions:(e,t)=>({model:t.model_file_name??`model`})},[Y.Seq2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Vision2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Musicgen]:{sessions:()=>({model:`text_encoder`,decoder_model_merged:`decoder_model_merged`,encodec_decode:`encodec_decode`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.EncoderDecoder]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0}},[Y.MaskGeneration]:{sessions:()=>({model:`vision_encoder`,prompt_encoder_mask_decoder:`prompt_encoder_mask_decoder`})},[Y.ImageTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageTextToText].text_only_sessions};return n||(r.vision_encoder=`vision_encoder`),e.is_encoder_decoder&&(r.model=`encoder_model`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.AudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.ImageAudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageAudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`,r.vision_encoder=`vision_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Phi3V]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`model`,vision_encoder:`vision_encoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.MultiModality]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`language_model`,lm_head:`lm_head`,gen_head:`gen_head`,gen_img_embeds:`gen_img_embeds`,image_decode:`image_decode`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AutoEncoder]:{sessions:()=>({encoder_model:`encoder_model`,decoder_model:`decoder_model`})},[Y.Supertonic]:{sessions:()=>({text_encoder:`text_encoder`,latent_denoiser:`latent_denoiser`,voice_decoder:`voice_decoder`})},[Y.Chatterbox]:{sessions:()=>({embed_tokens:`embed_tokens`,speech_encoder:`speech_encoder`,model:`language_model`,conditional_decoder:`conditional_decoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.VoxtralRealtime]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.VoxtralRealtime].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0,audio_encoder:!0},optional_configs:{generation_config:`generation_config.json`}},default:{sessions:(e,t)=>({model:t.model_file_name??`model`})}};function pg(e,t,n={}){let r=fg[e]??fg.default;return{sessions:r.sessions(t,n,n.textOnly??!1),cache_sessions:r.cache_sessions,optional_configs:r.optional_configs}}function mg(e,{warn:t=!0}={}){let n=e.architectures||[];for(let e of n){let t=Cg.get(e);if(t!==void 0)return t}if(e.model_type){let t=Cg.get(e.model_type);if(t!==void 0)return t;for(let t of Object.values(_g))if(t.has(e.model_type)){let n=Cg.get(t.get(e.model_type));if(n!==void 0)return n}}if(t){let t=n.length>0?n.join(`, `):`(none)`;A.warn(`[resolve_model_type] Architecture(s) not found in MODEL_TYPE_MAPPING: [${t}] for model type '${e.model_type}'. Falling back to EncoderOnly (single model.onnx file). If you encounter issues, please report at: ${Nd}`)}return Y.EncoderOnly}function hg(e,{config:t=null,cache_dir:n=null,local_files_only:r=!1,revision:i=`main`}={}){return t===null?Wc(Ac(e,{cache_dir:n,local_files_only:r,revision:i}),()=>Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})):Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})}async function gg(e,{config:t=null,dtype:n=null,device:r=null,model_file_name:i=null}={}){t=await hg(e,{config:t});let a=[`config.json`],o=t[`transformers.js_config`]??{},s=o.use_external_data_format,c=`onnx`,l=r??o.device,u=n??o.dtype,d=mg(t),f=(e,t=null)=>{t??=e;let n=Gl(l,e),r=Xl[Zl(u,e,n)]??``,i=`${t}${r}.onnx`,o=`${c}/${i}`;a.push(o);let d=wh(s,i,e);for(let e of Th(i,d)){let t=`${c}/${e}`;a.push(t)}},{sessions:p,optional_configs:m}=pg(d,t,{model_file_name:i});for(let[e,t]of Object.entries(p))f(e,t);if(m)for(let e of Object.values(m))a.push(e);return a}var _g=null;function vg(e){_g=e}function yg(e){if(e instanceof V)return e;if(e.length===0)throw Error(`items must be non-empty`);if(Array.isArray(e[0])){if(e.some(t=>t.length!==e[0].length))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' and/or 'truncation=True' to have batched tensors with the same length.`);return new V(`int64`,BigInt64Array.from(e.flat().map(e=>BigInt(e))),[e.length,e[0].length])}return new V(`int64`,BigInt64Array.from(e.map(e=>BigInt(e))),[1,e.length])}function bg(e){return new V(`bool`,[e],[1])}var xg={[Y.DecoderOnly]:{can_generate:!0,forward:Pg,prepare_inputs:Bg},[Y.DecoderOnlyWithoutHead]:{can_generate:!1,forward:Pg,prepare_inputs:Bg},[Y.Seq2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Vision2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Musicgen]:{can_generate:!0,forward:Eg},[Y.EncoderDecoder]:{can_generate:!1,forward:Eg},[Y.ImageTextToText]:{can_generate:!0,forward:Lg,prepare_inputs:Hg},[Y.AudioTextToText]:{can_generate:!0,forward:Ig,prepare_inputs:Hg},[Y.ImageAudioTextToText]:{can_generate:!0,prepare_inputs:Hg},[Y.Phi3V]:{can_generate:!0,prepare_inputs:Hg},[Y.MultiModality]:{can_generate:!0},[Y.AutoEncoder]:{can_generate:!1,forward:Og},[Y.Chatterbox]:{can_generate:!0,forward:Dg},[Y.VoxtralRealtime]:{can_generate:!0,prepare_inputs:Bg},default:{can_generate:!1,forward:Dg}};function Sg(e,t){let n=Cg.get(e),r=!1,i=t?.architectures?.[0];if(i&&i!==e&&e?.endsWith(`ForCausalLM`)&&i.endsWith(`ForConditionalGeneration`)){let e=Cg.get(i);e!==void 0&&(n=e,r=!0)}let a=xg[n]??xg.default,o=fg[n]??fg.default;return{typeConfig:{...a,...o},textOnly:r,modelType:n}}var Cg=/* @__PURE__ */ new Map,wg=/* @__PURE__ */ new Map,Tg=/* @__PURE__ */ new Map,X=class extends $r{main_input_name=`input_ids`;forward_params=[`input_ids`,`attention_mask`];_return_dict_in_generate_keys=null;constructor(e,t,n){super(),this.config=e,this.sessions=t,this.configs=n;let{typeConfig:r}=Sg(Tg.get(this.constructor),e);this.can_generate=r.can_generate,this._forward=r.forward,this._prepare_inputs_for_generation=r.prepare_inputs,this.can_generate&&this.forward_params.push(`past_key_values`),this.custom_config=this.config[`transformers.js_config`]??{}}async dispose(){let e=[];for(let t of Object.values(this.sessions))e.push(t.release?.());return await Promise.all(e)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d},p=Tg.get(this);n=f.config=await Ch.from_pretrained(e,f);let{typeConfig:m,textOnly:h,modelType:g}=Sg(p,n);if(g===void 0){let e=p??n?.model_type;e!==`custom`&&A.warn(`Model type for '${e}' not found, assuming encoder-only architecture. Please report this at ${Nd}.`)}if(t&&!(t instanceof ti)){let r={};try{let t=await gg(e,{config:n,dtype:l,device:c,model_file_name:o});(await Promise.all(t.map(t=>Kc(e,t,f)))).forEach((e,n)=>{if(e.exists){let i=t[n]===`config.json`;r[t[n]]={loaded:i?e.size??0:0,total:e.size??0}}})}catch(e){A.warn(`Unable to fetch model file metadata for total progress tracking: ${e}`)}Object.keys(r).length>0&&(f.progress_callback=new ti(t,r))}let _=[kh(e,m.sessions(n,f,h),f,m.cache_sessions)];m.optional_configs&&_.push(Kg(e,m.optional_configs,f));let v=await Promise.all(_);return new this(n,...v)}async _call(e){return await this.forward(e)}async forward(e){return await this._forward(this,e)}get generation_config(){return this.configs?.generation_config??null}_get_logits_processor(e,t,n=null){let r=new Uh;if(e.repetition_penalty!==null&&e.repetition_penalty!==1&&r.push(new Xh(e.repetition_penalty)),e.no_repeat_ngram_size!==null&&e.no_repeat_ngram_size>0&&r.push(new Yh(e.no_repeat_ngram_size)),e.bad_words_ids!==null&&r.push(new $h(e.bad_words_ids,e.eos_token_id)),e.min_length!==null&&e.eos_token_id!==null&&e.min_length>0&&r.push(new Zh(e.min_length,e.eos_token_id)),e.min_new_tokens!==null&&e.eos_token_id!==null&&e.min_new_tokens>0&&r.push(new Qh(t,e.min_new_tokens,e.eos_token_id)),e.forced_bos_token_id!==null&&r.push(new Wh(e.forced_bos_token_id)),e.forced_eos_token_id!==null&&r.push(new Gh(e.max_length,e.forced_eos_token_id)),e.suppress_tokens!==null&&r.push(new Kh(e.suppress_tokens)),e.begin_suppress_tokens!==null){let n=t>1||e.forced_bos_token_id===null?t:t+1;r.push(new qh(e.begin_suppress_tokens,n))}return e.guidance_scale!==null&&e.guidance_scale>1&&r.push(new eg(e.guidance_scale)),e.temperature===0&&e.do_sample&&(A.warn("`do_sample` changed to false because `temperature: 0` implies greedy sampling (always selecting the most likely token), which is incompatible with `do_sample: true`."),e.do_sample=!1),e.do_sample&&e.temperature!==null&&e.temperature!==1&&r.push(new tg(e.temperature)),n!==null&&r.extend(n),r}_prepare_generation_config(e,t,n=ng){let r={...this.config};for(let e of[`decoder`,`generator`,`text_config`])e in r&&Object.assign(r,r[e]);let i=new n(r);return Object.assign(i,this.generation_config??{}),e&&Object.assign(i,e),t&&Object.assign(i,ci(t,Object.getOwnPropertyNames(i))),i}_get_stopping_criteria(e,t=null){let n=new ig;return e.max_length!==null&&n.push(new ag(e.max_length,this.config.max_position_embeddings??null)),e.eos_token_id!==null&&n.push(new og(e.eos_token_id)),t&&n.extend(t),n}_validate_model_class(){if(!this.can_generate){let e=[_g.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES,_g.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES].filter(Boolean),t=Tg.get(this.constructor),n=/* @__PURE__ */ new Set,r=this.config.model_type;for(let t of e){let e=t?.get(r);e&&n.add(e)}let i=`The current model class (${t}) is not compatible with \`.generate()\`, as it doesn't have a language model head.`;throw n.size>0&&(i+=` Please use the following class instead: ${[...n].join(`, `)}`),Error(i)}}prepare_inputs_for_generation(...e){if(!this._prepare_inputs_for_generation)throw Error(`prepare_inputs_for_generation is not implemented for this model.`);return this._prepare_inputs_for_generation(this,...e)}_update_model_kwargs_for_generation({generated_input_ids:e,outputs:t,model_inputs:n,is_encoder_decoder:r}){return n.past_key_values=kg(t,n.past_key_values),n.input_ids=new V(`int64`,e.flat(),[e.length,1]),r?`decoder_attention_mask`in n&&(n.decoder_attention_mask=H([n.decoder_attention_mask,yu([n.decoder_attention_mask.dims[0],1])],1)):n.attention_mask=H([n.attention_mask,yu([n.attention_mask.dims[0],1])],1),n.position_ids=null,n}_prepare_model_inputs({inputs:e,bos_token_id:t,model_kwargs:n}){let r=ci(n,this.forward_params),i=this.main_input_name;if(i in r){if(e)throw Error("`inputs`: {inputs}` were passed alongside {input_name} which is not allowed. Make sure to either pass {inputs} or {input_name}=...")}else r[i]=e;return{inputs_tensor:r[i],model_inputs:r,model_input_name:i}}async _prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:e,model_inputs:t,model_input_name:n,generation_config:r}){if(this.sessions.model.inputNames.includes(`inputs_embeds`)&&!t.inputs_embeds&&`_prepare_inputs_embeds`in this){let{input_ids:e,pixel_values:n,attention_mask:r,...i}=t,a=await this._prepare_inputs_embeds(t);t={...i,...ci(a,[`inputs_embeds`,`attention_mask`])}}let{last_hidden_state:i}=await Dg(this,t);if(r.guidance_scale!==null&&r.guidance_scale>1)i=H([i,vu(i,0)],0),`attention_mask`in t&&(t.attention_mask=H([t.attention_mask,Su(t.attention_mask)],0));else if(t.decoder_input_ids){let e=yg(t.decoder_input_ids).dims[0];if(e!==i.dims[0]){if(i.dims[0]!==1)throw Error(`The encoder outputs have a different batch size (${i.dims[0]}) than the decoder inputs (${e}).`);i=H(Array.from({length:e},()=>i),0)}}return t.encoder_outputs=i,t}_prepare_decoder_input_ids_for_generation({batch_size:e,model_input_name:t,model_kwargs:n,decoder_start_token_id:r,bos_token_id:i,generation_config:a}){let{decoder_input_ids:o,...s}=n;if(!(o instanceof V)){if(o)Array.isArray(o[0])||(o=Array.from({length:e},()=>o));else if(r??=i,this.config.model_type===`musicgen`)o=Array.from({length:e*this.config.decoder.num_codebooks},()=>[r]);else if(Array.isArray(r)){if(r.length!==e)throw Error(`\`decoder_start_token_id\` expected to have length ${e} but got ${r.length}`);o=r}else o=Array.from({length:e},()=>[r]);o=yg(o)}return s.decoder_attention_mask=bu(o),{input_ids:o,model_inputs:s}}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,streamer:i=null,...a}){this._validate_model_class(),t=this._prepare_generation_config(t,a);let{inputs_tensor:o,model_inputs:s,model_input_name:c}=this._prepare_model_inputs({inputs:e,model_kwargs:a}),l=this.config.is_encoder_decoder;l&&(`encoder_outputs`in s||(s=await this._prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:o,model_inputs:s,model_input_name:c,generation_config:t})));let u;l?{input_ids:u,model_inputs:s}=this._prepare_decoder_input_ids_for_generation({batch_size:s[c].dims.at(0),model_input_name:c,model_kwargs:s,decoder_start_token_id:t.decoder_start_token_id,bos_token_id:t.bos_token_id,generation_config:t}):u=s[c];let d=u.dims.at(-1);t.max_new_tokens!==null&&(t.max_length=d+t.max_new_tokens);let f=this._get_logits_processor(t,d,n),p=this._get_stopping_criteria(t,r),m=s[c].dims.at(0),h=sg.getSampler(t),g=Array(m).fill(0),_=u.tolist();i&&i.put(_);let v,y={},b={};for(;;){if(s=this.prepare_inputs_for_generation(_,s,t),v=await this.forward(s),t.return_dict_in_generate){if(t.output_attentions){let e=Ag(v);for(let t in e)t in y||(y[t]=[]),y[t].push(e[t])}else this._return_dict_in_generate_keys&&Object.assign(b,ci(v,this._return_dict_in_generate_keys))}let e=f(_,v.logits.slice(null,-1,null).to(`float32`)),n=[];for(let t=0;te))break;s=this._update_model_kwargs_for_generation({generated_input_ids:n,outputs:v,model_inputs:s,is_encoder_decoder:l})}i&&i.end();let x=new V(`int64`,_.flat(),[_.length,_[0].length]),S=kg(v,s.past_key_values),C=new Set(Object.values(S));for(let e of Object.values(v))e.location===`gpu-buffer`&&!C.has(e)&&e.dispose();return`past_key_values`in a||t.return_dict_in_generate||await S.dispose(),t.return_dict_in_generate?{sequences:x,past_key_values:S,...y,...b}:x}async _encode_input(e,t,n){if(!Object.hasOwn(this.sessions,e))throw Error(`Model does not have a ${e} session.`);let r=this.sessions[e];return(await q(r,ci(t,r.inputNames)))[n]}async encode_image(e){return this._encode_input(`vision_encoder`,e,`image_features`)}async encode_text(e){return this._encode_input(`embed_tokens`,e,`inputs_embeds`)}async encode_audio(e){return this._encode_input(`audio_encoder`,e,`audio_features`)}};async function Eg(e,t){let{encoder_outputs:n,input_ids:r,decoder_input_ids:i,decoder_attention_mask:a,...o}=t;return n||=(await Dg(e,ci(t,e.sessions.model.inputNames))).last_hidden_state,o.input_ids=i,o.encoder_hidden_states=n,e.sessions.decoder_model_merged.inputNames.includes(`encoder_attention_mask`)&&(o.encoder_attention_mask=t.attention_mask),a&&!o.attention_mask&&(o.attention_mask=a),await Pg(e,o,!0)}async function Dg(e,t){let n=e.sessions.model,r=ci(t,n.inputNames);if(n.inputNames.includes(`inputs_embeds`)&&!r.inputs_embeds){if(!t.input_ids)throw Error("Both `input_ids` and `inputs_embeds` are missing in the model inputs.");r.inputs_embeds=await e.encode_text({input_ids:t.input_ids})}if(n.inputNames.includes(`token_type_ids`)&&!r.token_type_ids){if(!r.input_ids)throw Error("Both `input_ids` and `token_type_ids` are missing in the model inputs.");r.token_type_ids=Su(r.input_ids)}if(n.inputNames.includes(`pixel_mask`)&&!r.pixel_mask){if(!r.pixel_values)throw Error("Both `pixel_values` and `pixel_mask` are missing in the model inputs.");let e=r.pixel_values.dims;r.pixel_mask=yu([e[0],e[2],e[3]])}return await q(n,r)}async function Og(e,t){let n=await e.encode(t);return await e.decode(n)}function kg(e,t){let n=/* @__PURE__ */ Object.create(null);for(let r in e)if(r.startsWith(`present`)){let i=r.replace(`present_ssm`,`past_ssm`).replace(`present_conv`,`past_conv`).replace(`present_recurrent`,`past_recurrent`).replace(`present_compressor`,`past_compressor`).replace(`present_indexer`,`past_indexer`).replace(`present`,`past_key_values`);n[i]=r.includes(`encoder`)&&t?t[i]:e[r]}return t?(t.update(n),t):new dg(n)}function Ag(e){let t={};for(let n of[`cross_attentions`,`encoder_attentions`,`decoder_attentions`])for(let r in e)r.startsWith(n)&&(n in t||(t[n]=[]),t[n].push(e[r]));return t}function jg(e,t){return e.map(e=>typeof e==`number`?e:t[e]??0)}function Mg(e,t,n){if(n&&Object.keys(n).length>0)return Object.assign(t,n),n;let r=e.sessions.decoder_model_merged??e.sessions.model,i=(t[e.main_input_name]??t.attention_mask)?.dims?.[0]??1,a=bh(e.config),o=e.config?.normalized_config?.num_heads,s={batch_size:i};typeof o==`number`&&(s[`batch_size x num_heads`]=i*o);let c=/* @__PURE__ */ Object.create(null);for(let e of r.inputMetadata){if(!a.has(e.name))continue;let n=jg(e.shape,s),r=n.reduce((e,t)=>e*t,1),i=Ql[e.type],o=new V(e.type,new i(r),n);t[e.name]=o,c[e.name]=o}return n?(n.update(c),n):new dg(c)}function Ng(e,t,n){t.num_logits_to_keep||(e.sessions.decoder_model_merged??e.sessions.model)?.inputNames.includes(`num_logits_to_keep`)&&(t.num_logits_to_keep=new V(`int64`,[n],[]))}async function Pg(e,t,n=!1){let r=e.sessions[n?`decoder_model_merged`:`model`],{past_key_values:i,...a}=t;return r.inputNames.includes(`use_cache_branch`)&&(a.use_cache_branch=bg(i!=null&&Object.keys(i).length>0)),r.inputNames.includes(`position_ids`)&&a.attention_mask&&!a.position_ids&&(a.position_ids=zg(a,i,+!![`paligemma`,`gemma3_text`,`gemma3`].includes(e.config.model_type))),Ng(e,a,0n),Mg(e,a,i),await q(r,ci(a,r.inputNames))}async function Fg(e,{encode_function:t,merge_function:n,modality_input_names:r,modality_output_name:i,input_ids:a=null,attention_mask:o=null,position_ids:s=null,inputs_embeds:c=null,past_key_values:l=null,generation_config:u=null,logits_processor:d=null,num_logits_to_keep:f=null,...p}){if(!c){c=await e.encode_text({input_ids:a,...p});let s=ci(p,r);if(Object.keys(s).length>0){if(a.dims[1]!==1){let e=await t({...s,...p});({inputs_embeds:c,attention_mask:o}=n({[i]:e,inputs_embeds:c,input_ids:a,attention_mask:o}))}else if(l&&a.dims[1]===1){let e=a.dims[1],t=l.get_seq_length();o=H([yu([a.dims[0],t]),o.slice(null,[o.dims[1]-e,o.dims[1]])],1)}}}if(!s&&[`qwen2_vl`,`qwen2_vl_text`,`qwen2_5_vl`,`qwen2_5_vl_text`,`qwen3_vl`,`qwen3_vl_text`,`qwen3_vl_moe`,`qwen3_vl_moe_text`,`qwen3_5`,`qwen3_5_text`,`qwen3_5_moe`,`qwen3_5_moe_text`,`glm_ocr`,`glm_ocr_text`].includes(e.config.model_type)){let{image_grid_thw:t,video_grid_thw:n}=p;[s]=e.get_rope_index(a,t,n,o)}return await Pg(e,{inputs_embeds:c,past_key_values:l,attention_mask:o,position_ids:s,generation_config:u,logits_processor:d,num_logits_to_keep:f},!0)}async function Ig(e,t){return await Fg(e,{...t,modality_input_names:[`audio_values`,`input_features`],modality_output_name:`audio_features`,encode_function:e.encode_audio.bind(e),merge_function:e._merge_input_ids_with_audio_features.bind(e)})}async function Lg(e,t){return await Fg(e,{...t,modality_input_names:[`pixel_values`],modality_output_name:`image_features`,encode_function:e.encode_image.bind(e),merge_function:e._merge_input_ids_with_image_features.bind(e)})}function Rg(e,t=0){let[n,r]=e.dims,i=e.data,a=new BigInt64Array(i.length);for(let e=0;ee.dims[1]||i[e.at(-1)])),Ng(e,n,1n),{...n,decoder_input_ids:yg(t)}}function Hg(e,...t){return e.config.is_encoder_decoder?Vg(e,...t):Bg(e,...t)}function Ug({modality_token_id:e,inputs_embeds:t,modality_features:n,input_ids:r,attention_mask:i}){let a=r.tolist().map(t=>t.reduce((t,n,r)=>(n==e&&t.push(r),t),[])),o=a.reduce((e,t)=>e+t.length,0),s=n.dims[0];if(o!==s)throw Error(`Number of tokens and features do not match: tokens: ${o}, features ${s}`);let c=0;for(let e=0;e[r,await rl(e,t[r],!1,n)])))}var qg={};Sr(qg,{ASTForAudioClassification:()=>u_,ASTModel:()=>l_,ASTPreTrainedModel:()=>c_,AfmoeForCausalLM:()=>i_,AfmoeModel:()=>r_,AfmoePreTrainedModel:()=>n_,AlbertForMaskedLM:()=>Qg,AlbertForQuestionAnswering:()=>Zg,AlbertForSequenceClassification:()=>Xg,AlbertModel:()=>Yg,AlbertPreTrainedModel:()=>Jg,ApertusForCausalLM:()=>t_,ApertusModel:()=>e_,ApertusPreTrainedModel:()=>$g,ArceeForCausalLM:()=>s_,ArceeModel:()=>o_,ArceePreTrainedModel:()=>a_,BartForConditionalGeneration:()=>p_,BartForSequenceClassification:()=>m_,BartModel:()=>f_,BartPretrainedModel:()=>d_,BaseModelOutput:()=>Nh,BeitForImageClassification:()=>__,BeitModel:()=>g_,BeitPreTrainedModel:()=>h_,BertForMaskedLM:()=>b_,BertForQuestionAnswering:()=>C_,BertForSequenceClassification:()=>x_,BertForTokenClassification:()=>S_,BertModel:()=>y_,BertPreTrainedModel:()=>v_,BlenderbotForConditionalGeneration:()=>E_,BlenderbotModel:()=>T_,BlenderbotPreTrainedModel:()=>w_,BlenderbotSmallForConditionalGeneration:()=>k_,BlenderbotSmallModel:()=>O_,BlenderbotSmallPreTrainedModel:()=>D_,BloomForCausalLM:()=>M_,BloomModel:()=>j_,BloomPreTrainedModel:()=>A_,CHMv2ForDepthEstimation:()=>K_,CHMv2PreTrainedModel:()=>G_,CLIPModel:()=>Q_,CLIPPreTrainedModel:()=>Z_,CLIPSegForImageSegmentation:()=>av,CLIPSegModel:()=>iv,CLIPSegPreTrainedModel:()=>rv,CLIPTextModel:()=>$_,CLIPTextModelWithProjection:()=>ev,CLIPVisionModel:()=>tv,CLIPVisionModelWithProjection:()=>nv,CamembertForMaskedLM:()=>F_,CamembertForQuestionAnswering:()=>R_,CamembertForSequenceClassification:()=>I_,CamembertForTokenClassification:()=>L_,CamembertModel:()=>P_,CamembertPreTrainedModel:()=>N_,CausalLMOutput:()=>Lh,CausalLMOutputWithPast:()=>Rh,ChatterboxModel:()=>H_,ChatterboxPreTrainedModel:()=>V_,ChineseCLIPModel:()=>W_,ChineseCLIPPreTrainedModel:()=>U_,ClapAudioModelWithProjection:()=>X_,ClapModel:()=>J_,ClapPreTrainedModel:()=>q_,ClapTextModelWithProjection:()=>Y_,CodeGenForCausalLM:()=>cv,CodeGenModel:()=>sv,CodeGenPreTrainedModel:()=>ov,Cohere2ForCausalLM:()=>mv,Cohere2Model:()=>pv,Cohere2PreTrainedModel:()=>fv,CohereAsrForConditionalGeneration:()=>_v,CohereAsrModel:()=>gv,CohereAsrPreTrainedModel:()=>hv,CohereForCausalLM:()=>dv,CohereModel:()=>uv,CoherePreTrainedModel:()=>lv,ConvBertForMaskedLM:()=>bv,ConvBertForQuestionAnswering:()=>Cv,ConvBertForSequenceClassification:()=>xv,ConvBertForTokenClassification:()=>Sv,ConvBertModel:()=>yv,ConvBertPreTrainedModel:()=>vv,ConvNextForImageClassification:()=>Ev,ConvNextModel:()=>Tv,ConvNextPreTrainedModel:()=>wv,ConvNextV2ForImageClassification:()=>kv,ConvNextV2Model:()=>Ov,ConvNextV2PreTrainedModel:()=>Dv,DFineForObjectDetection:()=>Iv,DFineModel:()=>Fv,DFinePreTrainedModel:()=>Pv,DINOv3ConvNextModel:()=>ky,DINOv3ConvNextPreTrainedModel:()=>Oy,DINOv3ViTModel:()=>jy,DINOv3ViTPreTrainedModel:()=>Ay,DPTForDepthEstimation:()=>Hy,DPTModel:()=>Vy,DPTPreTrainedModel:()=>By,DacDecoderModel:()=>Hv,DacDecoderOutput:()=>Rv,DacEncoderModel:()=>Vv,DacEncoderOutput:()=>Lv,DacModel:()=>Bv,DacPreTrainedModel:()=>zv,DebertaForMaskedLM:()=>Gv,DebertaForQuestionAnswering:()=>Jv,DebertaForSequenceClassification:()=>Kv,DebertaForTokenClassification:()=>qv,DebertaModel:()=>Wv,DebertaPreTrainedModel:()=>Uv,DebertaV2ForMaskedLM:()=>ry,DebertaV2ForQuestionAnswering:()=>oy,DebertaV2ForSequenceClassification:()=>iy,DebertaV2ForTokenClassification:()=>ay,DebertaV2Model:()=>ny,DebertaV2PreTrainedModel:()=>ty,DecisionTransformerModel:()=>cy,DecisionTransformerPreTrainedModel:()=>sy,DeepseekV3ForCausalLM:()=>Zv,DeepseekV3Model:()=>Xv,DeepseekV3PreTrainedModel:()=>Yv,DeepseekV4ForCausalLM:()=>ey,DeepseekV4Model:()=>$v,DeepseekV4PreTrainedModel:()=>Qv,DeiTForImageClassification:()=>dy,DeiTModel:()=>uy,DeiTPreTrainedModel:()=>ly,DepthAnythingForDepthEstimation:()=>py,DepthAnythingPreTrainedModel:()=>fy,DepthProForDepthEstimation:()=>hy,DepthProPreTrainedModel:()=>my,DetrForObjectDetection:()=>vy,DetrForSegmentation:()=>yy,DetrModel:()=>_y,DetrObjectDetectionOutput:()=>by,DetrPreTrainedModel:()=>gy,DetrSegmentationOutput:()=>xy,Dinov2ForImageClassification:()=>wy,Dinov2Model:()=>Cy,Dinov2PreTrainedModel:()=>Sy,Dinov2WithRegistersForImageClassification:()=>Dy,Dinov2WithRegistersModel:()=>Ey,Dinov2WithRegistersPreTrainedModel:()=>Ty,DistilBertForMaskedLM:()=>Ly,DistilBertForQuestionAnswering:()=>Iy,DistilBertForSequenceClassification:()=>Py,DistilBertForTokenClassification:()=>Fy,DistilBertModel:()=>Ny,DistilBertPreTrainedModel:()=>My,DonutSwinModel:()=>zy,DonutSwinPreTrainedModel:()=>Ry,EdgeTamModel:()=>kE,EfficientNetForImageClassification:()=>Gy,EfficientNetModel:()=>Wy,EfficientNetPreTrainedModel:()=>Uy,ElectraForMaskedLM:()=>Jy,ElectraForQuestionAnswering:()=>Zy,ElectraForSequenceClassification:()=>Yy,ElectraForTokenClassification:()=>Xy,ElectraModel:()=>qy,ElectraPreTrainedModel:()=>Ky,Ernie4_5ForCausalLM:()=>eb,Ernie4_5Model:()=>$y,Ernie4_5PretrainedModel:()=>Qy,EsmForMaskedLM:()=>rb,EsmForSequenceClassification:()=>ib,EsmForTokenClassification:()=>ab,EsmModel:()=>nb,EsmPreTrainedModel:()=>tb,EuroBertForMaskedLM:()=>cb,EuroBertForSequenceClassification:()=>lb,EuroBertForTokenClassification:()=>ub,EuroBertModel:()=>sb,EuroBertPreTrainedModel:()=>ob,ExaoneForCausalLM:()=>pb,ExaoneModel:()=>fb,ExaonePreTrainedModel:()=>db,FalconForCausalLM:()=>gb,FalconH1ForCausalLM:()=>yb,FalconH1Model:()=>vb,FalconH1PreTrainedModel:()=>_b,FalconModel:()=>hb,FalconPreTrainedModel:()=>mb,FastViTForImageClassification:()=>Sb,FastViTModel:()=>xb,FastViTPreTrainedModel:()=>bb,Florence2ForConditionalGeneration:()=>wb,Florence2PreTrainedModel:()=>Cb,GLPNForDepthEstimation:()=>ix,GLPNModel:()=>rx,GLPNPreTrainedModel:()=>nx,GPT2LMHeadModel:()=>yx,GPT2Model:()=>vx,GPT2PreTrainedModel:()=>_x,GPTBigCodeForCausalLM:()=>sx,GPTBigCodeModel:()=>ox,GPTBigCodePreTrainedModel:()=>ax,GPTJForCausalLM:()=>Sx,GPTJModel:()=>xx,GPTJPreTrainedModel:()=>bx,GPTNeoForCausalLM:()=>ux,GPTNeoModel:()=>lx,GPTNeoPreTrainedModel:()=>cx,GPTNeoXForCausalLM:()=>px,GPTNeoXModel:()=>fx,GPTNeoXPreTrainedModel:()=>dx,Gemma2ForCausalLM:()=>Ab,Gemma2Model:()=>kb,Gemma2PreTrainedModel:()=>Ob,Gemma3ForCausalLM:()=>Rb,Gemma3ForConditionalGeneration:()=>Lb,Gemma3Model:()=>Ib,Gemma3PreTrainedModel:()=>Fb,Gemma3nForCausalLM:()=>Vb,Gemma3nForConditionalGeneration:()=>Bb,Gemma3nPreTrainedModel:()=>zb,Gemma4ForCausalLM:()=>Ub,Gemma4ForConditionalGeneration:()=>Hb,GemmaForCausalLM:()=>Db,GemmaModel:()=>Eb,GemmaPreTrainedModel:()=>Tb,GlmForCausalLM:()=>Kb,GlmModel:()=>Gb,GlmMoeDsaForCausalLM:()=>Yb,GlmMoeDsaModel:()=>Jb,GlmMoeDsaPreTrainedModel:()=>qb,GlmOcrForConditionalGeneration:()=>tx,GlmPreTrainedModel:()=>Wb,GptOssForCausalLM:()=>gx,GptOssModel:()=>hx,GptOssPreTrainedModel:()=>mx,GraniteForCausalLM:()=>Tx,GraniteModel:()=>wx,GraniteMoeHybridForCausalLM:()=>Ox,GraniteMoeHybridModel:()=>Dx,GraniteMoeHybridPreTrainedModel:()=>Ex,GranitePreTrainedModel:()=>Cx,GraniteSpeechForConditionalGeneration:()=>jx,GroundingDinoForObjectDetection:()=>Nx,GroundingDinoPreTrainedModel:()=>Mx,GroupViTModel:()=>Fx,GroupViTPreTrainedModel:()=>Px,HeliumForCausalLM:()=>Rx,HeliumModel:()=>Lx,HeliumPreTrainedModel:()=>Ix,HieraForImageClassification:()=>Vx,HieraModel:()=>Bx,HieraPreTrainedModel:()=>zx,HrmTextForCausalLM:()=>Wx,HrmTextModel:()=>Ux,HrmTextPreTrainedModel:()=>Hx,HubertForCTC:()=>Qx,HubertForSequenceClassification:()=>$x,HubertModel:()=>Zx,HubertPreTrainedModel:()=>Xx,HunYuanDenseV1ForCausalLM:()=>nS,HunYuanDenseV1Model:()=>tS,HunYuanDenseV1PreTrainedModel:()=>eS,IJepaForImageClassification:()=>oS,IJepaModel:()=>aS,IJepaPreTrainedModel:()=>iS,Idefics3ForConditionalGeneration:()=>rS,ImageMattingOutput:()=>Bh,JAISLMHeadModel:()=>lS,JAISModel:()=>cS,JAISPreTrainedModel:()=>sS,JinaCLIPModel:()=>dS,JinaCLIPPreTrainedModel:()=>uS,JinaCLIPTextModel:()=>fS,JinaCLIPVisionModel:()=>pS,Lfm2ForCausalLM:()=>gS,Lfm2Model:()=>hS,Lfm2MoeForCausalLM:()=>bS,Lfm2MoeModel:()=>yS,Lfm2MoePreTrainedModel:()=>vS,Lfm2PreTrainedModel:()=>mS,Lfm2VlForConditionalGeneration:()=>xS,LightOnOcrForConditionalGeneration:()=>_S,LiteWhisperForConditionalGeneration:()=>RO,Llama4ForCausalLM:()=>ES,Llama4PreTrainedModel:()=>TS,LlamaForCausalLM:()=>wS,LlamaModel:()=>CS,LlamaPreTrainedModel:()=>SS,LlavaForConditionalGeneration:()=>Mb,LlavaOnevisionForConditionalGeneration:()=>Mb,LlavaPreTrainedModel:()=>jb,LlavaQwen2ForCausalLM:()=>Pb,LongT5ForConditionalGeneration:()=>kS,LongT5Model:()=>OS,LongT5PreTrainedModel:()=>DS,M2M100ForConditionalGeneration:()=>MS,M2M100Model:()=>jS,M2M100PreTrainedModel:()=>AS,MBartForCausalLM:()=>US,MBartForConditionalGeneration:()=>VS,MBartForSequenceClassification:()=>HS,MBartModel:()=>BS,MBartPreTrainedModel:()=>zS,MPNetForMaskedLM:()=>aw,MPNetForQuestionAnswering:()=>cw,MPNetForSequenceClassification:()=>ow,MPNetForTokenClassification:()=>sw,MPNetModel:()=>iw,MPNetPreTrainedModel:()=>rw,MT5ForConditionalGeneration:()=>mw,MT5Model:()=>pw,MT5PreTrainedModel:()=>fw,MarianMTModel:()=>FS,MarianModel:()=>PS,MarianPreTrainedModel:()=>NS,MaskFormerForInstanceSegmentation:()=>RS,MaskFormerModel:()=>LS,MaskFormerPreTrainedModel:()=>IS,MaskedLMOutput:()=>Fh,Metric3DForDepthEstimation:()=>GS,Metric3DPreTrainedModel:()=>WS,Metric3Dv2ForDepthEstimation:()=>qS,Metric3Dv2PreTrainedModel:()=>KS,MgpstrForSceneTextRecognition:()=>XS,MgpstrModelOutput:()=>JS,MgpstrPreTrainedModel:()=>YS,MimiDecoderModel:()=>nC,MimiDecoderOutput:()=>QS,MimiEncoderModel:()=>tC,MimiEncoderOutput:()=>ZS,MimiModel:()=>eC,MimiPreTrainedModel:()=>$S,Ministral3ForCausalLM:()=>cC,Ministral3Model:()=>sC,Ministral3PreTrainedModel:()=>oC,MinistralForCausalLM:()=>aC,MinistralModel:()=>iC,MinistralPreTrainedModel:()=>rC,Mistral3ForConditionalGeneration:()=>fC,Mistral4ForCausalLM:()=>hC,Mistral4Model:()=>mC,Mistral4PreTrainedModel:()=>pC,MistralForCausalLM:()=>dC,MistralModel:()=>uC,MistralPreTrainedModel:()=>lC,MobileBertForMaskedLM:()=>vC,MobileBertForQuestionAnswering:()=>bC,MobileBertForSequenceClassification:()=>yC,MobileBertModel:()=>_C,MobileBertPreTrainedModel:()=>gC,MobileLLMForCausalLM:()=>CC,MobileLLMModel:()=>SC,MobileLLMPreTrainedModel:()=>xC,MobileNetV1ForImageClassification:()=>EC,MobileNetV1ForSemanticSegmentation:()=>DC,MobileNetV1Model:()=>TC,MobileNetV1PreTrainedModel:()=>wC,MobileNetV2ForImageClassification:()=>AC,MobileNetV2ForSemanticSegmentation:()=>jC,MobileNetV2Model:()=>kC,MobileNetV2PreTrainedModel:()=>OC,MobileNetV3ForImageClassification:()=>PC,MobileNetV3ForSemanticSegmentation:()=>FC,MobileNetV3Model:()=>NC,MobileNetV3PreTrainedModel:()=>MC,MobileNetV4ForImageClassification:()=>RC,MobileNetV4ForSemanticSegmentation:()=>zC,MobileNetV4Model:()=>LC,MobileNetV4PreTrainedModel:()=>IC,MobileViTForImageClassification:()=>HC,MobileViTModel:()=>VC,MobileViTPreTrainedModel:()=>BC,MobileViTV2ForImageClassification:()=>GC,MobileViTV2Model:()=>WC,MobileViTV2PreTrainedModel:()=>UC,ModelOutput:()=>Mh,ModernBertDecoderForCausalLM:()=>$C,ModernBertDecoderModel:()=>QC,ModernBertDecoderPreTrainedModel:()=>ZC,ModernBertForMaskedLM:()=>JC,ModernBertForSequenceClassification:()=>YC,ModernBertForTokenClassification:()=>XC,ModernBertModel:()=>qC,ModernBertPreTrainedModel:()=>KC,Moondream1ForConditionalGeneration:()=>Nb,MoonshineForConditionalGeneration:()=>nw,MoonshineModel:()=>tw,MoonshinePreTrainedModel:()=>ew,MptForCausalLM:()=>dw,MptModel:()=>uw,MptPreTrainedModel:()=>lw,MultiModalityCausalLM:()=>gw,MultiModalityPreTrainedModel:()=>hw,MusicgenForCausalLM:()=>yw,MusicgenForConditionalGeneration:()=>bw,MusicgenModel:()=>vw,MusicgenPreTrainedModel:()=>_w,NanoChatForCausalLM:()=>Cw,NanoChatModel:()=>Sw,NanoChatPreTrainedModel:()=>xw,NemotronHForCausalLM:()=>Ew,NemotronHModel:()=>Tw,NemotronHPreTrainedModel:()=>ww,NeoBertForMaskedLM:()=>kw,NeoBertForQuestionAnswering:()=>Mw,NeoBertForSequenceClassification:()=>Aw,NeoBertForTokenClassification:()=>jw,NeoBertModel:()=>Ow,NeoBertPreTrainedModel:()=>Dw,NomicBertModel:()=>Pw,NomicBertPreTrainedModel:()=>Nw,OPTForCausalLM:()=>tT,OPTModel:()=>eT,OPTPreTrainedModel:()=>$w,Olmo2ForCausalLM:()=>Bw,Olmo2Model:()=>zw,Olmo2PreTrainedModel:()=>Rw,Olmo3ForCausalLM:()=>Uw,Olmo3Model:()=>Hw,Olmo3PreTrainedModel:()=>Vw,OlmoForCausalLM:()=>Lw,OlmoHybridForCausalLM:()=>Kw,OlmoHybridModel:()=>Gw,OlmoHybridPreTrainedModel:()=>Ww,OlmoModel:()=>Iw,OlmoPreTrainedModel:()=>Fw,OpenAIPrivacyFilterForTokenClassification:()=>Yw,OpenAIPrivacyFilterModel:()=>Jw,OpenAIPrivacyFilterPreTrainedModel:()=>qw,OpenELMForCausalLM:()=>Qw,OpenELMModel:()=>Zw,OpenELMPreTrainedModel:()=>Xw,OwlViTForObjectDetection:()=>sT,OwlViTModel:()=>oT,OwlViTPreTrainedModel:()=>aT,Owlv2ForObjectDetection:()=>iT,Owlv2Model:()=>rT,Owlv2PreTrainedModel:()=>nT,PaliGemmaForConditionalGeneration:()=>cT,ParakeetForCTC:()=>uT,ParakeetPreTrainedModel:()=>lT,PatchTSMixerForPrediction:()=>pT,PatchTSMixerModel:()=>fT,PatchTSMixerPreTrainedModel:()=>dT,PatchTSTForPrediction:()=>gT,PatchTSTModel:()=>hT,PatchTSTPreTrainedModel:()=>mT,Phi3ForCausalLM:()=>ST,Phi3Model:()=>xT,Phi3PreTrainedModel:()=>bT,Phi3VForCausalLM:()=>wT,Phi3VPreTrainedModel:()=>CT,PhiForCausalLM:()=>yT,PhiModel:()=>vT,PhiPreTrainedModel:()=>_T,PreTrainedModel:()=>X,PvtForImageClassification:()=>DT,PvtModel:()=>ET,PvtPreTrainedModel:()=>TT,PyAnnoteForAudioFrameClassification:()=>AT,PyAnnoteModel:()=>kT,PyAnnotePreTrainedModel:()=>OT,QuestionAnsweringModelOutput:()=>Ih,Qwen2ForCausalLM:()=>NT,Qwen2Model:()=>MT,Qwen2MoeForCausalLM:()=>IT,Qwen2MoeModel:()=>FT,Qwen2MoePreTrainedModel:()=>PT,Qwen2PreTrainedModel:()=>jT,Qwen2VLForCausalLM:()=>Qb,Qwen2VLForConditionalGeneration:()=>Zb,Qwen2VLPreTrainedModel:()=>Xb,Qwen2_5_VLForCausalLM:()=>ex,Qwen2_5_VLForConditionalGeneration:()=>$b,Qwen3ForCausalLM:()=>zT,Qwen3Model:()=>RT,Qwen3MoeForCausalLM:()=>HT,Qwen3MoeModel:()=>VT,Qwen3MoePreTrainedModel:()=>BT,Qwen3NextForCausalLM:()=>GT,Qwen3NextModel:()=>WT,Qwen3NextPreTrainedModel:()=>UT,Qwen3PreTrainedModel:()=>LT,Qwen3VLForCausalLM:()=>qT,Qwen3VLForConditionalGeneration:()=>KT,Qwen3VLMoeForCausalLM:()=>YT,Qwen3VLMoeForConditionalGeneration:()=>JT,Qwen3_5ForCausalLM:()=>ZT,Qwen3_5ForConditionalGeneration:()=>XT,Qwen3_5MoeForCausalLM:()=>$T,Qwen3_5MoeForConditionalGeneration:()=>QT,RFDetrForObjectDetection:()=>aE,RFDetrModel:()=>iE,RFDetrObjectDetectionOutput:()=>oE,RFDetrPreTrainedModel:()=>rE,RTDetrForObjectDetection:()=>Mv,RTDetrModel:()=>jv,RTDetrObjectDetectionOutput:()=>Nv,RTDetrPreTrainedModel:()=>Av,RTDetrV2ForObjectDetection:()=>xE,RTDetrV2Model:()=>bE,RTDetrV2ObjectDetectionOutput:()=>SE,RTDetrV2PreTrainedModel:()=>yE,ResNetForImageClassification:()=>nE,ResNetModel:()=>tE,ResNetPreTrainedModel:()=>eE,RoFormerForMaskedLM:()=>hE,RoFormerForQuestionAnswering:()=>vE,RoFormerForSequenceClassification:()=>gE,RoFormerForTokenClassification:()=>_E,RoFormerModel:()=>mE,RoFormerPreTrainedModel:()=>pE,RobertaForMaskedLM:()=>lE,RobertaForQuestionAnswering:()=>fE,RobertaForSequenceClassification:()=>uE,RobertaForTokenClassification:()=>dE,RobertaModel:()=>cE,RobertaPreTrainedModel:()=>sE,Sam2ImageSegmentationOutput:()=>EE,Sam2Model:()=>OE,Sam2PreTrainedModel:()=>DE,Sam3TrackerModel:()=>AE,SamImageSegmentationOutput:()=>CE,SamModel:()=>TE,SamPreTrainedModel:()=>wE,SapiensForDepthEstimation:()=>NE,SapiensForNormalEstimation:()=>PE,SapiensForSemanticSegmentation:()=>ME,SapiensPreTrainedModel:()=>jE,SegformerForImageClassification:()=>LE,SegformerForSemanticSegmentation:()=>RE,SegformerModel:()=>IE,SegformerPreTrainedModel:()=>FE,Seq2SeqLMOutput:()=>zh,SequenceClassifierOutput:()=>J,SiglipModel:()=>BE,SiglipPreTrainedModel:()=>zE,SiglipTextModel:()=>VE,SiglipVisionModel:()=>HE,SmolLM3ForCausalLM:()=>GE,SmolLM3Model:()=>WE,SmolLM3PreTrainedModel:()=>UE,SmolVLMForConditionalGeneration:()=>KE,SnacDecoderModel:()=>XE,SnacEncoderModel:()=>YE,SnacModel:()=>JE,SnacPreTrainedModel:()=>qE,SolarOpenForCausalLM:()=>$E,SolarOpenModel:()=>QE,SolarOpenPreTrainedModel:()=>ZE,SpeechT5ForSpeechToText:()=>nD,SpeechT5ForTextToSpeech:()=>rD,SpeechT5HifiGan:()=>iD,SpeechT5Model:()=>tD,SpeechT5PreTrainedModel:()=>eD,SqueezeBertForMaskedLM:()=>sD,SqueezeBertForQuestionAnswering:()=>lD,SqueezeBertForSequenceClassification:()=>cD,SqueezeBertModel:()=>oD,SqueezeBertPreTrainedModel:()=>aD,StableLmForCausalLM:()=>fD,StableLmModel:()=>dD,StableLmPreTrainedModel:()=>uD,Starcoder2ForCausalLM:()=>hD,Starcoder2Model:()=>mD,Starcoder2PreTrainedModel:()=>pD,StyleTextToSpeech2Model:()=>_D,StyleTextToSpeech2PreTrainedModel:()=>gD,SupertonicForConditionalGeneration:()=>yD,SupertonicPreTrainedModel:()=>vD,Swin2SRForImageSuperResolution:()=>ED,Swin2SRModel:()=>TD,Swin2SRPreTrainedModel:()=>wD,SwinForImageClassification:()=>SD,SwinForSemanticSegmentation:()=>CD,SwinModel:()=>xD,SwinPreTrainedModel:()=>bD,T5ForConditionalGeneration:()=>kD,T5Model:()=>OD,T5PreTrainedModel:()=>DD,TableTransformerForObjectDetection:()=>MD,TableTransformerModel:()=>jD,TableTransformerObjectDetectionOutput:()=>ND,TableTransformerPreTrainedModel:()=>AD,TokenClassifierOutput:()=>Ph,TrOCRForCausalLM:()=>FD,TrOCRPreTrainedModel:()=>PD,UltravoxModel:()=>Ax,UltravoxPreTrainedModel:()=>kx,UniSpeechForCTC:()=>RD,UniSpeechForSequenceClassification:()=>zD,UniSpeechModel:()=>LD,UniSpeechPreTrainedModel:()=>ID,UniSpeechSatForAudioFrameClassification:()=>WD,UniSpeechSatForCTC:()=>HD,UniSpeechSatForSequenceClassification:()=>UD,UniSpeechSatModel:()=>VD,UniSpeechSatPreTrainedModel:()=>BD,VaultGemmaForCausalLM:()=>qD,VaultGemmaModel:()=>KD,VaultGemmaPreTrainedModel:()=>GD,ViTForImageClassification:()=>ZD,ViTMAEModel:()=>$D,ViTMAEPreTrainedModel:()=>QD,ViTMSNForImageClassification:()=>nO,ViTMSNModel:()=>tO,ViTMSNPreTrainedModel:()=>eO,ViTModel:()=>XD,ViTPreTrainedModel:()=>YD,VisionEncoderDecoderModel:()=>JD,VitMatteForImageMatting:()=>iO,VitMattePreTrainedModel:()=>rO,VitPoseForPoseEstimation:()=>oO,VitPosePreTrainedModel:()=>aO,VitsModel:()=>lO,VitsModelOutput:()=>sO,VitsPreTrainedModel:()=>cO,VoxtralForConditionalGeneration:()=>uO,VoxtralRealtimeForConditionalGeneration:()=>bO,VoxtralRealtimePreTrainedModel:()=>yO,Wav2Vec2BertForCTC:()=>CO,Wav2Vec2BertForSequenceClassification:()=>wO,Wav2Vec2BertModel:()=>SO,Wav2Vec2BertPreTrainedModel:()=>xO,Wav2Vec2ForAudioFrameClassification:()=>Yx,Wav2Vec2ForCTC:()=>qx,Wav2Vec2ForSequenceClassification:()=>Jx,Wav2Vec2Model:()=>Kx,Wav2Vec2PreTrainedModel:()=>Gx,WavLMForAudioFrameClassification:()=>jO,WavLMForCTC:()=>OO,WavLMForSequenceClassification:()=>kO,WavLMForXVector:()=>AO,WavLMModel:()=>DO,WavLMPreTrainedModel:()=>EO,WeSpeakerResNetModel:()=>NO,WeSpeakerResNetPreTrainedModel:()=>MO,WhisperForConditionalGeneration:()=>LO,WhisperModel:()=>IO,WhisperPreTrainedModel:()=>FO,XLMForQuestionAnswering:()=>WO,XLMForSequenceClassification:()=>HO,XLMForTokenClassification:()=>UO,XLMModel:()=>BO,XLMPreTrainedModel:()=>zO,XLMRobertaForMaskedLM:()=>qO,XLMRobertaForQuestionAnswering:()=>XO,XLMRobertaForSequenceClassification:()=>JO,XLMRobertaForTokenClassification:()=>YO,XLMRobertaModel:()=>KO,XLMRobertaPreTrainedModel:()=>GO,XLMWithLMHeadModel:()=>VO,XVectorOutput:()=>TO,YolosForObjectDetection:()=>$O,YolosModel:()=>QO,YolosObjectDetectionOutput:()=>ek,YolosPreTrainedModel:()=>ZO,YoutuForCausalLM:()=>rk,YoutuModel:()=>nk,YoutuPreTrainedModel:()=>tk,ZayaForCausalLM:()=>ok,ZayaModel:()=>ak,ZayaPreTrainedModel:()=>ik});var Jg=class extends X{},Yg=class extends Jg{},Xg=class extends Jg{async _call(e){return new J(await super._call(e))}},Zg=class extends Jg{async _call(e){return new Ih(await super._call(e))}},Qg=class extends Jg{async _call(e){return new Fh(await super._call(e))}},$g=class extends X{},e_=class extends $g{},t_=class extends $g{},n_=class extends X{},r_=class extends n_{},i_=class extends n_{},a_=class extends X{},o_=class extends a_{},s_=class extends a_{},c_=class extends X{},l_=class extends c_{},u_=class extends c_{},d_=class extends X{},f_=class extends d_{},p_=class extends d_{},m_=class extends d_{async _call(e){return new J(await super._call(e))}},h_=class extends X{},g_=class extends h_{},__=class extends h_{async _call(e){return new J(await super._call(e))}},v_=class extends X{},y_=class extends v_{},b_=class extends v_{async _call(e){return new Fh(await super._call(e))}},x_=class extends v_{async _call(e){return new J(await super._call(e))}},S_=class extends v_{async _call(e){return new Ph(await super._call(e))}},C_=class extends v_{async _call(e){return new Ih(await super._call(e))}},w_=class extends X{},T_=class extends w_{},E_=class extends w_{},D_=class extends X{},O_=class extends D_{},k_=class extends D_{},A_=class extends X{},j_=class extends A_{},M_=class extends A_{},N_=class extends X{},P_=class extends N_{},F_=class extends N_{async _call(e){return new Fh(await super._call(e))}},I_=class extends N_{async _call(e){return new J(await super._call(e))}},L_=class extends N_{async _call(e){return new Ph(await super._call(e))}},R_=class extends N_{async _call(e){return new Ih(await super._call(e))}},z_=4299n,B_=6561n,V_=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`audio_values`,`exaggeration`,`audio_features`,`audio_tokens`,`speaker_embeddings`,`speaker_features`,`past_key_values`];main_input_name=`input_ids`;_return_dict_in_generate_keys=[`audio_tokens`,`speaker_embeddings`,`speaker_features`]},H_=class extends V_{async encode_speech(e){return q(this.sessions.speech_encoder,{audio_values:e})}async forward({input_ids:e=null,attention_mask:t=null,audio_values:n=null,exaggeration:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,audio_features:u=null,audio_tokens:d=null,speaker_embeddings:f=null,speaker_features:p=null,...m}){let h;if(!a){let s=this.sessions.embed_tokens.inputNames,c={input_ids:e};if(s.includes(`exaggeration`)){if(!(r instanceof V)){let t=e.dims[0];if(r==null)r=_u([t],.5);else if(typeof r==`number`)r=_u([t],r);else if(Array.isArray(r))r=new V(`float32`,r,[t]);else throw Error("Unsupported type for `exaggeration` input")}c.exaggeration=r}if(s.includes(`position_ids`)&&(c.position_ids=i),{inputs_embeds:a}=await q(this.sessions.embed_tokens,c),u&&d&&f&&p&&(h={audio_features:u,audio_tokens:d,speaker_embeddings:f,speaker_features:p}),h||n)h??=await this.encode_speech(n),a=H([h.audio_features,a],1),t=yu([a.dims[0],a.dims[1]]);else{let e=a.dims[1];if(!o||e!==1)throw Error(`Incorrect state encountered during generation.`);let n=o.get_seq_length();t=yu([a.dims[0],n+e])}}return{...await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1),...h}}prepare_inputs_for_generation(e,t,n){return!t.position_ids&&this.sessions.embed_tokens.inputNames.includes(`position_ids`)&&(t.position_ids=t.input_ids.dims[1]===1?new V(`int64`,Array.from({length:e.length},(t,n)=>e[n].length-e[n].findLastIndex(e=>e==B_)-1),[e.length,1]):new V(`int64`,t.input_ids.tolist().map(e=>{let t=0;return e.map(e=>e>=B_?0:t++)}).flat(),t.input_ids.dims)),t.input_ids.dims[1]===1&&(delete t.audio_values,delete t.audio_features,delete t.audio_tokens,delete t.speaker_embeddings,delete t.speaker_features),Bg(this,e,t,n)}async generate(e){let t=e.past_key_values,{sequences:n,audio_tokens:r,speaker_embeddings:i,speaker_features:a,past_key_values:o}=await super.generate({...e,return_dict_in_generate:!0});try{let t=n.slice(null,[e.input_ids.dims[1],-1]),o=H([r,t,_u([t.dims[0],3],z_)],1),{waveform:s}=await q(this.sessions.conditional_decoder,{speech_tokens:o,speaker_features:a,speaker_embeddings:i});return s}finally{o!==t&&await o?.dispose()}}},U_=class extends X{},W_=class extends U_{},G_=class extends X{},K_=class extends G_{},q_=class extends X{},J_=class extends q_{},Y_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},X_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`audio_model`})}},Z_=class extends X{},Q_=class extends Z_{},$_=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},ev=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},tv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},nv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},rv=class extends X{},iv=class extends rv{},av=class extends rv{},ov=class extends X{},sv=class extends ov{},cv=class extends ov{},lv=class extends X{},uv=class extends lv{},dv=class extends lv{},fv=class extends X{},pv=class extends fv{},mv=class extends fv{},hv=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},gv=class extends hv{},_v=class extends hv{},vv=class extends X{},yv=class extends vv{},bv=class extends vv{async _call(e){return new Fh(await super._call(e))}},xv=class extends vv{async _call(e){return new J(await super._call(e))}},Sv=class extends vv{async _call(e){return new Ph(await super._call(e))}},Cv=class extends vv{async _call(e){return new Ih(await super._call(e))}},wv=class extends X{},Tv=class extends wv{},Ev=class extends wv{async _call(e){return new J(await super._call(e))}},Dv=class extends X{},Ov=class extends Dv{},kv=class extends Dv{async _call(e){return new J(await super._call(e))}},Av=class extends X{},jv=class extends Av{},Mv=class extends Av{async _call(e){return new Nv(await super._call(e))}},Nv=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},Pv=class extends X{},Fv=class extends Pv{},Iv=class extends Pv{async _call(e){return new Nv(await super._call(e))}},Lv=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},Rv=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},zv=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},Bv=class extends zv{async encode(e){return new Lv(await q(this.sessions.encoder_model,e))}async decode(e){return new Rv(await q(this.sessions.decoder_model,e))}},Vv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},Hv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},Uv=class extends X{},Wv=class extends Uv{},Gv=class extends Uv{async _call(e){return new Fh(await super._call(e))}},Kv=class extends Uv{async _call(e){return new J(await super._call(e))}},qv=class extends Uv{async _call(e){return new Ph(await super._call(e))}},Jv=class extends Uv{async _call(e){return new Ih(await super._call(e))}},Yv=class extends X{},Xv=class extends Yv{},Zv=class extends Yv{},Qv=class extends X{},$v=class extends Qv{},ey=class extends Qv{},ty=class extends X{},ny=class extends ty{},ry=class extends ty{async _call(e){return new Fh(await super._call(e))}},iy=class extends ty{async _call(e){return new J(await super._call(e))}},ay=class extends ty{async _call(e){return new Ph(await super._call(e))}},oy=class extends ty{async _call(e){return new Ih(await super._call(e))}},sy=class extends X{},cy=class extends sy{},ly=class extends X{},uy=class extends ly{},dy=class extends ly{async _call(e){return new J(await super._call(e))}},fy=class extends X{},py=class extends fy{},my=class extends X{},hy=class extends my{},gy=class extends X{},_y=class extends gy{},vy=class extends gy{async _call(e){return new by(await super._call(e))}},yy=class extends gy{async _call(e){return new xy(await super._call(e))}},by=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},xy=class extends Mh{constructor({logits:e,pred_boxes:t,pred_masks:n}){super(),this.logits=e,this.pred_boxes=t,this.pred_masks=n}},Sy=class extends X{},Cy=class extends Sy{},wy=class extends Sy{async _call(e){return new J(await super._call(e))}},Ty=class extends X{},Ey=class extends Ty{},Dy=class extends Ty{async _call(e){return new J(await super._call(e))}},Oy=class extends X{},ky=class extends Oy{},Ay=class extends X{},jy=class extends Ay{},My=class extends X{},Ny=class extends My{},Py=class extends My{async _call(e){return new J(await super._call(e))}},Fy=class extends My{async _call(e){return new Ph(await super._call(e))}},Iy=class extends My{async _call(e){return new Ih(await super._call(e))}},Ly=class extends My{async _call(e){return new Fh(await super._call(e))}},Ry=class extends X{},zy=class extends Ry{},By=class extends X{},Vy=class extends By{},Hy=class extends By{},Uy=class extends X{},Wy=class extends Uy{},Gy=class extends Uy{async _call(e){return new J(await super._call(e))}},Ky=class extends X{},qy=class extends Ky{},Jy=class extends Ky{async _call(e){return new Fh(await super._call(e))}},Yy=class extends Ky{async _call(e){return new J(await super._call(e))}},Xy=class extends Ky{async _call(e){return new Ph(await super._call(e))}},Zy=class extends Ky{async _call(e){return new Ih(await super._call(e))}},Qy=class extends X{},$y=class extends Qy{},eb=class extends Qy{},tb=class extends X{},nb=class extends tb{},rb=class extends tb{async _call(e){return new Fh(await super._call(e))}},ib=class extends tb{async _call(e){return new J(await super._call(e))}},ab=class extends tb{async _call(e){return new Ph(await super._call(e))}},ob=class extends X{},sb=class extends ob{},cb=class extends ob{async _call(e){return new Fh(await super._call(e))}},lb=class extends ob{async _call(e){return new J(await super._call(e))}},ub=class extends ob{async _call(e){return new Ph(await super._call(e))}},db=class extends X{},fb=class extends db{},pb=class extends db{},mb=class extends X{},hb=class extends mb{},gb=class extends mb{},_b=class extends X{},vb=class extends _b{},yb=class extends _b{},bb=class extends X{},xb=class extends bb{},Sb=class extends bb{async _call(e){return new J(await super._call(e))}},Cb=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`pixel_values`,`encoder_outputs`,`decoder_input_ids`,`decoder_inputs_embeds`,`decoder_attention_mask`,`past_key_values`];main_input_name=`inputs_embeds`},wb=class extends Cb{_merge_input_ids_with_image_features({inputs_embeds:e,image_features:t,input_ids:n,attention_mask:r}){return{inputs_embeds:H([t,e],1),attention_mask:H([yu(t.dims.slice(0,2)),r],1)}}async _prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:n,attention_mask:r}){if(!e&&!t)throw Error("Either `input_ids` or `pixel_values` should be provided.");let i,a;return e&&(i=await this.encode_text({input_ids:e})),t&&(a=await this.encode_image({pixel_values:t})),i&&a?{inputs_embeds:n,attention_mask:r}=this._merge_input_ids_with_image_features({inputs_embeds:i,image_features:a,input_ids:e,attention_mask:r}):n=i||a,{inputs_embeds:n,attention_mask:r}}async forward({input_ids:e,pixel_values:t,attention_mask:n,decoder_input_ids:r,decoder_attention_mask:i,encoder_outputs:a,past_key_values:o,inputs_embeds:s,decoder_inputs_embeds:c,num_logits_to_keep:l=null}){if(s||({inputs_embeds:s,attention_mask:n}=await this._prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:s,attention_mask:n})),!a){let{last_hidden_state:e}=await Dg(this,{inputs_embeds:s,attention_mask:n});a=e}if(!c){if(!r)throw Error("Either `decoder_input_ids` or `decoder_inputs_embeds` should be provided.");c=await this.encode_text({input_ids:r})}let u={inputs_embeds:c,attention_mask:i,encoder_attention_mask:n,encoder_hidden_states:a,past_key_values:o,num_logits_to_keep:l};return await Pg(this,u,!0)}},Tb=class extends X{},Eb=class extends Tb{},Db=class extends Tb{},Ob=class extends X{},kb=class extends Ob{},Ab=class extends Ob{},jb=class extends X{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`position_ids`,`past_key_values`]},Mb=class extends jb{_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_index??this.config.image_token_id,...e,image_features:n})}},Nb=class extends Mb{},Pb=class extends Mb{},Fb=class extends X{},Ib=class extends Fb{},Lb=class extends Mb{},Rb=class extends Lb{},zb=class extends X{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`input_features`,`input_features_mask`,`past_key_values`]},Bb=class extends zb{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,input_features:r=null,input_features_mask:i=null,position_ids:a=null,inputs_embeds:o=null,per_layer_inputs:s=null,past_key_values:c=null,generation_config:l=null,logits_processor:u=null,num_logits_to_keep:d=null,...f}){if((!o||!s)&&({inputs_embeds:o,per_layer_inputs:s}=await q(this.sessions.embed_tokens,{input_ids:e}),e.dims[1]!==1)){if(n){let{image_features:r}=await this._encode_vision({pixel_values:n,...f});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_image_features({image_features:r,inputs_embeds:o,input_ids:e,attention_mask:t}))}if(r){let{audio_features:n}=await q(this.sessions.audio_encoder,{input_features:r,input_features_mask:i});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_audio_features({audio_features:n,inputs_embeds:o,input_ids:e,attention_mask:t}))}}return await Pg(this,{inputs_embeds:o,per_layer_inputs:s,past_key_values:c,attention_mask:t,position_ids:a,generation_config:l,logits_processor:u,num_logits_to_keep:d},!0)}_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values})}_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_id,...e,image_features:n})}_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.audio_token_id,...e,audio_features:n})}},Vb=class extends Bb{},Hb=class extends Bb{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`image_position_ids`,`input_features`,`input_features_mask`,`past_key_values`];_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values,pixel_position_ids:e.image_position_ids})}},Ub=class extends Hb{},Wb=class extends X{},Gb=class extends Wb{},Kb=class extends Wb{},qb=class extends X{},Jb=class extends qb{},Yb=class extends qb{},Xb=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`,`pixel_values`,`image_grid_thw`]},Zb=class extends Xb{image_grid_thw_name=`grid_thw`;_get_text_only_rope_index(e,t){if(t){let{data:e,dims:n}=Rg(t),r=BigInt64Array.from({length:3*e.length},(t,n)=>e[n%e.length]),i=Array.from({length:n[0]},(t,r)=>ll(e.subarray(n[1]*r,n[1]*(r+1)))[0]+1n+BigInt(n[1]));return[new V(`int64`,r,[3,...n]),new V(`int64`,i,[i.length,1])]}{let[t,n]=e.dims;return[new V(`int64`,BigInt64Array.from({length:3*t*n},(e,r)=>BigInt(Math.floor(r%n/t))),[3,...e.dims]),xu([t,1])]}}_reorder_and_write_positions(e,t,n,r){let i=e.reduce((e,t)=>e+t.length,0),a=Array(i),o=0;for(let t=0;t<3;++t)for(let n of e){let e=n.length/3;for(let r=t*e;r<(t+1)*e;++r)a[o++]=n[r]}let s=0;for(let e=0;e(t==s&&e.push(n),e),[]).map(e=>c[e+1]),u=l.filter(e=>e==a).length,d=l.filter(e=>e==o).length,f=[],p=0,m=u,h=d;for(let e=0;et>p&&e==a),s=c.findIndex((e,t)=>t>p&&e==o),l=m>0&&e!==-1?e:c.length+1,u=h>0&&s!==-1?s:c.length+1,d,g,_,v;l0?ll(f.at(-1))[0]+1:0;f.push(Array.from({length:3*S},(e,t)=>C+t%S));let ee=S+C,w=y*b*x,te=Array.from({length:w},(e,t)=>ee+Math.floor(t/(b*x))),ne=Array.from({length:w},(e,t)=>ee+Math.floor(t/x)%b),re=Array.from({length:w},(e,t)=>ee+t%x);f.push([te,ne,re].flat()),p=d+w}if(p0?ll(f.at(-1))[0]+1:0,t=c.length-p;f.push(Array.from({length:3*t},(n,r)=>e+r%t))}return f}get_rope_index(e,t,n,r){let{vision_config:i}=this.config,a=i.spatial_merge_size??2;if(t||n){let i=e.tolist();r||=bu(e);let o=r.tolist(),s=Array.from({length:3},()=>Array.from({length:e.dims[0]},()=>Array.from({length:e.dims[1]},()=>0))),c=t?t.tolist():[],l=n?n.tolist():[],u={image_index:0,video_index:0},d=[];for(let e=0;eo[e][n]==1),n=this._get_multimodal_rope_positions({filtered_ids:t,image_grid_thw_list:c,video_grid_thw_list:l,spatial_merge_size:a,state:u}),r=this._reorder_and_write_positions(n,o[e],s,e);d.push(ll(r)[0]+1-i[e].length)}return[new V(`int64`,s.flat(1/0),[3,e.dims[0],e.dims[1]]),new V(`int64`,d,[d.length,1])]}return this._get_text_only_rope_index(e,r)}async encode_image({pixel_values:e,image_grid_thw:t}){return(await q(this.sessions.vision_encoder,{pixel_values:e,[this.image_grid_thw_name]:t})).image_features}_merge_input_ids_with_image_features(e){return Wg({image_token_id:this.config.image_token_id,...e})}prepare_inputs_for_generation(e,t,n){if(Ng(this,t,1n),!t.attention_mask||t.position_ids||!(this.sessions.decoder_model_merged??this.sessions.model).inputNames.includes(`position_ids`))return t;if(!t.past_key_values)[t.position_ids,t.rope_deltas]=this.get_rope_index(t.input_ids,t.image_grid_thw,t.video_grid_thw,t.attention_mask);else{t.pixel_values=null;let e=t.past_key_values.get_seq_length();if(en+e);t.position_ids=du([r,r,r],0)}}return t}},Qb=class extends Zb{},$b=class extends Zb{image_grid_thw_name=`image_grid_thw`},ex=class extends Qb{image_grid_thw_name=`image_grid_thw`},tx=class extends $b{get_vision_position_ids(e,t,n,r){let i=Math.floor(t[0]/n),a=Math.floor(t[1]/r),o=Math.floor(t[2]/r),s=a*o*i,c=Array.from({length:s},()=>e),l=Array.from({length:s},(t,n)=>e+Math.floor(n/(o*i))),u=Array.from({length:s},(t,n)=>e+n%o);return[...c,...l,...u]}_get_multimodal_rope_positions({filtered_ids:e,image_grid_thw_list:t,video_grid_thw_list:n,spatial_merge_size:r,state:i}){let{image_token_id:a}=this.config,o=[],s=0,c=+(e[0]==a);for(let t=1;t<=e.length;++t){let n=tl+n%e)),l+=e}else{let e=t[i.image_index++].map(Number),n=e[0];u.push(this.get_vision_position_ids(l,e,n,r)),l+=Math.max(e[1],e[2])/r}return u}},nx=class extends X{},rx=class extends nx{},ix=class extends nx{},ax=class extends X{},ox=class extends ax{},sx=class extends ax{},cx=class extends X{},lx=class extends cx{},ux=class extends cx{},dx=class extends X{},fx=class extends dx{},px=class extends dx{},mx=class extends X{},hx=class extends mx{},gx=class extends mx{},_x=class extends X{},vx=class extends _x{},yx=class extends _x{},bx=class extends X{},xx=class extends bx{},Sx=class extends bx{},Cx=class extends X{},wx=class extends Cx{},Tx=class extends Cx{},Ex=class extends X{},Dx=class extends Ex{},Ox=class extends Ex{},kx=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`audio_values`,`past_key_values`]},Ax=class extends kx{_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.ignore_index??this.config.audio_token_id??this.config.audio_token_index,...e,audio_features:n})}},jx=class extends Ax{forward_params=[`input_ids`,`attention_mask`,`input_features`,`past_key_values`]},Mx=class extends X{},Nx=class extends Mx{},Px=class extends X{},Fx=class extends Px{},Ix=class extends X{},Lx=class extends Ix{},Rx=class extends Ix{},zx=class extends X{},Bx=class extends zx{},Vx=class extends zx{async _call(e){return new J(await super._call(e))}},Hx=class extends X{},Ux=class extends Hx{},Wx=class extends Hx{forward_params=[`input_ids`,`attention_mask`,`token_type_ids`,`past_key_values`];prepare_inputs_for_generation(e,t,n){let r=Bg(this,e,t,n);return r.token_type_ids=(r.past_key_values?Su:bu)(r.input_ids),r}},Gx=class extends X{},Kx=class extends Gx{},qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},Jx=class extends Gx{async _call(e){return new J(await super._call(e))}},Yx=class extends Gx{async _call(e){return new Ph(await super._call(e))}},Xx=class extends X{},Zx=class extends Gx{},Qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},$x=class extends Gx{async _call(e){return new J(await super._call(e))}},eS=class extends X{},tS=class extends eS{},nS=class extends eS{},rS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`position_ids`,`past_key_values`]},iS=class extends X{},aS=class extends iS{},oS=class extends iS{async _call(e){return new J(await super._call(e))}},sS=class extends X{},cS=class extends sS{},lS=class extends sS{},uS=class extends X{},dS=class extends uS{async forward(e){let t=!e.input_ids,n=!e.pixel_values;if(t&&n)throw Error("Either `input_ids` or `pixel_values` should be provided.");if(t&&(e.input_ids=yu([e.pixel_values.dims[0],1])),n){let{image_size:t}=this.config.vision_config;e.pixel_values=_u([0,3,t,t],0)}let{text_embeddings:r,image_embeddings:i,l2norm_text_embeddings:a,l2norm_image_embeddings:o}=await super.forward(e),s={};return t||(s.text_embeddings=r,s.l2norm_text_embeddings=a),n||(s.image_embeddings=i,s.l2norm_image_embeddings=o),s}},fS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},pS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},mS=class extends X{},hS=class extends mS{},gS=class extends mS{},_S=class extends Mb{},vS=class extends X{},yS=class extends vS{},bS=class extends vS{},xS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`spatial_shapes`,`position_ids`,`past_key_values`]},SS=class extends X{},CS=class extends SS{},wS=class extends SS{},TS=class extends X{},ES=class extends TS{},DS=class extends X{},OS=class extends DS{},kS=class extends DS{},AS=class extends X{},jS=class extends AS{},MS=class extends AS{},NS=class extends X{},PS=class extends NS{},FS=class extends NS{},IS=class extends X{},LS=class extends IS{},RS=class extends IS{},zS=class extends X{},BS=class extends zS{},VS=class extends zS{},HS=class extends zS{async _call(e){return new J(await super._call(e))}},US=class extends zS{},WS=class extends X{},GS=class extends WS{},KS=class extends X{},qS=class extends KS{},JS=class extends Mh{constructor({char_logits:e,bpe_logits:t,wp_logits:n}){super(),this.char_logits=e,this.bpe_logits=t,this.wp_logits=n}get logits(){return[this.char_logits,this.bpe_logits,this.wp_logits]}},YS=class extends X{},XS=class extends YS{async _call(e){return new JS(await super._call(e))}},ZS=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},QS=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},$S=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},eC=class extends $S{async encode(e){return new ZS(await q(this.sessions.encoder_model,e))}async decode(e){return new QS(await q(this.sessions.decoder_model,e))}},tC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},nC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},rC=class extends X{},iC=class extends rC{},aC=class extends rC{},oC=class extends X{},sC=class extends oC{},cC=class extends oC{},lC=class extends X{},uC=class extends lC{},dC=class extends lC{},fC=class extends Mb{},pC=class extends X{},mC=class extends pC{},hC=class extends pC{},gC=class extends X{},_C=class extends gC{},vC=class extends gC{async _call(e){return new Fh(await super._call(e))}},yC=class extends gC{async _call(e){return new J(await super._call(e))}},bC=class extends gC{async _call(e){return new Ih(await super._call(e))}},xC=class extends X{},SC=class extends xC{},CC=class extends xC{},wC=class extends X{},TC=class extends wC{},EC=class extends wC{async _call(e){return new J(await super._call(e))}},DC=class extends wC{},OC=class extends X{},kC=class extends OC{},AC=class extends OC{async _call(e){return new J(await super._call(e))}},jC=class extends OC{},MC=class extends X{},NC=class extends MC{},PC=class extends MC{async _call(e){return new J(await super._call(e))}},FC=class extends MC{},IC=class extends X{},LC=class extends IC{},RC=class extends IC{async _call(e){return new J(await super._call(e))}},zC=class extends IC{},BC=class extends X{},VC=class extends BC{},HC=class extends BC{async _call(e){return new J(await super._call(e))}},UC=class extends X{},WC=class extends UC{},GC=class extends UC{async _call(e){return new J(await super._call(e))}},KC=class extends X{},qC=class extends KC{},JC=class extends KC{async _call(e){return new Fh(await super._call(e))}},YC=class extends KC{async _call(e){return new J(await super._call(e))}},XC=class extends KC{async _call(e){return new Ph(await super._call(e))}},ZC=class extends X{},QC=class extends ZC{},$C=class extends ZC{},ew=class extends X{requires_attention_mask=!1;main_input_name=`input_values`;forward_params=[`input_values`,`decoder_input_ids`,`past_key_values`]},tw=class extends ew{},nw=class extends ew{},rw=class extends X{},iw=class extends rw{},aw=class extends rw{async _call(e){return new Fh(await super._call(e))}},ow=class extends rw{async _call(e){return new J(await super._call(e))}},sw=class extends rw{async _call(e){return new Ph(await super._call(e))}},cw=class extends rw{async _call(e){return new Ih(await super._call(e))}},lw=class extends X{},uw=class extends lw{},dw=class extends lw{},fw=class extends X{},pw=class extends fw{},mw=class extends fw{},hw=class extends X{},gw=class extends hw{forward_params=[`input_ids`,`pixel_values`,`images_seq_mask`,`images_emb_mask`,`attention_mask`,`position_ids`,`past_key_values`];constructor(...e){super(...e),this._generation_mode=`text`}async forward(e){let t=this._generation_mode??`text`,n;if(t===`text`||!e.past_key_values){let t=this.sessions.prepare_inputs_embeds;n=await q(t,ci(e,t.inputNames))}else{let t=this.sessions.gen_img_embeds;n=await q(t,ci({image_ids:e.input_ids},t.inputNames))}let r={...e,...n},i=await Pg(this,r),a=this.sessions[t===`text`?`lm_head`:`gen_head`];if(!a)throw Error(`Unable to find "${a}" generation head`);let o=await q(a,ci(i,a.inputNames));return{...n,...i,...o}}prepare_inputs_for_generation(e,t,n){let r=!!t.past_key_values;return Ng(this,t,1n),n.guidance_scale!==null&&n.guidance_scale>1&&(r?t.input_ids=H([t.input_ids,t.input_ids],0):(t.input_ids=H([t.input_ids,vu(t.input_ids,BigInt(n.pad_token_id))],0),t.attention_mask=H([t.attention_mask,vu(t.attention_mask,0n)],0))),(r||!t.pixel_values)&&(t.pixel_values=_u([0,0,3,384,384],1)),r&&(t.images_seq_mask=new V(`bool`,[,].fill(!0).fill(!1,0,1),[1,1]),t.images_emb_mask=new V(`bool`,[].fill(!1),[1,1,0])),t}async generate(e){return this._generation_mode=`text`,super.generate(e)}async generate_images(e){this._generation_mode=`image`;let t=(e.inputs??e[this.main_input_name]).dims[1],n=(await super.generate(e)).slice(null,[t,null]),r=this.sessions.image_decode,{decoded_image:i}=await q(r,{generated_tokens:n}),a=i.add_(1).mul_(255/2).clamp_(0,255).to(`uint8`),o=[];for(let e of a){let t=Vf.fromTensor(e);o.push(t)}return o}},_w=class extends X{},vw=class extends _w{},yw=class extends _w{},bw=class extends X{forward_params=[`input_ids`,`attention_mask`,`encoder_outputs`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`];_apply_and_filter_by_delay_pattern_mask(e){let[t,n]=e.dims,r=this.config.decoder.num_codebooks,i=n-r,a=0;for(let t=0;t0&&o<=i&&(e.data[a++]=e.data[t])}let o=Math.floor(t/r),s=a/(o*r);return new V(e.type,e.data.slice(0,a),[o,r,s])}prepare_inputs_for_generation(e,t,n){let r=BigInt(this.config.decoder.pad_token_id),i=structuredClone(e);for(let e=0;e=t&&(i[e][t]=r);return n.guidance_scale!==null&&n.guidance_scale>1&&(i=i.concat(i)),Vg(this,i,t,n)}async generate(e){let t=await super.generate(e),n=this._apply_and_filter_by_delay_pattern_mask(t).unsqueeze_(0),{audio_values:r}=await q(this.sessions.encodec_decode,{audio_codes:n});return r}},xw=class extends X{},Sw=class extends xw{},Cw=class extends xw{},ww=class extends X{},Tw=class extends ww{},Ew=class extends ww{},Dw=class extends X{},Ow=class extends Dw{},kw=class extends Dw{async _call(e){return new Fh(await super._call(e))}},Aw=class extends Dw{async _call(e){return new J(await super._call(e))}},jw=class extends Dw{async _call(e){return new Ph(await super._call(e))}},Mw=class extends Dw{async _call(e){return new Ih(await super._call(e))}},Nw=class extends X{},Pw=class extends Nw{},Fw=class extends X{},Iw=class extends Fw{},Lw=class extends Fw{},Rw=class extends X{},zw=class extends Rw{},Bw=class extends Rw{},Vw=class extends X{},Hw=class extends Vw{},Uw=class extends Vw{},Ww=class extends X{},Gw=class extends Ww{},Kw=class extends Ww{},qw=class extends X{},Jw=class extends qw{},Yw=class extends qw{async _call(e){return new J(await super._call(e))}},Xw=class extends X{},Zw=class extends Xw{},Qw=class extends Xw{},$w=class extends X{},eT=class extends $w{},tT=class extends $w{},nT=class extends X{},rT=class extends nT{},iT=class extends nT{},aT=class extends X{},oT=class extends aT{},sT=class extends aT{},cT=class extends Mb{},lT=class extends X{},uT=class extends lT{async _call(e){return new Lh(await super._call(e))}},dT=class extends X{},fT=class extends dT{},pT=class extends dT{},mT=class extends X{},hT=class extends mT{},gT=class extends mT{},_T=class extends X{},vT=class extends _T{},yT=class extends _T{},bT=class extends X{},xT=class extends bT{},ST=class extends bT{},CT=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`pixel_values`,`image_sizes`,`past_key_values`]},wT=class extends CT{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,image_sizes:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,...u}){if(!a){let t;if(n&&e.dims[1]!==1){if(!r)throw Error("`image_sizes` must be provided when `pixel_values` is provided.");({image_features:t}=await q(this.sessions.vision_encoder,{pixel_values:n,image_sizes:r}))}else{let e=this.config.normalized_config.hidden_size;t=new V(`float32`,[],[0,e])}({inputs_embeds:a}=await q(this.sessions.prepare_inputs_embeds,{input_ids:e,image_features:t}))}return await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,position_ids:i,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1)}},TT=class extends X{},ET=class extends TT{},DT=class extends TT{async _call(e){return new J(await super._call(e))}},OT=class extends X{},kT=class extends OT{},AT=class extends OT{async _call(e){return new Ph(await super._call(e))}},jT=class extends X{},MT=class extends jT{},NT=class extends jT{},PT=class extends X{},FT=class extends PT{},IT=class extends PT{},LT=class extends X{},RT=class extends LT{},zT=class extends LT{},BT=class extends X{},VT=class extends BT{},HT=class extends BT{},UT=class extends X{},WT=class extends UT{},GT=class extends UT{},KT=class extends $b{},qT=class extends ex{},JT=class extends KT{},YT=class extends qT{},XT=class extends KT{},ZT=class extends XT{},QT=class extends XT{},$T=class extends ZT{},eE=class extends X{},tE=class extends eE{},nE=class extends eE{async _call(e){return new J(await super._call(e))}},rE=class extends X{},iE=class extends rE{},aE=class extends rE{async _call(e){return new oE(await super._call(e))}},oE=class extends Nv{},sE=class extends X{},cE=class extends sE{},lE=class extends sE{async _call(e){return new Fh(await super._call(e))}},uE=class extends sE{async _call(e){return new J(await super._call(e))}},dE=class extends sE{async _call(e){return new Ph(await super._call(e))}},fE=class extends sE{async _call(e){return new Ih(await super._call(e))}},pE=class extends X{},mE=class extends pE{},hE=class extends pE{async _call(e){return new Fh(await super._call(e))}},gE=class extends pE{async _call(e){return new J(await super._call(e))}},_E=class extends pE{async _call(e){return new Ph(await super._call(e))}},vE=class extends pE{async _call(e){return new Ih(await super._call(e))}},yE=class extends X{},bE=class extends yE{},xE=class extends yE{async _call(e){return new SE(await super._call(e))}},SE=class extends Nv{},CE=class extends Mh{constructor({iou_scores:e,pred_masks:t}){super(),this.iou_scores=e,this.pred_masks=t}},wE=class extends X{},TE=class extends wE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){e=!e.image_embeddings||!e.image_positional_embeddings?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_labels??=yu(e.input_points.dims.slice(0,-1));let t={image_embeddings:e.image_embeddings,image_positional_embeddings:e.image_positional_embeddings};return e.input_points&&(t.input_points=e.input_points),e.input_labels&&(t.input_labels=e.input_labels),e.input_boxes&&(t.input_boxes=e.input_boxes),await q(this.sessions.prompt_encoder_mask_decoder,t)}async _call(e){return new CE(await super._call(e))}},EE=class extends Mh{constructor({iou_scores:e,pred_masks:t,object_score_logits:n}){super(),this.iou_scores=e,this.pred_masks=t,this.object_score_logits=n}},DE=class extends X{},OE=class extends DE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){let{num_feature_levels:t}=this.config.vision_config;if(e=Array.from({length:t},(e,t)=>`image_embeddings.${t}`).some(t=>!e[t])?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_points){if(e.input_boxes&&e.input_boxes.dims[1]!==1)throw Error("When both `input_points` and `input_boxes` are provided, the number of boxes per image must be 1.");let t=e.input_points.dims;e.input_labels??=yu(t.slice(0,-1)),e.input_boxes??=_u([t[0],0,4],0)}else if(e.input_boxes){let t=e.input_boxes.dims;e.input_labels=_u([t[0],t[1],0],-1n),e.input_points=_u([t[0],1,0,2],0)}else throw Error("At least one of `input_points` or `input_boxes` must be provided.");let n=this.sessions.prompt_encoder_mask_decoder;return await q(n,ci(e,n.inputNames))}async _call(e){return new EE(await super._call(e))}},kE=class extends OE{},AE=class extends OE{},jE=class extends X{},ME=class extends jE{},NE=class extends jE{},PE=class extends jE{},FE=class extends X{},IE=class extends FE{},LE=class extends FE{},RE=class extends FE{},zE=class extends X{},BE=class extends zE{},VE=class extends zE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},HE=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},UE=class extends X{},WE=class extends UE{},GE=class extends UE{},KE=class extends rS{},qE=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},JE=class extends qE{async encode(e){return await q(this.sessions.encoder_model,e)}async decode(e){return await q(this.sessions.decoder_model,e)}},YE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},XE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},ZE=class extends X{},QE=class extends ZE{},$E=class extends ZE{},eD=class extends X{},tD=class extends eD{},nD=class extends eD{},rD=class extends eD{async generate_speech(e,t,{threshold:n=.5,minlenratio:r=0,maxlenratio:i=20,vocoder:a=null}={}){let o={input_ids:e},{encoder_outputs:s,encoder_attention_mask:c}=await Dg(this,o),l=s.dims[1]/this.config.reduction_factor,u=Math.floor(l*i),d=Math.floor(l*r),f=this.config.num_mel_bins,p=[],m=null,h=null,g=0;for(;;){++g;let e=bg(!!h),r;r=h?h.output_sequence_out:new V(`float32`,new Float32Array(f),[1,1,f]);let i={use_cache_branch:e,output_sequence:r,encoder_attention_mask:c,speaker_embeddings:t,encoder_hidden_states:s};Mg(this,i,m),h=await q(this.sessions.decoder_model_merged,i),m=kg(h,m);let{prob:a,spectrum:o}=h;if(p.push(o),g>=d&&(Array.from(a.data).filter(e=>e>=n).length>0||g>=u))break}let _=H(p),{waveform:v}=await q(a.sessions.model,{spectrogram:_});return{spectrogram:_,waveform:v}}},iD=class extends X{main_input_name=`spectrogram`},aD=class extends X{},oD=class extends aD{},sD=class extends aD{async _call(e){return new Fh(await super._call(e))}},cD=class extends aD{async _call(e){return new J(await super._call(e))}},lD=class extends aD{async _call(e){return new Ih(await super._call(e))}},uD=class extends X{},dD=class extends uD{},fD=class extends uD{},pD=class extends X{},mD=class extends pD{},hD=class extends pD{},gD=class extends X{},_D=class extends gD{},vD=class extends X{},yD=class extends vD{async generate_speech({input_ids:e,attention_mask:t,style:n,num_inference_steps:r=5,speed:i=1.05}){let{sampling_rate:a,chunk_compress_factor:o,base_chunk_size:s,latent_dim:c}=this.config,{last_hidden_state:l,durations:u}=await q(this.sessions.text_encoder,{input_ids:e,attention_mask:t,style:n}),d=u.div(i).mul_(a),f=s*o,p=d.data,m=Int32Array.from(p,e=>Math.ceil(e/f)),h=Math.max(...m),g=e.dims[0],_=new BigInt64Array(g*h);for(let e=0;ee*t,1),r=Ql[e.type];c[e.name]=new V(e.type,new r(n),t)}let f=Ql[d],p=new V(d,new f(s*dO),[1,s,dO]),m=t[Symbol.asyncIterator]?.()??t[Symbol.iterator]?.();if(!m)throw Error(`input_features must be iterable or async iterable`);return{encoder_session:i,enc_kv_cache:c,enc_padding_cache:p,enc_past_seq_len:0,audio_embed_queue:[],audio_embed_total_tokens:0,audio_queue_offset:0,audio_consumed:0,stream_exhausted:!1,chunks_iter:m,text_hidden_size:n.hidden_size}}async function hO(e,t){let n=t.dims[2],r=Math.floor((fO+n-3)/2)+1,i=new V(`int64`,BigInt64Array.from({length:r},(t,n)=>BigInt(e.enc_past_seq_len+n)),[1,r]),a=e.enc_past_seq_len+r,o=yu([1,a]),{audio_embeds:s,present_padding_cache:c,...l}=await q(e.encoder_session,{input_features:t,attention_mask:o,position_ids:i,past_padding_cache:e.enc_padding_cache,...e.enc_kv_cache});e.enc_padding_cache.location===`gpu-buffer`&&e.enc_padding_cache.dispose(),e.enc_padding_cache=c;for(let t in l)if(t.startsWith(`present.`)){let n=t.replace(`present`,`past_key_values`),r=e.enc_kv_cache[n];r?.location===`gpu-buffer`&&r.dispose(),e.enc_kv_cache[n]=l[t]}return e.enc_past_seq_len=a,s}async function gO(e,t){for(;e.audio_embed_total_tokens0&&e.audio_embed_queue.length>0;){let t=e.audio_embed_queue[0],n=t.tokens-e.audio_queue_offset,o=Math.min(a,n),s=e.audio_queue_offset*e.text_hidden_size;for(let n=0;n=t.tokens&&(e.audio_embed_queue.shift(),e.audio_queue_offset=0)}e.audio_consumed+=n-a}var vO=class extends rg{constructor(e){super(),this._s=e}_call(e){let t=this._s.stream_exhausted&&this._s.audio_embed_queue.length===0;return e.map(()=>t)}},yO=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`]},bO=class extends yO{async forward({input_ids:e,past_key_values:t,...n}){let r=e.dims[1],i=pO.get(this);i&&await gO(i,i.audio_consumed+r);let{inputs_embeds:a}=await q(this.sessions.embed_tokens,{input_ids:e});i&&_O(i,a,r);let o={inputs_embeds:a,...n};Mg(this,o,t);let s=this.sessions.decoder_model_merged;return await q(s,ci(o,s.inputNames))}async generate({input_features:e,stopping_criteria:t,...n}){if(!e)throw Error(`input_features (generator/iterable) must be provided`);let r=mO(this,e);pO.set(this,r);let i=new ig;i.push(new vO(r)),t&&i.extend(t);try{return await super.generate({...n,stopping_criteria:i})}finally{r.enc_kv_cache.dispose(),pO.delete(this)}}},xO=class extends X{},SO=class extends xO{},CO=class extends xO{async _call(e){return new Lh(await super._call(e))}},wO=class extends xO{async _call(e){return new J(await super._call(e))}},TO=class extends Mh{constructor({logits:e,embeddings:t}){super(),this.logits=e,this.embeddings=t}},EO=class extends X{},DO=class extends EO{},OO=class extends EO{async _call(e){return new Lh(await super._call(e))}},kO=class extends EO{async _call(e){return new J(await super._call(e))}},AO=class extends EO{async _call(e){return new TO(await super._call(e))}},jO=class extends EO{async _call(e){return new Ph(await super._call(e))}},MO=class extends X{},NO=class extends MO{},PO=class extends ng{return_timestamps=null;return_token_timestamps=null;num_frames=null;alignment_heads=null;task=null;language=null;no_timestamps_token_id=null;prompt_ids=null;is_multilingual=null;lang_to_id=null;task_to_id=null;max_initial_timestamp_index=1},FO=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`attention_mask`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},IO=class extends FO{},LO=class extends FO{_prepare_generation_config(e,t){return super._prepare_generation_config(e,t,PO)}_retrieve_init_tokens(e){let t=[e.decoder_start_token_id],n=e.language,r=e.task;if(e.is_multilingual){n||=(A.warn(`No language specified - defaulting to English (en).`),`en`);let i=`<|${Dd(n)}|>`;t.push(e.lang_to_id[i]),t.push(e.task_to_id[r??`transcribe`])}else if(n||r)throw Error("Cannot specify `task` or `language` for an English-only model. If the model is intended to be multilingual, pass `is_multilingual=true` to generate, or update the generation config.");return!e.return_timestamps&&e.no_timestamps_token_id&&t.at(-1)!==e.no_timestamps_token_id?t.push(e.no_timestamps_token_id):e.return_timestamps&&t.at(-1)===e.no_timestamps_token_id&&(A.warn("<|notimestamps|> prompt token is removed from generation_config since `return_timestamps` is set to `true`."),t.pop()),t.filter(e=>e!=null)}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,...i}){t=this._prepare_generation_config(t,i);let a=i.decoder_input_ids instanceof V?Du(i.decoder_input_ids):i.decoder_input_ids??this._retrieve_init_tokens(t);if(t.return_timestamps&&(n??=new Uh,n.push(new Jh(t,a))),t.begin_suppress_tokens&&(n??=new Uh,n.push(new qh(t.begin_suppress_tokens,a.length))),t.return_token_timestamps){if(!t.alignment_heads)throw Error("Model generation config has no `alignment_heads`, token-level timestamps not available. See https://gist.github.com/hollance/42e32852f24243b748ae6bc1f985b13a on how to add this property to the generation config.");t.task===`translate`&&A.warn(`Token-level timestamps may not be reliable for task 'translate'.`),t.output_attentions=!0,t.return_dict_in_generate=!0}if(t.return_timestamps&&!i.max_new_tokens)return this._generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:a,kwargs:i});let o=await super.generate({inputs:e,generation_config:t,logits_processor:n,decoder_input_ids:a,...i});return t.return_token_timestamps&&(o.token_timestamps=this._extract_token_timestamps(o,t.alignment_heads,t.num_frames,.02,a.length)),o}async _generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:r,kwargs:i}){let a=t.no_timestamps_token_id+1,o=Array.isArray(t.eos_token_id)?t.eos_token_id[0]:t.eos_token_id,s=t.return_token_timestamps,c=e,l=c.dims[2],u=2*this.config.max_source_positions,d=0,f=[],p=[];for(;de+n)}if(v.length>0&&v.at(-1)===o&&v.pop(),v.length===0)break;let b=v.map(e=>e>=a),x=v.length>=2&&b[v.length-1]&&!b[v.length-2],S=[];for(let e=0;e0){if(x)C=e-d;else{let e=S.at(-1);C=(v[e-1]-a)*2,ee=e}}else C=e-d;let w=Math.floor(d/2),te=a+1500;for(let e=0;e=a&&(v[e]=Math.min(v[e]+w,te));f.push(...v.slice(0,ee)),y&&p.push(...y.slice(0,ee)),d+=C}f.push(o);let m=[...r,...f];if(s){let e=new V(`int64`,m.map(BigInt),[1,m.length]),t=[...Array(r.length).fill(0),...p,0];return{sequences:e,token_timestamps:new V(`float32`,new Float32Array(t),[1,t.length])}}return new V(`int64`,m.map(BigInt),[1,m.length])}_extract_token_timestamps(e,t,n=null,r=.02,i=0){if(!e.cross_attentions)throw Error("Model outputs must contain cross attentions to extract timestamps. This is most likely because the model was not exported with `output_attentions=True`.");n??A.warn("`num_frames` has not been set, meaning the entire audio will be analyzed. This may lead to inaccurate token-level timestamps for short audios (< 30 seconds).");let a=this.config.median_filter_width;a===void 0&&(A.warn("Model config has no `median_filter_width`, using default value of 7."),a=7);let o=e.cross_attentions,s=Array.from({length:this.config.decoder_layers},(e,t)=>H(o.map(e=>e[t]),2)),c=du(t.map(([e,t])=>{if(e>=s.length)throw Error(`Layer index ${e} is out of bounds for cross attentions (length ${s.length}).`);return n?s[e].slice(null,t,null,[0,n]):s[e].slice(null,t)})).permute(1,0,2,3),[l,u]=pu(c,-2,0,!0),d=c.clone();for(let e=0;e0?d.slice(null,null,[i,d.dims[2]],null):d,1)],p=e.sequences.dims,m=new V(`float32`,new Float32Array(p[0]*p[1]),p);for(let e=0;et[n+1]-t[n])).map(e=>!!e),o=[];for(let e=0;e0&&s.push(o.at(-1)),m[e].data.set(s)}return m}},RO=class extends LO{},zO=class extends X{},BO=class extends zO{},VO=class extends zO{async _call(e){return new Fh(await super._call(e))}},HO=class extends zO{async _call(e){return new J(await super._call(e))}},UO=class extends zO{async _call(e){return new Ph(await super._call(e))}},WO=class extends zO{async _call(e){return new Ih(await super._call(e))}},GO=class extends X{},KO=class extends GO{},qO=class extends GO{async _call(e){return new Fh(await super._call(e))}},JO=class extends GO{async _call(e){return new J(await super._call(e))}},YO=class extends GO{async _call(e){return new Ph(await super._call(e))}},XO=class extends GO{async _call(e){return new Ih(await super._call(e))}},ZO=class extends X{},QO=class extends ZO{},$O=class extends ZO{async _call(e){return new ek(await super._call(e))}},ek=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},tk=class extends X{},nk=class extends tk{},rk=class extends tk{},ik=class extends X{},ak=class extends ik{},ok=class extends ik{},sk=/* @__PURE__ */ new Map([[`bert`,`BertModel`],[`eurobert`,`EuroBertModel`],[`neobert`,`NeoBertModel`],[`modernbert`,`ModernBertModel`],[`nomic_bert`,`NomicBertModel`],[`roformer`,`RoFormerModel`],[`electra`,`ElectraModel`],[`esm`,`EsmModel`],[`convbert`,`ConvBertModel`],[`camembert`,`CamembertModel`],[`deberta`,`DebertaModel`],[`deberta-v2`,`DebertaV2Model`],[`mpnet`,`MPNetModel`],[`albert`,`AlbertModel`],[`distilbert`,`DistilBertModel`],[`roberta`,`RobertaModel`],[`xlm`,`XLMModel`],[`xlm-roberta`,`XLMRobertaModel`],[`clap`,`ClapModel`],[`clip`,`CLIPModel`],[`clipseg`,`CLIPSegModel`],[`chinese_clip`,`ChineseCLIPModel`],[`siglip`,`SiglipModel`],[`jina_clip`,`JinaCLIPModel`],[`mobilebert`,`MobileBertModel`],[`squeezebert`,`SqueezeBertModel`],[`wav2vec2`,`Wav2Vec2Model`],[`wav2vec2-bert`,`Wav2Vec2BertModel`],[`unispeech`,`UniSpeechModel`],[`unispeech-sat`,`UniSpeechSatModel`],[`hubert`,`HubertModel`],[`wavlm`,`WavLMModel`],[`audio-spectrogram-transformer`,`ASTModel`],[`vits`,`VitsModel`],[`pyannote`,`PyAnnoteModel`],[`wespeaker-resnet`,`WeSpeakerResNetModel`],[`detr`,`DetrModel`],[`rt_detr`,`RTDetrModel`],[`rt_detr_v2`,`RTDetrV2Model`],[`rf_detr`,`RFDetrModel`],[`d_fine`,`DFineModel`],[`table-transformer`,`TableTransformerModel`],[`vit`,`ViTModel`],[`ijepa`,`IJepaModel`],[`pvt`,`PvtModel`],[`vit_msn`,`ViTMSNModel`],[`vit_mae`,`ViTMAEModel`],[`groupvit`,`GroupViTModel`],[`fastvit`,`FastViTModel`],[`mobilevit`,`MobileViTModel`],[`mobilevitv2`,`MobileViTV2Model`],[`owlvit`,`OwlViTModel`],[`owlv2`,`Owlv2Model`],[`beit`,`BeitModel`],[`deit`,`DeiTModel`],[`hiera`,`HieraModel`],[`convnext`,`ConvNextModel`],[`convnextv2`,`ConvNextV2Model`],[`dinov2`,`Dinov2Model`],[`dinov2_with_registers`,`Dinov2WithRegistersModel`],[`dinov3_vit`,`DINOv3ViTModel`],[`dinov3_convnext`,`DINOv3ConvNextModel`],[`resnet`,`ResNetModel`],[`swin`,`SwinModel`],[`swin2sr`,`Swin2SRModel`],[`donut-swin`,`DonutSwinModel`],[`yolos`,`YolosModel`],[`dpt`,`DPTModel`],[`glpn`,`GLPNModel`],[`hifigan`,`SpeechT5HifiGan`],[`efficientnet`,`EfficientNetModel`],[`decision_transformer`,`DecisionTransformerModel`],[`patchtst`,`PatchTSTModel`],[`patchtsmixer`,`PatchTSMixerModel`],[`mobilenet_v1`,`MobileNetV1Model`],[`mobilenet_v2`,`MobileNetV2Model`],[`mobilenet_v3`,`MobileNetV3Model`],[`mobilenet_v4`,`MobileNetV4Model`],[`maskformer`,`MaskFormerModel`],[`mgp-str`,`MgpstrForSceneTextRecognition`],[`style_text_to_speech_2`,`StyleTextToSpeech2Model`],[`openai_privacy_filter`,`OpenAIPrivacyFilterModel`]]),ck=/* @__PURE__ */ new Map([[`t5`,`T5Model`],[`longt5`,`LongT5Model`],[`mt5`,`MT5Model`],[`bart`,`BartModel`],[`mbart`,`MBartModel`],[`marian`,`MarianModel`],[`whisper`,`WhisperModel`],[`cohere_asr`,`CohereAsrModel`],[`m2m_100`,`M2M100Model`],[`blenderbot`,`BlenderbotModel`],[`blenderbot-small`,`BlenderbotSmallModel`]]),lk=/* @__PURE__ */ new Map([[`mimi`,`MimiModel`],[`dac`,`DacModel`],[`snac`,`SnacModel`]]),uk=/* @__PURE__ */ new Map([[`bloom`,`BloomModel`],[`jais`,`JAISModel`],[`gpt2`,`GPT2Model`],[`gpt_oss`,`GptOssModel`],[`gptj`,`GPTJModel`],[`gpt_bigcode`,`GPTBigCodeModel`],[`gpt_neo`,`GPTNeoModel`],[`gpt_neox`,`GPTNeoXModel`],[`codegen`,`CodeGenModel`],[`llama`,`LlamaModel`],[`apertus`,`ApertusModel`],[`nanochat`,`NanoChatModel`],[`arcee`,`ArceeModel`],[`afmoe`,`AfmoeModel`],[`lfm2`,`Lfm2Model`],[`lfm2_moe`,`Lfm2MoeModel`],[`smollm3`,`SmolLM3Model`],[`exaone`,`ExaoneModel`],[`olmo`,`OlmoModel`],[`olmo2`,`Olmo2Model`],[`olmo3`,`Olmo3Model`],[`olmo_hybrid`,`OlmoHybridModel`],[`mobilellm`,`MobileLLMModel`],[`granite`,`GraniteModel`],[`granitemoehybrid`,`GraniteMoeHybridModel`],[`cohere`,`CohereModel`],[`cohere2`,`Cohere2Model`],[`gemma`,`GemmaModel`],[`gemma2`,`Gemma2Model`],[`vaultgemma`,`VaultGemmaModel`],[`gemma3_text`,`Gemma3Model`],[`helium`,`HeliumModel`],[`glm`,`GlmModel`],[`glm_moe_dsa`,`GlmMoeDsaModel`],[`openelm`,`OpenELMModel`],[`qwen2`,`Qwen2Model`],[`qwen2_moe`,`Qwen2MoeModel`],[`qwen3`,`Qwen3Model`],[`qwen3_moe`,`Qwen3MoeModel`],[`qwen3_next`,`Qwen3NextModel`],[`phi`,`PhiModel`],[`phi3`,`Phi3Model`],[`mpt`,`MptModel`],[`opt`,`OPTModel`],[`mistral`,`MistralModel`],[`mistral4`,`Mistral4Model`],[`ministral`,`MinistralModel`],[`ministral3`,`Ministral3Model`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2Model`],[`deepseek_v3`,`DeepseekV3Model`],[`deepseek_v4`,`DeepseekV4Model`],[`falcon`,`FalconModel`],[`falcon_h1`,`FalconH1Model`],[`nemotron_h`,`NemotronHModel`],[`solar_open`,`SolarOpenModel`],[`stablelm`,`StableLmModel`],[`modernbert-decoder`,`ModernBertDecoderModel`],[`hunyuan_v1_dense`,`HunYuanDenseV1Model`],[`youtu`,`YoutuModel`],[`zaya`,`ZayaModel`],[`hrm_text`,`HrmTextModel`]]),dk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForSpeechToText`],[`whisper`,`WhisperForConditionalGeneration`],[`lite-whisper`,`LiteWhisperForConditionalGeneration`],[`moonshine`,`MoonshineForConditionalGeneration`],[`cohere_asr`,`CohereAsrForConditionalGeneration`]]),fk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForTextToSpeech`]]),pk=/* @__PURE__ */ new Map([[`vits`,`VitsModel`],[`musicgen`,`MusicgenForConditionalGeneration`],[`supertonic`,`SupertonicForConditionalGeneration`]]),mk=/* @__PURE__ */ new Map([[`bert`,`BertForSequenceClassification`],[`eurobert`,`EuroBertForSequenceClassification`],[`neobert`,`NeoBertForSequenceClassification`],[`modernbert`,`ModernBertForSequenceClassification`],[`roformer`,`RoFormerForSequenceClassification`],[`electra`,`ElectraForSequenceClassification`],[`esm`,`EsmForSequenceClassification`],[`convbert`,`ConvBertForSequenceClassification`],[`camembert`,`CamembertForSequenceClassification`],[`deberta`,`DebertaForSequenceClassification`],[`deberta-v2`,`DebertaV2ForSequenceClassification`],[`mpnet`,`MPNetForSequenceClassification`],[`albert`,`AlbertForSequenceClassification`],[`distilbert`,`DistilBertForSequenceClassification`],[`roberta`,`RobertaForSequenceClassification`],[`xlm`,`XLMForSequenceClassification`],[`xlm-roberta`,`XLMRobertaForSequenceClassification`],[`bart`,`BartForSequenceClassification`],[`mbart`,`MBartForSequenceClassification`],[`mobilebert`,`MobileBertForSequenceClassification`],[`squeezebert`,`SqueezeBertForSequenceClassification`]]),hk=/* @__PURE__ */ new Map([[`bert`,`BertForTokenClassification`],[`eurobert`,`EuroBertForTokenClassification`],[`neobert`,`NeoBertForTokenClassification`],[`modernbert`,`ModernBertForTokenClassification`],[`roformer`,`RoFormerForTokenClassification`],[`electra`,`ElectraForTokenClassification`],[`esm`,`EsmForTokenClassification`],[`convbert`,`ConvBertForTokenClassification`],[`camembert`,`CamembertForTokenClassification`],[`deberta`,`DebertaForTokenClassification`],[`deberta-v2`,`DebertaV2ForTokenClassification`],[`mpnet`,`MPNetForTokenClassification`],[`distilbert`,`DistilBertForTokenClassification`],[`roberta`,`RobertaForTokenClassification`],[`xlm`,`XLMForTokenClassification`],[`xlm-roberta`,`XLMRobertaForTokenClassification`],[`openai_privacy_filter`,`OpenAIPrivacyFilterForTokenClassification`]]),gk=/* @__PURE__ */ new Map([[`t5`,`T5ForConditionalGeneration`],[`longt5`,`LongT5ForConditionalGeneration`],[`mt5`,`MT5ForConditionalGeneration`],[`bart`,`BartForConditionalGeneration`],[`mbart`,`MBartForConditionalGeneration`],[`marian`,`MarianMTModel`],[`m2m_100`,`M2M100ForConditionalGeneration`],[`blenderbot`,`BlenderbotForConditionalGeneration`],[`blenderbot-small`,`BlenderbotSmallForConditionalGeneration`]]),_k=/* @__PURE__ */ new Map([[`bloom`,`BloomForCausalLM`],[`gpt2`,`GPT2LMHeadModel`],[`gpt_oss`,`GptOssForCausalLM`],[`jais`,`JAISLMHeadModel`],[`gptj`,`GPTJForCausalLM`],[`gpt_bigcode`,`GPTBigCodeForCausalLM`],[`gpt_neo`,`GPTNeoForCausalLM`],[`gpt_neox`,`GPTNeoXForCausalLM`],[`codegen`,`CodeGenForCausalLM`],[`llama`,`LlamaForCausalLM`],[`nanochat`,`NanoChatForCausalLM`],[`apertus`,`ApertusForCausalLM`],[`llama4_text`,`Llama4ForCausalLM`],[`arcee`,`ArceeForCausalLM`],[`afmoe`,`AfmoeForCausalLM`],[`lfm2`,`Lfm2ForCausalLM`],[`lfm2_moe`,`Lfm2MoeForCausalLM`],[`smollm3`,`SmolLM3ForCausalLM`],[`exaone`,`ExaoneForCausalLM`],[`olmo`,`OlmoForCausalLM`],[`olmo2`,`Olmo2ForCausalLM`],[`olmo3`,`Olmo3ForCausalLM`],[`olmo_hybrid`,`OlmoHybridForCausalLM`],[`mobilellm`,`MobileLLMForCausalLM`],[`granite`,`GraniteForCausalLM`],[`granitemoehybrid`,`GraniteMoeHybridForCausalLM`],[`cohere`,`CohereForCausalLM`],[`cohere2`,`Cohere2ForCausalLM`],[`gemma`,`GemmaForCausalLM`],[`gemma2`,`Gemma2ForCausalLM`],[`vaultgemma`,`VaultGemmaForCausalLM`],[`gemma3_text`,`Gemma3ForCausalLM`],[`gemma3`,`Gemma3ForCausalLM`],[`helium`,`HeliumForCausalLM`],[`glm`,`GlmForCausalLM`],[`glm_moe_dsa`,`GlmMoeDsaForCausalLM`],[`openelm`,`OpenELMForCausalLM`],[`qwen2`,`Qwen2ForCausalLM`],[`qwen2_moe`,`Qwen2MoeForCausalLM`],[`qwen3`,`Qwen3ForCausalLM`],[`qwen3_moe`,`Qwen3MoeForCausalLM`],[`qwen3_next`,`Qwen3NextForCausalLM`],[`qwen2_vl`,`Qwen2VLForCausalLM`],[`qwen2_5_vl`,`Qwen2_5_VLForCausalLM`],[`qwen3_vl`,`Qwen3VLForCausalLM`],[`qwen3_vl_moe`,`Qwen3VLMoeForCausalLM`],[`qwen3_5`,`Qwen3_5ForCausalLM`],[`qwen3_5_text`,`Qwen3_5ForCausalLM`],[`qwen3_5_moe`,`Qwen3_5MoeForCausalLM`],[`gemma3n`,`Gemma3nForCausalLM`],[`gemma4`,`Gemma4ForCausalLM`],[`phi`,`PhiForCausalLM`],[`phi3`,`Phi3ForCausalLM`],[`mpt`,`MptForCausalLM`],[`opt`,`OPTForCausalLM`],[`mbart`,`MBartForCausalLM`],[`mistral`,`MistralForCausalLM`],[`mistral4`,`Mistral4ForCausalLM`],[`ministral`,`MinistralForCausalLM`],[`ministral3`,`Ministral3ForCausalLM`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2ForCausalLM`],[`deepseek_v3`,`DeepseekV3ForCausalLM`],[`deepseek_v4`,`DeepseekV4ForCausalLM`],[`falcon`,`FalconForCausalLM`],[`falcon_h1`,`FalconH1ForCausalLM`],[`nemotron_h`,`NemotronHForCausalLM`],[`trocr`,`TrOCRForCausalLM`],[`solar_open`,`SolarOpenForCausalLM`],[`stablelm`,`StableLmForCausalLM`],[`modernbert-decoder`,`ModernBertDecoderForCausalLM`],[`hunyuan_v1_dense`,`HunYuanDenseV1ForCausalLM`],[`youtu`,`YoutuForCausalLM`],[`zaya`,`ZayaForCausalLM`],[`hrm_text`,`HrmTextForCausalLM`],[`phi3_v`,`Phi3VForCausalLM`]]),vk=/* @__PURE__ */ new Map([[`multi_modality`,`MultiModalityCausalLM`]]),yk=/* @__PURE__ */ new Map([[`bert`,`BertForMaskedLM`],[`eurobert`,`EuroBertForMaskedLM`],[`neobert`,`NeoBertForMaskedLM`],[`modernbert`,`ModernBertForMaskedLM`],[`roformer`,`RoFormerForMaskedLM`],[`electra`,`ElectraForMaskedLM`],[`esm`,`EsmForMaskedLM`],[`convbert`,`ConvBertForMaskedLM`],[`camembert`,`CamembertForMaskedLM`],[`deberta`,`DebertaForMaskedLM`],[`deberta-v2`,`DebertaV2ForMaskedLM`],[`mpnet`,`MPNetForMaskedLM`],[`albert`,`AlbertForMaskedLM`],[`distilbert`,`DistilBertForMaskedLM`],[`roberta`,`RobertaForMaskedLM`],[`xlm`,`XLMWithLMHeadModel`],[`xlm-roberta`,`XLMRobertaForMaskedLM`],[`mobilebert`,`MobileBertForMaskedLM`],[`squeezebert`,`SqueezeBertForMaskedLM`]]),bk=/* @__PURE__ */ new Map([[`bert`,`BertForQuestionAnswering`],[`neobert`,`NeoBertForQuestionAnswering`],[`roformer`,`RoFormerForQuestionAnswering`],[`electra`,`ElectraForQuestionAnswering`],[`convbert`,`ConvBertForQuestionAnswering`],[`camembert`,`CamembertForQuestionAnswering`],[`deberta`,`DebertaForQuestionAnswering`],[`deberta-v2`,`DebertaV2ForQuestionAnswering`],[`mpnet`,`MPNetForQuestionAnswering`],[`albert`,`AlbertForQuestionAnswering`],[`distilbert`,`DistilBertForQuestionAnswering`],[`roberta`,`RobertaForQuestionAnswering`],[`xlm`,`XLMForQuestionAnswering`],[`xlm-roberta`,`XLMRobertaForQuestionAnswering`],[`mobilebert`,`MobileBertForQuestionAnswering`],[`squeezebert`,`SqueezeBertForQuestionAnswering`]]),xk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`]]),Sk=/* @__PURE__ */ new Map([[`llava`,`LlavaForConditionalGeneration`],[`llava_onevision`,`LlavaOnevisionForConditionalGeneration`],[`moondream1`,`Moondream1ForConditionalGeneration`],[`florence2`,`Florence2ForConditionalGeneration`],[`qwen2_vl`,`Qwen2VLForConditionalGeneration`],[`qwen2_5_vl`,`Qwen2_5_VLForConditionalGeneration`],[`qwen3_vl`,`Qwen3VLForConditionalGeneration`],[`qwen3_vl_moe`,`Qwen3VLMoeForConditionalGeneration`],[`qwen3_5`,`Qwen3_5ForConditionalGeneration`],[`qwen3_5_moe`,`Qwen3_5MoeForConditionalGeneration`],[`lfm2_vl`,`Lfm2VlForConditionalGeneration`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`],[`paligemma`,`PaliGemmaForConditionalGeneration`],[`llava_qwen2`,`LlavaQwen2ForCausalLM`],[`gemma3`,`Gemma3ForConditionalGeneration`],[`gemma3n`,`Gemma3nForConditionalGeneration`],[`gemma4`,`Gemma4ForConditionalGeneration`],[`mistral3`,`Mistral3ForConditionalGeneration`],[`lighton_ocr`,`LightOnOcrForConditionalGeneration`],[`glm_ocr`,`GlmOcrForConditionalGeneration`]]),Ck=/* @__PURE__ */ new Map([[`granite_speech`,`GraniteSpeechForConditionalGeneration`],[`ultravox`,`UltravoxModel`],[`voxtral`,`VoxtralForConditionalGeneration`],[`voxtral_realtime`,`VoxtralRealtimeForConditionalGeneration`]]),wk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`]]),Tk=/* @__PURE__ */ new Map([[`vit`,`ViTForImageClassification`],[`ijepa`,`IJepaForImageClassification`],[`pvt`,`PvtForImageClassification`],[`vit_msn`,`ViTMSNForImageClassification`],[`fastvit`,`FastViTForImageClassification`],[`mobilevit`,`MobileViTForImageClassification`],[`mobilevitv2`,`MobileViTV2ForImageClassification`],[`beit`,`BeitForImageClassification`],[`deit`,`DeiTForImageClassification`],[`hiera`,`HieraForImageClassification`],[`convnext`,`ConvNextForImageClassification`],[`convnextv2`,`ConvNextV2ForImageClassification`],[`dinov2`,`Dinov2ForImageClassification`],[`dinov2_with_registers`,`Dinov2WithRegistersForImageClassification`],[`resnet`,`ResNetForImageClassification`],[`swin`,`SwinForImageClassification`],[`segformer`,`SegformerForImageClassification`],[`efficientnet`,`EfficientNetForImageClassification`],[`mobilenet_v1`,`MobileNetV1ForImageClassification`],[`mobilenet_v2`,`MobileNetV2ForImageClassification`],[`mobilenet_v3`,`MobileNetV3ForImageClassification`],[`mobilenet_v4`,`MobileNetV4ForImageClassification`]]),Ek=/* @__PURE__ */ new Map([[`detr`,`DetrForObjectDetection`],[`rt_detr`,`RTDetrForObjectDetection`],[`rt_detr_v2`,`RTDetrV2ForObjectDetection`],[`rf_detr`,`RFDetrForObjectDetection`],[`d_fine`,`DFineForObjectDetection`],[`table-transformer`,`TableTransformerForObjectDetection`],[`yolos`,`YolosForObjectDetection`]]),Dk=/* @__PURE__ */ new Map([[`owlvit`,`OwlViTForObjectDetection`],[`owlv2`,`Owlv2ForObjectDetection`],[`grounding-dino`,`GroundingDinoForObjectDetection`]]),Ok=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`clipseg`,`CLIPSegForImageSegmentation`]]),kk=/* @__PURE__ */ new Map([[`segformer`,`SegformerForSemanticSegmentation`],[`sapiens`,`SapiensForSemanticSegmentation`],[`swin`,`SwinForSemanticSegmentation`],[`mobilenet_v1`,`MobileNetV1ForSemanticSegmentation`],[`mobilenet_v2`,`MobileNetV2ForSemanticSegmentation`],[`mobilenet_v3`,`MobileNetV3ForSemanticSegmentation`],[`mobilenet_v4`,`MobileNetV4ForSemanticSegmentation`]]),Ak=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`maskformer`,`MaskFormerForInstanceSegmentation`]]),jk=/* @__PURE__ */ new Map([[`sam`,`SamModel`],[`sam2`,`Sam2Model`],[`edgetam`,`EdgeTamModel`],[`sam3_tracker`,`Sam3TrackerModel`]]),Mk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForCTC`],[`wav2vec2-bert`,`Wav2Vec2BertForCTC`],[`unispeech`,`UniSpeechForCTC`],[`unispeech-sat`,`UniSpeechSatForCTC`],[`wavlm`,`WavLMForCTC`],[`hubert`,`HubertForCTC`],[`parakeet_ctc`,`ParakeetForCTC`]]),Nk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForSequenceClassification`],[`wav2vec2-bert`,`Wav2Vec2BertForSequenceClassification`],[`unispeech`,`UniSpeechForSequenceClassification`],[`unispeech-sat`,`UniSpeechSatForSequenceClassification`],[`wavlm`,`WavLMForSequenceClassification`],[`hubert`,`HubertForSequenceClassification`],[`audio-spectrogram-transformer`,`ASTForAudioClassification`]]),Pk=/* @__PURE__ */ new Map([[`wavlm`,`WavLMForXVector`]]),Fk=/* @__PURE__ */ new Map([[`unispeech-sat`,`UniSpeechSatForAudioFrameClassification`],[`wavlm`,`WavLMForAudioFrameClassification`],[`wav2vec2`,`Wav2Vec2ForAudioFrameClassification`],[`pyannote`,`PyAnnoteForAudioFrameClassification`]]),Ik=/* @__PURE__ */ new Map([[`vitmatte`,`VitMatteForImageMatting`]]),Lk=/* @__PURE__ */ new Map([[`patchtst`,`PatchTSTForPrediction`],[`patchtsmixer`,`PatchTSMixerForPrediction`]]),Rk=/* @__PURE__ */ new Map([[`swin2sr`,`Swin2SRForImageSuperResolution`]]),zk=/* @__PURE__ */ new Map([[`chmv2`,`CHMv2ForDepthEstimation`],[`dpt`,`DPTForDepthEstimation`],[`depth_anything`,`DepthAnythingForDepthEstimation`],[`glpn`,`GLPNForDepthEstimation`],[`sapiens`,`SapiensForDepthEstimation`],[`depth_pro`,`DepthProForDepthEstimation`],[`metric3d`,`Metric3DForDepthEstimation`],[`metric3dv2`,`Metric3Dv2ForDepthEstimation`]]),Bk=/* @__PURE__ */ new Map([[`sapiens`,`SapiensForNormalEstimation`]]),Vk=/* @__PURE__ */ new Map([[`vitpose`,`VitPoseForPoseEstimation`]]),Hk=/* @__PURE__ */ new Map([[`clip`,`CLIPVisionModelWithProjection`],[`siglip`,`SiglipVisionModel`],[`jina_clip`,`JinaCLIPVisionModel`]]),Uk=[[sk,Y.EncoderOnly],[ck,Y.EncoderDecoder],[uk,Y.DecoderOnlyWithoutHead],[lk,Y.AutoEncoder],[mk,Y.EncoderOnly],[hk,Y.EncoderOnly],[gk,Y.Seq2Seq],[dk,Y.Seq2Seq],[_k,Y.DecoderOnly],[vk,Y.MultiModality],[yk,Y.EncoderOnly],[bk,Y.EncoderOnly],[xk,Y.Vision2Seq],[Sk,Y.ImageTextToText],[Ck,Y.AudioTextToText],[Tk,Y.EncoderOnly],[Ok,Y.EncoderOnly],[Ak,Y.EncoderOnly],[kk,Y.EncoderOnly],[Ik,Y.EncoderOnly],[Lk,Y.EncoderOnly],[Rk,Y.EncoderOnly],[zk,Y.EncoderOnly],[Bk,Y.EncoderOnly],[Vk,Y.EncoderOnly],[Ek,Y.EncoderOnly],[Dk,Y.EncoderOnly],[jk,Y.MaskGeneration],[Mk,Y.EncoderOnly],[Nk,Y.EncoderOnly],[fk,Y.Seq2Seq],[pk,Y.EncoderOnly],[Pk,Y.EncoderOnly],[Fk,Y.EncoderOnly],[Hk,Y.EncoderOnly]];for(let[e,t]of Uk)for(let n of e.values()){Cg.set(n,t);let e=qg[n];Tg.set(e,n),wg.set(n,e)}var Wk=[[`MusicgenForConditionalGeneration`,bw,Y.Musicgen],[`Phi3VForCausalLM`,wT,Y.Phi3V],[`CLIPTextModelWithProjection`,ev,Y.EncoderOnly],[`SiglipTextModel`,VE,Y.EncoderOnly],[`JinaCLIPTextModel`,fS,Y.EncoderOnly],[`ClapTextModelWithProjection`,Y_,Y.EncoderOnly],[`ClapAudioModelWithProjection`,X_,Y.EncoderOnly],[`DacEncoderModel`,Vv,Y.EncoderOnly],[`DacDecoderModel`,Hv,Y.EncoderOnly],[`MimiEncoderModel`,tC,Y.EncoderOnly],[`MimiDecoderModel`,nC,Y.EncoderOnly],[`SnacEncoderModel`,YE,Y.EncoderOnly],[`SnacDecoderModel`,XE,Y.EncoderOnly],[`Gemma3nForConditionalGeneration`,Bb,Y.ImageAudioTextToText],[`Gemma4ForConditionalGeneration`,Hb,Y.ImageAudioTextToText],[`SupertonicForConditionalGeneration`,yD,Y.Supertonic],[`ChatterboxModel`,H_,Y.Chatterbox],[`VoxtralRealtimeForConditionalGeneration`,bO,Y.VoxtralRealtime]];for(let[e,t,n]of Wk)Cg.set(e,n),Tg.set(t,e),wg.set(e,t);var Gk=/* @__PURE__ */ new Map([[`modnet`,Ok],[`birefnet`,Ok],[`isnet`,Ok],[`ben`,Ok]]);for(let[e,t]of Gk.entries())t.set(e,`PreTrainedModel`),Cg.set(e,Y.EncoderOnly),wg.set(e,X);var Kk=new Set(Gk.keys());Cg.set(`PreTrainedModel`,Y.EncoderOnly),Tg.set(X,`PreTrainedModel`);var Z={MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES:mk,MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES:hk,MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES:fk,MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES:pk,MODEL_FOR_MASKED_LM_MAPPING_NAMES:yk,MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES:bk,MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES:Tk,MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES:Ok,MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES:kk,MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES:Ak,MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES:Ek,MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES:Dk,MODEL_FOR_MASK_GENERATION_MAPPING_NAMES:jk,MODEL_FOR_CTC_MAPPING_NAMES:Mk,MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES:Nk,MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES:Pk,MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES:Fk,MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES:wk,MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES:Ik,MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES:Rk,MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES:zk,MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES:Bk,MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES:Vk,MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES:Hk,MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES:Sk,MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES:Ck,MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES:gk,MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES:dk,MODEL_FOR_CAUSAL_LM_MAPPING_NAMES:_k,MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES:xk};vg(Z);var Q=class{static MODEL_CLASS_MAPPINGS=null;static BASE_IF_FAIL=!1;static supports(e){if(!this.MODEL_CLASS_MAPPINGS)return!1;for(let t of this.MODEL_CLASS_MAPPINGS)if(t.has(e))return!0;return this.BASE_IF_FAIL}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d};if(f.config=await Ch.from_pretrained(e,f),!this.MODEL_CLASS_MAPPINGS)throw Error("`MODEL_CLASS_MAPPINGS` not implemented for this type of `AutoClass`: "+this.name);let{model_type:p}=f.config;for(let t of this.MODEL_CLASS_MAPPINGS){let n=t.get(p);if(!n){for(let e of t.values())if(e[0]===p){n=e;break}if(!n)continue}return await qg[n].from_pretrained(e,f)}if(this.BASE_IF_FAIL)return Kk.has(p)||A.warn(`Unknown model class "${p}", attempting to construct from base class.`),await X.from_pretrained(e,f);throw Error(`Unsupported model type: ${p}`)}},qk=class extends Q{static MODEL_CLASS_MAPPINGS=Uk.map(e=>e[0]);static BASE_IF_FAIL=!0},Jk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES]},Yk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES]},Xk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES]},Zk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES]},Qk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES]},$k=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES]},eA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES]},tA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASKED_LM_MAPPING_NAMES]},nA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES]},rA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES]},iA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES]},aA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES]},oA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES]},sA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES]},cA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES]},lA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASK_GENERATION_MAPPING_NAMES]});var uA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CTC_MAPPING_NAMES]},dA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES]};var fA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES]});var pA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES]},mA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES]};var hA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES]};async function gA(e){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>Vf.read(e)))}async function _A(e,t){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>typeof e==`string`||e instanceof URL?Wd(e,t):e instanceof Float64Array?new Float32Array(e):e))}function vA(e,t){t&&(e=e.map(e=>e|0));let[n,r,i,a]=e;return{xmin:n,ymin:r,xmax:i,ymax:a}}var yA=class extends $r{constructor({task:e,model:t,tokenizer:n=null,processor:r=null}){super(),this.task=e,this.model=t,this.tokenizer=n,this.processor=r}async dispose(){await this.model.dispose()}},bA=class extends yA{async _call(e,{top_k:t=1}={}){let n=this.tokenizer(e,{padding:!0,truncation:!0}),r=await this.model(n),{problem_type:i,id2label:a}=this.model.config,o=i===`multi_label_classification`?e=>e.sigmoid():e=>new V(`float32`,ol(e.data),e.dims),s=[];for(let e of r.logits){let n=await iu(o(e),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));t===1?s.push(...i):s.push(i)}return Array.isArray(e)||t===1?s:s[0]}},xA=class extends yA{async _call(e,{ignore_labels:t=[`O`],aggregation_strategy:n=`none`}={}){if(n!==`none`&&n!==`simple`)throw Error(`Invalid aggregation_strategy: "${n}". Must be one of "none" or "simple".`);let r=Array.isArray(e),i=this.tokenizer(r?e:[e],{padding:!0,truncation:!0}),a=(await this.model(i)).logits,o=this.model.config.id2label,s=[];for(let e=0;e{let o=0,s=[];for(let n=i;ne==u),i=a[e].tolist(),f=o[e].tolist();for(let n=1;ne==t[n])!==-1)&&(i[n]=-1/0,f[n]=-1/0);let p=ol(i).map((e,t)=>[e,t]),m=ol(f).map((e,t)=>[e,t]);p[0][0]=0,m[0][0]=0;let h=oi(p,m).filter(e=>e[0][1]<=e[1][1]).map(e=>[e[0][1],e[1][1],e[0][0]*e[1][0]]).sort((e,t)=>t[2]-e[2]),g=[];for(let e=0;ee==n);if(c===-1)throw Error(`Mask token (${r}) not found in text.`);let l=a[e][c],u=await iu(new V(`float32`,ol(l.data),l.dims),t),d=u[0].tolist(),f=u[1].tolist();o.push(f.map((e,t)=>{let n=i.slice();return n[c]=e,{score:d[t],token:Number(e),token_str:this.tokenizer.decode([e]),sequence:this.tokenizer.decode(n,{skip_special_tokens:!0})}}))}return Array.isArray(e)?o:o[0]}},EA=class extends yA{_default_generation_config={max_new_tokens:256};_key=`generated_text`;async _call(e,t={}){Array.isArray(e)||(e=[e]),this.model.config.prefix&&(e=e.map(e=>this.model.config.prefix+e));let n=this.model.config.task_specific_params;n&&n[this.task]&&n[this.task].prefix&&(e=e.map(e=>n[this.task].prefix+e));let r=this.tokenizer,i={padding:!0,truncation:!0},a;a=this.task===`translation`&&`_build_translation_inputs`in r?r._build_translation_inputs(e,i,t):r(e,i);let o=await this.model.generate({...a,...this._default_generation_config,...t});return r.batch_decode(o,{skip_special_tokens:!0}).map(e=>({[this._key]:e}))}},DA=class extends EA{_key=`summary_text`},OA=class extends EA{_key=`translation_text`};function kA(e){return Array.isArray(e)&&e.every(e=>`role`in e&&`content`in e)}var AA=class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t={}){let{add_special_tokens:n,return_full_text:r,tools:i,documents:a,chat_template:o,tokenizer_encode_kwargs:s,...c}=t,l=!1,u=!1,d=n??(this.tokenizer.add_bos_token||this.tokenizer.add_eos_token)??!1,f=s,p;if(typeof e==`string`)p=e=[e];else if(Array.isArray(e)&&e.every(e=>typeof e==`string`))l=!0,p=e;else{if(kA(e))e=[e];else if(Array.isArray(e)&&e.every(kA))l=!0;else throw Error(`Input must be a string, an array of strings, a Chat, or an array of Chats`);u=!0;let t={tokenize:!1,add_generation_prompt:!0,...ci({tools:i,documents:a,chat_template:o},[`tools`,`documents`,`chat_template`]),...f};p=e.map(e=>this.tokenizer.apply_chat_template(e,t)),d=!1,f=void 0}let m=u?!1:r??!0;this.tokenizer.padding_side=`left`;let h=this.tokenizer(p,{add_special_tokens:d,padding:!0,truncation:!0,...f}),g=await this.model.generate({...h,...this._default_generation_config,...c}),_=this.tokenizer.batch_decode(g,{skip_special_tokens:!0}),v;!m&&h.input_ids.dims.at(-1)>0&&(v=this.tokenizer.batch_decode(h.input_ids,{skip_special_tokens:!0}).map(e=>e.length));let y=Array.from({length:e.length},e=>[]);for(let t=0;t<_.length;++t){let n=Math.floor(t/g.dims[0]*e.length);v&&(_[t]=_[t].slice(v[n])),y[n].push({generated_text:u?[...e[n],{role:`assistant`,content:_[t]}]:_[t]})}return!l&&y.length===1?y[0]:y}},jA=class extends yA{constructor(e){super(e),this.label2id=Object.fromEntries(Object.entries(this.model.config.label2id).map(([e,t])=>[e.toLowerCase(),t])),this.entailment_id=this.label2id.entailment,this.entailment_id===void 0&&(A.warn(`Could not find 'entailment' in label2id mapping. Using 2 as entailment_id.`),this.entailment_id=2),this.contradiction_id=this.label2id.contradiction??this.label2id.not_entailment,this.contradiction_id===void 0&&(A.warn(`Could not find 'contradiction' in label2id mapping. Using 0 as contradiction_id.`),this.contradiction_id=0)}async _call(e,t,{hypothesis_template:n=`This example is {}.`,multi_label:r=!1}={}){let i=Array.isArray(e);i||(e=[e]),Array.isArray(t)||(t=[t]);let a=t.map(e=>n.replace(`{}`,e)),o=r||t.length===1,s=[];for(let n of e){let e=[];for(let t of a){let r=this.tokenizer(n,{text_pair:t,padding:!0,truncation:!0}),i=await this.model(r);o?e.push([i.logits.data[this.contradiction_id],i.logits.data[this.entailment_id]]):e.push(i.logits.data[this.entailment_id])}let r=(o?e.map(e=>ol(e)[1]):ol(e)).map((e,t)=>[e,t]).sort((e,t)=>t[0]-e[0]);s.push({sequence:n,labels:r.map(e=>t[e[1]]),scores:r.map(e=>e[0])})}return i?s:s[0]}},MA=class extends yA{async _call(e,{top_k:t=5}={}){let n=this.processor.feature_extractor.config.sampling_rate,r=await _A(e,n),i=this.model.config.id2label,a=[];for(let e of r){let n=await this.processor(e),r=(await this.model(n)).logits[0],o=await iu(new V(`float32`,ol(r.data),r.dims),t),s=o[0].tolist(),c=o[1].tolist().map((e,t)=>({label:i?i[e]:`LABEL_${e}`,score:s[t]}));a.push(c)}return Array.isArray(e)?a:a[0]}},NA=class extends yA{async _call(e,t,{hypothesis_template:n=`This is a sound of {}.`}={}){let r=!Array.isArray(e);r&&(e=[e]);let i=t.map(e=>n.replace(`{}`,e)),a=this.tokenizer(i,{padding:!0,truncation:!0}),o=this.processor.feature_extractor.config.sampling_rate,s=await _A(e,o),c=[];for(let e of s){let n=await this.processor(e),r=ol((await this.model({...a,...n})).logits_per_audio.data);c.push([...r].map((e,n)=>({score:e,label:t[n]})))}return r?c[0]:c}},PA=class extends yA{_default_generation_config={};async _call(e,t={}){switch(t={...this._default_generation_config,...t},this.model.config.model_type){case`whisper`:case`lite-whisper`:return this._call_whisper(e,t);case`wav2vec2`:case`wav2vec2-bert`:case`unispeech`:case`unispeech-sat`:case`hubert`:case`parakeet_ctc`:return this._call_wav2vec2(e,t);case`moonshine`:return this._call_moonshine(e,t);case`cohere_asr`:return this._call_cohere_asr(e,t);default:throw Error(`AutomaticSpeechRecognitionPipeline does not support model type '${this.model.config.model_type}'.`)}}async _call_wav2vec2(e,t){t.language&&A.warn('`language` parameter is not yet supported for `wav2vec2` models, defaulting to "English".'),t.task&&A.warn('`task` parameter is not yet supported for `wav2vec2` models, defaulting to "transcribe".');let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let t=await this.processor(e),n=(await this.model(t)).logits[0],r=[];for(let e of n)r.push(ll(e.data)[1]);let i=this.tokenizer.decode(r,{skip_special_tokens:!0}).trim();o.push({text:i})}return n?o[0]:o}async _call_whisper(e,t){let n=t.return_timestamps??!1,r=t.chunk_length_s??0,i=t.force_full_sequences??!1,a=t.stride_length_s??null,o={...t};n===`word`&&(o.return_token_timestamps=!0,o.return_timestamps=!0);let s=!Array.isArray(e),c=s?[e]:e,l=this.processor.feature_extractor.config,u=l.chunk_length/this.model.config.max_source_positions,d=l.hop_length,f=l.sampling_rate,p=await _A(c,f),m=[];for(let e of p){let t=[];if(r>0){if(a===null)a=r/6;else if(r<=a)throw Error("`chunk_length_s` must be larger than `stride_length_s`.");let n=f*r,i=f*a,o=n-2*i,s=0;for(;;){let r=s+n,a=e.subarray(s,r),c=await this.processor(a),l=s===0,u=r>=e.length;if(t.push({stride:[a.length,l?0:i,u?0:i],input_features:c.input_features,is_last:u}),u)break;s+=o}}else t=[{stride:[e.length,0,0],input_features:(await this.processor(e)).input_features,is_last:!0}];for(let e of t){o.num_frames=Math.floor(e.stride[0]/d);let t=await this.model.generate({inputs:e.input_features,...o});if(n===`word`){let n=t.sequences.tolist()[0],r=t.token_timestamps.tolist()[0],i=this.tokenizer.timestamp_begin,a=Math.max(n.findIndex(e=>Number(e)>=i),0);e.tokens=n.slice(a),e.token_timestamps=r.slice(a).map(e=>hl(e,2))}else e.tokens=t[0].tolist();e.stride=e.stride.map(e=>e/f)}let[s,c]=this.tokenizer._decode_asr(t,{time_precision:u,return_timestamps:n,force_full_sequences:i});m.push({text:s,...c})}return s?m[0]:m}async _call_moonshine(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let n=await this.processor(e),r=Math.floor(e.length/i)*6,a=await this.model.generate({max_new_tokens:r,...t,...n}),s=this.tokenizer.batch_decode(a,{skip_special_tokens:!0})[0];o.push({text:s})}return n?o[0]:o}async _call_cohere_asr(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor,a=i.config.sampling_rate,o=await _A(r,a),s=t.language??`en`,c=this.processor.get_decoder_prompt_ids(s),l=[];for(let e of o){let n=i.split_audio(e),r=[];for(let e of n){let n=await this.processor(e),i=await this.model.generate({...n,decoder_input_ids:c,...t}),a=this.tokenizer.decode(i[0].tolist(),{skip_special_tokens:!0}).trim();r.push(a)}let a=this.processor.constructor.join_chunks(r,s);l.push({text:a})}return n?l[0]:l}},FA=class extends yA{DEFAULT_VOCODER_ID=`Xenova/speecht5_hifigan`;constructor(e){super(e),this.vocoder=e.vocoder??null}async _prepare_speaker_embeddings(e,t){if((typeof e==`string`||e instanceof URL)&&(e=new Float32Array(await(await k.fetch(e)).arrayBuffer())),e instanceof Float32Array)e=new V(`float32`,e,[e.length]);else if(!(e instanceof V))throw Error("Speaker embeddings must be a `Tensor`, `Float32Array`, `string`, or `URL`.");if(t>1){if(e.dims[0]===1)e=e.repeat(t,1);else if(e.dims[0]!==t)throw Error(`Expected speaker embeddings batch size to be 1 or ${t}, but got ${e.dims[0]}.`)}return e}_postprocess_waveform(e,t,n,r=null){let i=t.data,[a,o]=t.dims,s=r?r.data:null,c=[];for(let e=0;e({generated_text:e.trim()}));a.push(r)}return n?a:a[0]}},LA=class extends yA{async _call(e,{top_k:t=5}={}){let n=await gA(e),{pixel_values:r}=await this.processor(n),i=await this.model({pixel_values:r}),{id2label:a}=this.model.config,o=[];for(let e of i.logits){let n=await iu(new V(`float32`,ol(e.data),e.dims),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));o.push(i)}return Array.isArray(e)?o:o[0]}},RA={panoptic:`post_process_panoptic_segmentation`,instance:`post_process_instance_segmentation`,semantic:`post_process_semantic_segmentation`},zA=class extends yA{async _call(e,{threshold:t=.5,mask_threshold:n=.5,overlap_mask_area_threshold:r=.8,label_ids_to_fuse:i=null,target_sizes:a=null,subtask:o=null}={}){if(Array.isArray(e)&&e.length!==1)throw Error(`Image segmentation pipeline currently only supports a batch size of 1.`);let s=await gA(e),c=s.map(e=>[e.height,e.width]),l=await this.processor(s),{inputNames:u,outputNames:d}=this.model.sessions.model;if(!u.includes(`pixel_values`)){if(u.length!==1)throw Error(`Expected a single input name, but got ${u.length} inputs: ${u}.`);let e=u[0];if(e in l)throw Error(`Input name ${e} already exists in the inputs.`);l[e]=l.pixel_values}let f=await this.model(l),p=null;if(o!==null)p=RA[o];else if(this.processor.image_processor){for(let[e,t]of Object.entries(RA))if(t in this.processor.image_processor){p=this.processor.image_processor[t].bind(this.processor.image_processor),o=e;break}}let m=this.model.config.id2label,h=[];if(!o){let e=f[d[0]];for(let t=0;te<-1e-5||e>1.00001)&&r.sigmoid_();let i=await Vf.fromTensor(r.mul_(255).to(`uint8`)).resize(n[1],n[0]);h.push({label:null,score:null,mask:i})}}else if(o===`panoptic`||o===`instance`){let e=p(f,t,n,r,i,a??c)[0],o=e.segmentation;for(let t of e.segments_info){let e=new Uint8ClampedArray(o.data.length);for(let n=0;n{let n=e.clone();return n.putAlpha(r[t].mask),n});return Array.isArray(e)?i:i[0]}},model:[aA,oA,sA],default:{model:`Xenova/modnet`},type:`image`},"zero-shot-image-classification":{pipeline:class extends yA{async _call(e,t,{hypothesis_template:n=`This is a photo of {}`}={}){let r=Array.isArray(e),i=await gA(e),a=t.map(e=>n.replace(`{}`,e)),o=this.tokenizer(a,{padding:this.model.config.model_type!==`siglip`||`max_length`,truncation:!0}),{pixel_values:s}=await this.processor(i),c=await this.model({...o,pixel_values:s}),l=this.model.config.model_type===`siglip`?e=>e.sigmoid().data:e=>ol(e.data),u=[];for(let e of c.logits_per_image){let n=[...l(e)].map((e,n)=>({score:e,label:t[n]}));n.sort((e,t)=>t.score-e.score),u.push(n)}return r?u:u[0]}},model:qk,default:{model:`Xenova/clip-vit-base-patch32`},type:`multimodal`},"object-detection":{pipeline:class extends yA{async _call(e,{threshold:t=.9,percentage:n=!1}={}){let r=Array.isArray(e);if(r&&e.length!==1)throw Error(`Object detection pipeline currently only supports a batch size of 1.`);let i=await gA(e),a=n?null:i.map(e=>[e.height,e.width]),{pixel_values:o,pixel_mask:s}=await this.processor(i),c=await this.model({pixel_values:o,pixel_mask:s}),l=this.processor.image_processor.post_process_object_detection(c,t,a),{id2label:u}=this.model.config,d=l.map(e=>e.boxes.map((t,r)=>({score:e.scores[r],label:u[e.classes[r]],box:vA(t,!n)})));return r?d:d[0]}},model:cA,default:{model:`Xenova/detr-resnet-50`},type:`multimodal`},"zero-shot-object-detection":{pipeline:class extends yA{async _call(e,t,{threshold:n=.1,top_k:r=null,percentage:i=!1}={}){let a=Array.isArray(e),o=await gA(e),s=this.tokenizer(t,{padding:!0,truncation:!0}),c=await this.processor(o),l=[];for(let e=0;e({score:e.scores[n],label:e.labels[n],box:vA(t,!i)}))}else{let e=this.processor.image_processor.post_process_object_detection(f,n,u,!0)[0];p=e.boxes.map((n,r)=>({score:e.scores[r],label:t[e.classes[r]],box:vA(n,!i)}))}p.sort((e,t)=>t.score-e.score),r!==null&&(p=p.slice(0,r)),l.push(p)}return a?l:l[0]}},model:lA,default:{model:`Xenova/owlvit-base-patch32`},type:`multimodal`},"document-question-answering":{pipeline:class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t,n={}){if(Array.isArray(e)){if(e.length!==1)throw Error(`Document Question Answering pipeline currently only supports a batch size of 1.`);e=e[0]}let r=(await gA(e))[0],{pixel_values:i}=await this.processor(r),a=`${t}`,o=this.tokenizer(a,{add_special_tokens:!1,padding:!0,truncation:!0}).input_ids,s=await this.model.generate({inputs:i,max_length:this.model.config.decoder.max_position_embeddings,decoder_input_ids:o,...this._default_generation_config,...n}),c=this.tokenizer.batch_decode(s)[0].match(/(.*?)<\/s_answer>/),l=null;return c&&c.length>=2&&(l=c[1].trim()),[{answer:l}]}},model:fA,default:{model:`Xenova/donut-base-finetuned-docvqa`},type:`multimodal`},"image-to-image":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),r=await this.model(n),i=[];for(let e of r.reconstruction){let t=e.squeeze().clamp_(0,1).mul_(255).round_().to(`uint8`);i.push(Vf.fromTensor(t))}return Array.isArray(e)?i:i[0]}},model:pA,default:{model:`Xenova/swin2SR-classical-sr-x2-64`},type:`image`},"depth-estimation":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),{predicted_depth:r}=await this.model(n),i=[];for(let e=0;et).sort((e,t)=>o[t]-o[e]).slice(0,r).map(e=>({index:e,score:o[e]}))}const WA={amp:`&`,lt:`<`,gt:`>`,quot:`"`,apos:`'`,nbsp:` `,hellip:`…`,mdash:`—`,ndash:`–`,laquo:`«`,raquo:`»`,middot:`·`,deg:`°`,times:`×`,euro:`€`,pound:`£`,reg:`®`,copy:`©`,bull:`•`,trade:`™`,rsquo:`’`,lsquo:`‘`,ldquo:`“`,rdquo:`”`};function GA(e){return typeof e!=`string`||!e?``:e.replace(/<[^>]*>/g,` `).replace(/&#x([0-9a-f]+);/gi,(e,t)=>KA(parseInt(t,16))).replace(/&#(\d+);/g,(e,t)=>KA(parseInt(t,10))).replace(/&([a-z]+);/gi,(e,t)=>WA[t.toLowerCase()]??e).replace(/\s+/g,` `).trim()}function KA(e){return Number.isFinite(e)&&e>0&&e<=1114111?String.fromCodePoint(e):``}function qA(e){return String(e??``).normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}const JA=/* @__PURE__ */ new Set(/* @__PURE__ */ `va.hoac.cua.cho.voi.mot.nung.khong.duoc.de.theo.loai.tinh.gia.thuoc.ve.tai.nha.mat.neu.thi.la.cac.nhan.bi.ra.nay`.split(`.`));function YA(e){let t=[];for(let n of qA(e).split(/[^a-z0-9]+/))n.length>1&&!JA.has(n)&&t.push(n);return t}function $(...e){for(let t of e)if(typeof t==`string`&&t.trim())return GA(t);return``}function XA(e){let t=/* @__PURE__ */ new Set,n=[],r=e=>{if(typeof e!=`string`)return;let r=e.trim();r&&!t.has(r)&&(/^https?:\/\//i.test(r)||/^data:image\//i.test(r))&&(t.add(r),n.push(r))};return Array.isArray(e.imgs)&&e.imgs.forEach(r),Array.isArray(e.images)&&e.images.forEach(r),r(e.i),r(e.image),n}function ZA(e){for(let t of[e.pn,e.salePn,e.priceNum,e.price_number,e.priceNumber]){let e=Number(t);if(Number.isFinite(e)&&e>0)return e}return 0}function QA(e){let t=Math.round(Number(e)||0);return t<=0?``:`${String(t).replace(/\B(?=(\d{3})+(?!\d))/g,`.`)}₫`}function $A(e){return $(e.p,e.priceText,e.price)||QA(ZA(e))}function ej(e){let t=e;if(typeof t==`string`&&t.trim()){let e=t.trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{t=JSON.parse(e)}catch{t=null}else t=null}let n=[];if(Array.isArray(t))for(let e of t)Array.isArray(e)&&e.length>=2?n.push([$(e[0]),$(e[1])]):e&&typeof e==`object`&&n.push([$(e.name,e.key),$(e.value)]);else if(t&&typeof t==`object`)for(let[e,r]of Object.entries(t)){let t=$(r)||(r==null?``:String(r));t&&n.push([$(e),t])}return n.filter(([e,t])=>e&&t)}function tj(e){return(Array.isArray(e.feats)?e.feats:Array.isArray(e.features)?e.features:[]).map(e=>$(e)).filter(Boolean)}function nj(e){if(!e||typeof e!=`object`)return null;let t=$(e.sku,e.mod,e.model,e.SAP),n=$(e.slug),r=$(e.n,e.name,e.title_clean,e.title)||t||n,i=t||n;return!i||!r?null:{sku:i,slug:n,model:$(e.mod,e.model,t),name:r,brand:$(e.brand),category:$(e.c,e.category,e.cs,e.category_slug),link:$(e.l,e.link),price:$A(e),priceNum:ZA(e),images:XA(e),summary:$(e.sum,e.summary,e.description,e.desc),specs:ej(e.specs),feats:tj(e),addedBy:$(e._addedBy,e._source)}}const rj={"catalogue/products.json":`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_url_added.json`,"catalogue/promos.json":`https://huggingface.co/datasets/bep40/vaistudio-data/resolve/main/promos.json`};let ij=null;function aj(){return import.meta.url.replace(/\/dist\/assets\/[^/]*$/,`/`)}function oj(e){let t=aj(),n=[new URL(`dist/`+e,t).href,new URL(e,t).href];return typeof document<`u`&&document.baseURI&&(n.push(new URL(e.replace(/^catalogue\//,`dist/catalogue/`),document.baseURI).href),n.push(new URL(e,document.baseURI).href)),[...new Set(n)]}async function sj(e){let t=rj[e],n=t?[t,...oj(e)]:oj(e),r;for(let t of n)try{let n={cache:`no-store`};typeof AbortSignal<`u`&&typeof AbortSignal.timeout==`function`&&(n.signal=AbortSignal.timeout(2e4));let i=await fetch(t,n);if(!i.ok){r=/* @__PURE__ */ Error(`HTTP ${i.status}`);continue}let a=await i.text(),o;try{o=JSON.parse(a)}catch{r=/* @__PURE__ */ Error(`body is not valid JSON`);continue}if(Array.isArray(o)?o.length===0&&e.includes(`products`):!o||typeof o!=`object`){r=/* @__PURE__ */ Error(`unexpected shape`);continue}return o}catch(e){r=e}throw Error(`Không tìm thấy ${e} (${r?.message||`không rõ`}). Chạy \`node scripts/sync-catalogue.mjs\` để nhân bản dữ liệu từ vai-avatar vào Space.`)}async function cj(){try{let e=await fetch(`https://huggingface.co/api/datasets/bep40/grob-products-updated/revision/main`,{cache:`no-store`});if(!e.ok)return null;let t=await e.json();return typeof t?.sha==`string`?t.sha:null}catch{return null}}let lj=null,uj=null;async function dj(){let e=await cj();if(e&&ij&&e===ij)return lj;let t=await fetch(`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_with_slugs.json`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=JSON.parse(await t.text());if(!Array.isArray(n)||!n.length)throw Error(`unexpected shape`);return lj=n,ij=e??`len:${n.length}`,n}function fj(){return uj||(uj=dj().catch(e=>{if(lj)return lj;throw e}).finally(()=>{uj=null}),uj)}function pj(e){return $(e.sku,e.mod,e.model).toUpperCase()?0:$(e.slug)?1:2}function mj(e){let t=[],n=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Map;for(let i of vj(Array.isArray(e)?e:[])){if(!i||typeof i!=`object`)continue;let e=$(i.slug).toLowerCase(),a=qA($(i.n,i.name,i.title)).trim(),o=$(i.imgs?.[0],i.i,i.image).split(`?`)[0],s=a&&o?`${a}\u0000${o}`:null;if(!e&&!s)continue;let c=pj(i),l=[];e&&l.push(n.get(e)),s&&l.push(r.get(s));let u=l.find(e=>e!==void 0);if(u&&u.ranke.described)).size===1&&(i.sort((e,t)=>t.images.length-e.images.length),r.set(e,i[0].images));return r}function vj(e){if(!Array.isArray(e))return e;let t=e.filter(gj);if(!t.length)return e;let n=_j(e),r=[],i=0,a=0;for(let t of e){if(!gj(t)){r.push(t);continue}let e=null;for(let r of hj($(t.n,t.name,t.title)))if(n.has(r)){e=n.get(r);break}if(e){r.push({...t,imgs:e,i:e[0],brand:`Malloca`}),i++;continue}r.push({...t,brand:`Malloca`}),a++}return t.length&&console.info(`[catalogue] Malloca misbranding: ${t.length} rows (name says Malloca, brand says otherwise). ${i} swapped to a real Malloca photo, ${a} relabelled, ${t.length-i-a} hidden.`),r}function yj(e){let t=[],n=e=>{let n=$(e).toUpperCase();n&&!t.includes(n)&&t.push(n)};n(e.sku),n(e.mod),n(e.model),n(e.SAP),n(e._source_alias),n(e.slug);let r=qA($(e.n,e.name,e.title_clean,e.title)).replace(/\s+/g,` `).trim();return r.length>8&&n(r),t}const bj=[[`name`,[`n`,`title_clean`,`title`]],[`priceNum`,[`p`,`pn`,`salePn`,`price_number`,`priceNumber`,`price`]],[`description`,[`sum`,`summary`,`desc`]],[`features`,[`feats`]],[`images`,[`imgs`,`i`,`image`]]];function xj(e){let t=e&&e.deleted;return t===!0||t===1||t===`true`||t===`1`}function Sj(e,t,n){let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Set;function o(e,t){for(let n of t){if(a.has(n))continue;let t=i.get(n);t===void 0?i.set(n,e):t!==e&&(i.delete(n),a.add(n))}}function s(e,t,n){let i=r.get(e);if(!i){r.set(e,{...t});return}let a={...i};if(n){for(let[e,r]of n)if(t[e]!==void 0)for(let e of r)delete a[e]}r.set(e,{...a,...t})}for(let e of Array.isArray(n)?n:[]){if(!e||typeof e!=`object`)continue;let t=yj(e);t.length&&(s(t[0],e),o(t[0],t))}for(let t of Array.isArray(e)?e:[]){if(!t||typeof t!=`object`)continue;let e=yj(t);if(!e.length)continue;let n=e.map(e=>i.get(e)).find(e=>e!==void 0)??e[0];s(n,t,bj),o(n,e)}let c=t&&typeof t==`object`&&t.productEdits&&typeof t.productEdits==`object`?t.productEdits:{};for(let[e,t]of Object.entries(c)){if(!t||typeof t!=`object`)continue;let n=yj(t),r=$(e).toUpperCase();if(!n.length&&!r)continue;let a=[...n,r].map(e=>i.get(e)).find(e=>e!==void 0)??r;s(a,t,bj),o(a,[...n,r])}let l=/* @__PURE__ */ new Map;for(let[e,t]of r){if(xj(t))continue;let n=nj(t);n&&l.set(e,n)}return l}function Cj(e){let t=2166136261,n=e=>{let n=String(e);for(let e=0;e>>0).toString(36)}-${e.size}`}let wj=null,Tj=null;function Ej(){return Tj||(Tj=(async()=>{let[e,t,n]=await Promise.all([sj(`catalogue/products.json`),sj(`catalogue/promos.json`).then(e=>(wj=e,e)).catch(()=>wj??{}),fj().then(e=>mj(e)).catch(()=>lj?mj(lj):[])]),r=Sj(e,t,n);return{items:r,signature:Cj(r),syncedAt:Date.now(),partial:!n.length}})().finally(()=>{Tj=null}),Tj)}async function Dj(){try{return await Ej()}catch{return null}}const Oj={name:6,model:4,brand:3,category:3,summary:1,feats:1,specs:1};function kj(e){let t={name:YA(e.name),model:YA(e.model),brand:YA(e.brand),category:YA(e.category),summary:YA(e.summary.slice(0,600)),feats:e.feats.flatMap(YA),specs:e.specs.flatMap(([e,t])=>YA(e).concat(YA(t)))},n=/* @__PURE__ */ new Map;for(let[e,r]of Object.entries(Oj))for(let i of new Set(t[e]||[]))(n.get(i)||0)2&&e.length>2&&(r.startsWith(e)||e.startsWith(r))&&(n=Math.max(n,i*.7));n&&(o+=n,s++)}s&&(o*=.55+.45*(s/r.length),i.length>3&&n.includes(i)&&(o*=1.35),a.push({sku:e.sku,score:o,product:e}))}return a.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),a.slice(0,n)}k.allowLocalModels=!1,k.backends.onnx.wasm.numThreads=1;let Nj,Pj,Fj=!1;const Ij=e=>self.postMessage(e);function Lj(){return Nj??=(async()=>{Ij({status:`loading`,label:`Đang tải mô hình tìm kiếm`});let[e,t,n,r]=await Promise.all([W.from_pretrained(`sentence-transformers/clip-ViT-B-32-multilingual-v1`),ev.from_pretrained(`bep40/clip-vit-b32-multilingual-vi-text`,{dtype:`fp32`,device:`wasm`,revision:`9e1d53553228b17abfe6986fbe92e22bd6bd6bad`,progress_callback:e=>{e.status===`progress`&&e.file?.endsWith(`.onnx`)&&Ij({status:`loading`,label:`Đang tải mô hình tìm kiếm`,progress:e.progress})}}),VA(BA+`image-embeddings.json`).then(e=>JSON.parse(new TextDecoder().decode(e))),VA(BA+`image-embeddings_25k-512-32bit.bin`)]),i=new Float32Array(r);if(i.length!==n.length*512)throw Error(`The image database and embeddings do not match.`);return HA(i,512),Ij({status:`loading`,label:`Đang khởi động tìm kiếm`,progress:100}),await t(e(`a photograph`,{padding:!0,truncation:!0})),Ij({status:`ready`,count:n.length}),{tokenizer:e,model:t,metadata:n,embeddings:i}})().catch(e=>{throw Nj=null,e})}async function Rj(){if(!Fj){Fj=!0;try{let{tokenizer:e,model:t,metadata:n,embeddings:r}=await Lj();for(;Pj;){let i=Pj;Pj=null;let a=performance.now();try{let{text_embeds:o}=await t(e(i.text,{padding:!0,truncation:!0}));if(Pj)continue;let s=UA(o.data,r,512,96).map(({index:e,score:t})=>({...n[e],score:t}));Ij({status:`complete`,id:i.id,text:i.text,output:s,elapsed:performance.now()-a})}catch(e){Ij({status:`error`,id:i.id,message:e.message})}}}catch(e){Ij({status:`error`,id:Pj?.id,message:e.message}),Pj=null}finally{Fj=!1}}}let zj=null;function Bj(){return zj??Ej().then(e=>(zj=e,e))}async function Vj(e=!1){let t=e?await Ej():await Dj();return t&&(zj=t),t}async function Hj(e,t,n){let r=performance.now();try{Ij({status:`products-loading`});let{items:i,signature:a}=await Bj(),o=Mj(e,i,n);Ij({status:`products-complete`,id:t,text:e,output:o,signature:a,count:i.size,elapsed:performance.now()-r})}catch(e){Ij({status:`products-error`,id:t,message:e.message})}}self.addEventListener(`message`,({data:e})=>{e.type===`init`?(Lj().catch(e=>Ij({status:`error`,message:e.message})),Bj().catch(()=>{})):e.type===`search`?(Pj={id:e.id,text:e.text},Rj()):e.type===`search-products`?Hj(e.text,e.id,e.limit??24):e.type===`refresh-catalogue`?Vj(e.force===!0).then(e=>e&&Ij({status:`catalogue-updated`,signature:e.signature,count:e.items.size,syncedAt:e.syncedAt})).catch(e=>Ij({status:`catalogue-error`,message:e.message})):e.type===`clear`&&(Pj=null)}); \ No newline at end of file +${r}${a}`+i.repeat(e)+`${r}`,o}function jm(e,t,n,r){return`${t}${r}`+n.repeat(e)+`${t}`}function Mm(e,t,n,r,i,a){return e===0&&t===0?jm(n,r,i,a):Am(n,e,t,r,i,a)}var Nm=class extends K{static image_processor_class=bm;static tokenizer_class=G;static uses_processor_config=!0;fake_image_token=``;image_token=``;global_img_token=``;async _call(e,t=null,n={}){n.return_row_col_info??=!0;let r;t&&(r=await this.image_processor(t,n)),Array.isArray(e)||(e=[e]);let i=r.rows??[Array(e.length).fill(0)],a=r.cols??[Array(e.length).fill(0)],o=this.config.image_seq_len,s=[],c=[];for(let t=0;tMm(e,l[t],o,this.fake_image_token,this.image_token,this.global_img_token)),d=n.split(this.image_token);if(d.length===0)throw Error(`The image token should be present in the text.`);let f=d[0];for(let e=0;ee.images).flatMap(e=>e.images).map(e=>Bf.read(e)));let r=this.tokenizer,i=r.apply_chat_template(e,{tokenize:!1,add_generation_prompt:!0,chat_template:n}),a=e=>r.encode(e,{add_special_tokens:!1}),o=i.split(this.image_tag),s=o.length-1;if(t.length!==s)throw Error(`Number of images provided (${t.length}) does not match number of "${this.image_tag}" image tags (${s})`);let[c,l,u]=r.convert_tokens_to_ids([this.image_tag,this.image_start_tag,this.image_end_tag]),d=a(o[0]),f=Array(d.length).fill(!1);for(let e=1;e0){let e=await this.image_processor(t);return e.pixel_values.unsqueeze_(0),{...m,...e}}return m}},Fm=class extends K{static tokenizer_class=G;static image_processor_class=bm;async _call(e=null,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=e?this.tokenizer(e,n):{},i=t?await this.image_processor(t,n):{};return{...r,...i}}},Im=class extends K{static tokenizer_class=G;static image_processor_class=bm;async _call(e,t=null,n={}){let{image_rows:r,image_cols:i,image_sizes:a,...o}=await this.image_processor(e,{...n,return_row_col_info:!0});if(t){let e=this.config.image_token??``,{tile_size:n=512,downsample_factor:o=2,encoder_patch_size:s=16,use_thumbnail:c=!0}=this.image_processor.config,l=e=>Math.ceil(Math.floor(e/s)/o),u=l(n)**2,d=this.config.image_start_token??`<|image_start|>`,f=this.config.image_end_token??`<|image_end|>`,p=this.config.image_thumbnail??`<|img_thumbnail|>`;Array.isArray(t)||(t=[t]);let m=0;t=t.map(t=>{let n=t.split(e);return n[0]+n.slice(1).map(t=>{let n=m++,[o,s]=a[n],h=r[n],g=i[n],_=l(o)*l(s),v=d;if(h>1||g>1){let t=e.repeat(u);for(let e=0;e`+t;c&&(v+=p+e.repeat(_))}else v+=e.repeat(_);return v+f+t}).join(``)})}return{...o,...t?this.tokenizer(t,n):{}}}},Lm=class extends K{static tokenizer_class=G;static image_processor_class=bm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,patch_size:a,num_additional_image_tokens:o}=this.config,s=Math.floor(e/a)*Math.floor(n/a)+o;t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;e0?i.reduce((e,t)=>e*t,1):0;c.push(n),s.push(a)}return[i(c),s]}char_decode(e){return this.char_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}bpe_decode(e){return this.bpe_tokenizer.batch_decode(e)}wp_decode(e){return this.wp_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}batch_decode([e,t,n]){let[r,i]=this._decode_helper(e,`char`),[a,o]=this._decode_helper(t,`bpe`),[s,c]=this._decode_helper(n,`wp`),l=[],u=[];for(let e=0;e`;function Um(e,t,n,r,i){return`${r.repeat(n*i)}${t}${e} +`}var Wm=class extends K{static tokenizer_class=G;static image_processor_class=bm;static uses_processor_config=!1;async _call(e,t=null,n={}){t||=(A.warn(`You are using PaliGemma without a text prefix. It will perform as a picture-captioning model.`),``),Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let r=this.tokenizer.bos_token,i=this.image_processor.config.image_seq_length,a;t.some(e=>e.includes(Hm))?a=t.map(e=>{let t=e.replaceAll(Hm,Hm.repeat(i)),n=t.lastIndexOf(Hm),a=n===-1?0:n+Hm.length;return t.slice(0,a)+r+t.slice(a)+` +`}):(A.warn("You are passing both `text` and `images` to `PaliGemmaProcessor`. The processor expects special image tokens in the text, as many tokens as there are images per each text. It is recommended to add `` tokens in the very beginning of your text. For this call, we will infer how many images each text has and add special tokens."),a=t.map(t=>Um(t,r,i,Hm,e.length)));let o=this.tokenizer(a,n);return{...await this.image_processor(e,n),...o}}},Gm=`<|image|>`,Km=/<\|image_\d+\|>/g,qm=class extends K{static image_processor_class=bm;static tokenizer_class=G;async _call(e,t=null,{padding:n=!0,truncation:r=!0,num_crops:i=null}={}){Array.isArray(e)||(e=[e]);let a,o;if(t){o=await this.image_processor(t,{num_crops:i});let{num_img_tokens:s}=o,c=e.map((e,t)=>e.split(Km).join(Gm.repeat(s[t])));a=this.tokenizer(c,{padding:n,truncation:r});let l=this.tokenizer._tokenizer.token_to_id(Gm);a.input_ids.map_(e=>e==l?-e:e)}else a=this.tokenizer(e);return{...a,...o}}},Jm=class extends K{static tokenizer_class=G;static image_processor_class=bm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,image_break_token:a,image_end_token:o,patch_size:s,spatial_merge_size:c}=this.config,l=s*c,u=Math.floor(e/l),d=Math.floor(n/l);t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;eoh(e,o)),c=s.map(e=>e.length),l=s.flat(),u=(await Promise.all(l.map(e=>this.feature_extractor(e,n)))).map(e=>e.input_features);r.audio_values=u.length>1?U(u,0):u[0];let d=i[0];for(let e=0;e0){if(l>wc)throw Error(`The number of external data chunks (${l}) exceeds the maximum allowed value (${wc}).`);let t=wh(o,l);for(let n of t){let t=`${r.subfolder??``}/${n}`;c.push(new Promise(async(i,a)=>{let o=await el(e,t,!0,r,s);i(o instanceof Uint8Array?{path:n,data:o}:n)}))}}else a.externalData!==void 0&&(c=a.externalData.map(async t=>{if(typeof t.data==`string`){let n=await el(e,t.data,!0,r);return{...t,data:n}}return t}));return Promise.all(c)}async function Dh(e,t,n,r=!1,i=void 0){let a=n.config?.[`transformers.js_config`]??{},o=Wl(n.device??a.device,t,{warn:e=>A.info(e)}),s=Al(o),c=a.device_config??{};c.hasOwnProperty(o)&&(a={...a,...c[o]});let l=Xl(n.dtype??a.dtype,t,o,{configDtype:a.dtype,warn:e=>A.info(e)});if(!Yl.hasOwnProperty(l))throw Error(`Invalid dtype: ${l}. Should be one of: ${Object.keys(Kl).join(`, `)}`);if(o===`webgpu`&&!O.IS_NODE_ENV&&l===Kl.fp16&&!await Gl())throw Error(`The device (${o}) does not support fp16.`);let u=Yl[l],d={...n.session_options};d.executionProviders??=s;let f=a.free_dimension_overrides;f?d.freeDimensionOverrides??=f:o.startsWith(`webnn`)&&!d.freeDimensionOverrides&&A.warn(`WebNN does not currently support dynamic shapes and requires 'free_dimension_overrides' to be set in config.json, preferably as a field within config["transformers.js_config"]["device_config"]["${o}"]. When 'free_dimension_overrides' is not set, you may experience significant performance degradation.`);let p=Th(e,t,n,u),m=await Eh(e,t,u,n,n.use_external_data_format??a.use_external_data_format,d);if(m.length>0&&(!O.IS_NODE_ENV||m.some(e=>typeof e!=`string`))&&(d.externalData=m),r&&o===`webgpu`){let e=yh(n.config,{prefix:`present`,session_name:i});if(e.size>0&&!zl()){let t={};for(let n of e)t[n]=`gpu-buffer`;d.preferredOutputLocation=t}}return{buffer_or_path:await p,session_options:d,session_config:{dtype:l,device:o}}}async function Oh(e,t,n,r=void 0){return Object.fromEntries(await Promise.all(Object.keys(t).map(async i=>{let a=r?.[i]??!1,{buffer_or_path:o,session_options:s,session_config:c}=await Dh(e,t[i],n,a,i);return[i,await Pl(o,s,c)]})))}function kh(e){for(let t in e)Ll(e[t])?e[t]=new H(e[t]):typeof e[t]==`object`&&kh(e[t]);return e}async function J(e,t){let n=Ah(e,t);try{return kh(await Il(e,Object.fromEntries(Object.entries(n).map(([e,t])=>{let n=t.ort_tensor;return O.IS_NODE_ENV&&typeof Float16Array<`u`&&n.cpuData instanceof Float16Array&&(n.cpuData=new Uint16Array(n.cpuData.buffer)),[e,n]}))))}catch(e){let t=Object.fromEntries(Object.entries(n).map(([e,t])=>{let n={type:t.type,dims:t.dims,location:t.location};return n.location!==`gpu-buffer`&&(n.data=t.data),[e,n]}));throw A.error(`An error occurred during model execution: "${e}".`),A.error(`Inputs given to model:`,t),e}}function Ah(e,t){let n=/* @__PURE__ */ Object.create(null),r=[];for(let i of e.inputNames){let e=t[i];if(!(e instanceof H)){r.push(i);continue}n[i]=zl()?e.clone():e}if(r.length>0)throw Error(`An error occurred during model execution: "Missing the following inputs: ${r.join(`, `)}.`);let i=Object.keys(t).length,a=e.inputNames.length;if(i>a){let n=Object.keys(t).filter(t=>!e.inputNames.includes(t));A.warn(`WARNING: Too many inputs were provided (${i} > ${a}). The following inputs will be ignored: "${n.join(`, `)}".`)}return n}var jh=class{},Mh=class extends jh{constructor({last_hidden_state:e,hidden_states:t=null,attentions:n=null}){super(),this.last_hidden_state=e,this.hidden_states=t,this.attentions=n}},Y=class extends jh{constructor({logits:e,...t}){super(),this.logits=e;let n=Object.values(t);n.length>0&&(this.attentions=n)}},Nh=class extends jh{constructor({logits:e}){super(),this.logits=e}},Ph=class extends jh{constructor({logits:e}){super(),this.logits=e}},Fh=class extends jh{constructor({start_logits:e,end_logits:t}){super(),this.start_logits=e,this.end_logits=t}},Ih=class extends jh{constructor({logits:e}){super(),this.logits=e}},Lh=class extends jh{constructor({logits:e,past_key_values:t}){super(),this.logits=e,this.past_key_values=t}},Rh=class extends jh{constructor({logits:e,past_key_values:t,encoder_outputs:n,decoder_attentions:r=null,cross_attentions:i=null}){super(),this.logits=e,this.past_key_values=t,this.encoder_outputs=n,this.decoder_attentions=r,this.cross_attentions=i}},zh=class extends jh{constructor({alphas:e}){super(),this.alphas=e}},Bh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Vh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Hh=class extends $r{constructor(){super(),this.processors=[]}push(e){this.processors.push(e)}extend(e){this.processors.push(...e)}_call(e,t){let n=t;for(let t of this.processors)n=t(e,n);return n}[Symbol.iterator](){return this.processors.values()}},Uh=class extends Bh{constructor(e){super(),this.bos_token_id=e}_call(e,t){for(let n=0;n=1&&i[i.length-1]>=this.timestamp_begin,o=i.length<2||i[i.length-2]>=this.timestamp_begin;if(a&&(o?r.subarray(this.timestamp_begin).fill(-1/0):r.subarray(0,this.eos_token_id).fill(-1/0)),e[n].length===this.begin_index&&this.max_initial_timestamp_index!==null){let e=this.timestamp_begin+this.max_initial_timestamp_index;r.subarray(e+1).fill(-1/0)}let s=ol(r);Math.log(s.subarray(this.timestamp_begin).map(Math.exp).reduce((e,t)=>e+t))>cl(s.subarray(0,this.timestamp_begin))[0]&&r.subarray(0,this.timestamp_begin).fill(-1/0)}return t}},Jh=class extends Bh{constructor(e){super(),this.no_repeat_ngram_size=e}getNgrams(e){let t=e.length,n=[];for(let r=0;r1 to use the classifier-free guidance processor, got guidance scale ${e}.`);this.guidance_scale=e}_call(e,t){if(t.dims[0]!==2*e.length)throw Error(`Logits should have twice the batch size of the input ids, the first half of batches corresponding to the conditional inputs, and the second half of batches corresponding to the unconditional inputs. Got batch size ${t.dims[0]} for the logits and ${e.length} for the input ids.`);let n=e.length,r=t.slice([0,n],null),i=t.slice([n,t.dims[0]],null);for(let e=0;ee.length>=this.max_length)}},ag=class extends ng{constructor(e){super(),Array.isArray(e)||(e=[e]),this.eos_token_id=e}_call(e,t){return e.map(e=>{let t=e.at(-1);return this.eos_token_id.some(e=>t==e)})}},og=class extends $r{constructor(e){super(),this.generation_config=e}async _call(e){return this.sample(e)}async sample(e){throw Error(`sample should be implemented in subclasses.`)}getLogits(e,t){let n=e.dims.at(-1),r=e.data;if(t===-1)r=r.slice(-n);else{let e=t*n;r=r.slice(e,e+n)}return r}randomSelect(e){return bc(e)}static getSampler(e){if(e.do_sample)return new cg(e);if(e.num_beams>1)return new lg(e);if(e.num_return_sequences>1)throw Error(`num_return_sequences has to be 1 when doing greedy search, but is ${e.num_return_sequences}.`);return new sg(e)}},sg=class extends og{async sample(e){let t=cl(e.data)[1];return[[BigInt(t),0]]}},cg=class extends og{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await ru(e,t),i=al(n.data);return Array.from({length:this.generation_config.num_beams},()=>{let e=this.randomSelect(i);return[r.data[e],Math.log(i[e])]})}},lg=class extends og{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await ru(e,t),i=al(n.data);return Array.from({length:this.generation_config.num_beams},(e,t)=>[r.data[t],Math.log(i[t])])}},ug=class{constructor(e){if(e)for(let t in e){if(t in this)throw TypeError(`Key "${t}" conflicts with an existing property on DynamicCache`);let n=e[t];if(!(n instanceof H))throw TypeError(`Expected a Tensor for key "${t}", got ${typeof n}`);this[t]=n}}get_seq_length(){let e=this;if(Object.keys(e).length===0)return 0;for(let t in e)if(t.startsWith(`past_key_values.`))return e[t].dims.at(-2);throw Error(`Unable to determine sequence length from the cache.`)}update(e){for(let t in e){let n=this[t],r=e[t];n&&n!==r&&n.location===`gpu-buffer`&&n.dispose(),this[t]=r}}async dispose(){let e=[];for(let t of Object.values(this))t.location===`gpu-buffer`&&e.push(t.dispose());await Promise.all(e)}},X={EncoderOnly:0,EncoderDecoder:1,Seq2Seq:2,Vision2Seq:3,DecoderOnly:4,DecoderOnlyWithoutHead:5,MaskGeneration:6,ImageTextToText:7,Musicgen:8,MultiModality:9,Phi3V:10,AudioTextToText:11,AutoEncoder:12,ImageAudioTextToText:13,Supertonic:14,Chatterbox:15,VoxtralRealtime:16},dg={[X.DecoderOnly]:{sessions:(e,t)=>({model:t.model_file_name??`model`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[X.DecoderOnlyWithoutHead]:{sessions:(e,t)=>({model:t.model_file_name??`model`})},[X.Seq2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[X.Vision2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[X.Musicgen]:{sessions:()=>({model:`text_encoder`,decoder_model_merged:`decoder_model_merged`,encodec_decode:`encodec_decode`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[X.EncoderDecoder]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0}},[X.MaskGeneration]:{sessions:()=>({model:`vision_encoder`,prompt_encoder_mask_decoder:`prompt_encoder_mask_decoder`})},[X.ImageTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...dg[X.ImageTextToText].text_only_sessions};return n||(r.vision_encoder=`vision_encoder`),e.is_encoder_decoder&&(r.model=`encoder_model`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[X.AudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...dg[X.AudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[X.ImageAudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...dg[X.ImageAudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`,r.vision_encoder=`vision_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[X.Phi3V]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`model`,vision_encoder:`vision_encoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[X.MultiModality]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`language_model`,lm_head:`lm_head`,gen_head:`gen_head`,gen_img_embeds:`gen_img_embeds`,image_decode:`image_decode`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[X.AutoEncoder]:{sessions:()=>({encoder_model:`encoder_model`,decoder_model:`decoder_model`})},[X.Supertonic]:{sessions:()=>({text_encoder:`text_encoder`,latent_denoiser:`latent_denoiser`,voice_decoder:`voice_decoder`})},[X.Chatterbox]:{sessions:()=>({embed_tokens:`embed_tokens`,speech_encoder:`speech_encoder`,model:`language_model`,conditional_decoder:`conditional_decoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[X.VoxtralRealtime]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...dg[X.VoxtralRealtime].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0,audio_encoder:!0},optional_configs:{generation_config:`generation_config.json`}},default:{sessions:(e,t)=>({model:t.model_file_name??`model`})}};function fg(e,t,n={}){let r=dg[e]??dg.default;return{sessions:r.sessions(t,n,n.textOnly??!1),cache_sessions:r.cache_sessions,optional_configs:r.optional_configs}}function pg(e,{warn:t=!0}={}){let n=e.architectures||[];for(let e of n){let t=Sg.get(e);if(t!==void 0)return t}if(e.model_type){let t=Sg.get(e.model_type);if(t!==void 0)return t;for(let t of Object.values(gg))if(t.has(e.model_type)){let n=Sg.get(t.get(e.model_type));if(n!==void 0)return n}}if(t){let t=n.length>0?n.join(`, `):`(none)`;A.warn(`[resolve_model_type] Architecture(s) not found in MODEL_TYPE_MAPPING: [${t}] for model type '${e.model_type}'. Falling back to EncoderOnly (single model.onnx file). If you encounter issues, please report at: ${Md}`)}return X.EncoderOnly}function mg(e,{config:t=null,cache_dir:n=null,local_files_only:r=!1,revision:i=`main`}={}){return t===null?Uc(kc(e,{cache_dir:n,local_files_only:r,revision:i}),()=>Sh.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})):Sh.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})}async function hg(e,{config:t=null,dtype:n=null,device:r=null,model_file_name:i=null}={}){t=await mg(e,{config:t});let a=[`config.json`],o=t[`transformers.js_config`]??{},s=o.use_external_data_format,c=`onnx`,l=r??o.device,u=n??o.dtype,d=pg(t),f=(e,t=null)=>{t??=e;let n=Wl(l,e),r=Yl[Xl(u,e,n)]??``,i=`${t}${r}.onnx`,o=`${c}/${i}`;a.push(o);let d=Ch(s,i,e);for(let e of wh(i,d)){let t=`${c}/${e}`;a.push(t)}},{sessions:p,optional_configs:m}=fg(d,t,{model_file_name:i});for(let[e,t]of Object.entries(p))f(e,t);if(m)for(let e of Object.values(m))a.push(e);return a}var gg=null;function _g(e){gg=e}function vg(e){if(e instanceof H)return e;if(e.length===0)throw Error(`items must be non-empty`);if(Array.isArray(e[0])){if(e.some(t=>t.length!==e[0].length))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' and/or 'truncation=True' to have batched tensors with the same length.`);return new H(`int64`,BigInt64Array.from(e.flat().map(e=>BigInt(e))),[e.length,e[0].length])}return new H(`int64`,BigInt64Array.from(e.map(e=>BigInt(e))),[1,e.length])}function yg(e){return new H(`bool`,[e],[1])}var bg={[X.DecoderOnly]:{can_generate:!0,forward:Ng,prepare_inputs:zg},[X.DecoderOnlyWithoutHead]:{can_generate:!1,forward:Ng,prepare_inputs:zg},[X.Seq2Seq]:{can_generate:!0,forward:Tg,prepare_inputs:Bg},[X.Vision2Seq]:{can_generate:!0,forward:Tg,prepare_inputs:Bg},[X.Musicgen]:{can_generate:!0,forward:Tg},[X.EncoderDecoder]:{can_generate:!1,forward:Tg},[X.ImageTextToText]:{can_generate:!0,forward:Ig,prepare_inputs:Vg},[X.AudioTextToText]:{can_generate:!0,forward:Fg,prepare_inputs:Vg},[X.ImageAudioTextToText]:{can_generate:!0,prepare_inputs:Vg},[X.Phi3V]:{can_generate:!0,prepare_inputs:Vg},[X.MultiModality]:{can_generate:!0},[X.AutoEncoder]:{can_generate:!1,forward:Dg},[X.Chatterbox]:{can_generate:!0,forward:Eg},[X.VoxtralRealtime]:{can_generate:!0,prepare_inputs:zg},default:{can_generate:!1,forward:Eg}};function xg(e,t){let n=Sg.get(e),r=!1,i=t?.architectures?.[0];if(i&&i!==e&&e?.endsWith(`ForCausalLM`)&&i.endsWith(`ForConditionalGeneration`)){let e=Sg.get(i);e!==void 0&&(n=e,r=!0)}let a=bg[n]??bg.default,o=dg[n]??dg.default;return{typeConfig:{...a,...o},textOnly:r,modelType:n}}var Sg=/* @__PURE__ */ new Map,Cg=/* @__PURE__ */ new Map,wg=/* @__PURE__ */ new Map,Z=class extends $r{main_input_name=`input_ids`;forward_params=[`input_ids`,`attention_mask`];_return_dict_in_generate_keys=null;constructor(e,t,n){super(),this.config=e,this.sessions=t,this.configs=n;let{typeConfig:r}=xg(wg.get(this.constructor),e);this.can_generate=r.can_generate,this._forward=r.forward,this._prepare_inputs_for_generation=r.prepare_inputs,this.can_generate&&this.forward_params.push(`past_key_values`),this.custom_config=this.config[`transformers.js_config`]??{}}async dispose(){let e=[];for(let t of Object.values(this.sessions))e.push(t.release?.());return await Promise.all(e)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d},p=wg.get(this);n=f.config=await Sh.from_pretrained(e,f);let{typeConfig:m,textOnly:h,modelType:g}=xg(p,n);if(g===void 0){let e=p??n?.model_type;e!==`custom`&&A.warn(`Model type for '${e}' not found, assuming encoder-only architecture. Please report this at ${Md}.`)}if(t&&!(t instanceof ti)){let r={};try{let t=await hg(e,{config:n,dtype:l,device:c,model_file_name:o});(await Promise.all(t.map(t=>Gc(e,t,f)))).forEach((e,n)=>{if(e.exists){let i=t[n]===`config.json`;r[t[n]]={loaded:i?e.size??0:0,total:e.size??0}}})}catch(e){A.warn(`Unable to fetch model file metadata for total progress tracking: ${e}`)}Object.keys(r).length>0&&(f.progress_callback=new ti(t,r))}let _=[Oh(e,m.sessions(n,f,h),f,m.cache_sessions)];m.optional_configs&&_.push(Gg(e,m.optional_configs,f));let v=await Promise.all(_);return new this(n,...v)}async _call(e){return await this.forward(e)}async forward(e){return await this._forward(this,e)}get generation_config(){return this.configs?.generation_config??null}_get_logits_processor(e,t,n=null){let r=new Hh;if(e.repetition_penalty!==null&&e.repetition_penalty!==1&&r.push(new Yh(e.repetition_penalty)),e.no_repeat_ngram_size!==null&&e.no_repeat_ngram_size>0&&r.push(new Jh(e.no_repeat_ngram_size)),e.bad_words_ids!==null&&r.push(new Qh(e.bad_words_ids,e.eos_token_id)),e.min_length!==null&&e.eos_token_id!==null&&e.min_length>0&&r.push(new Xh(e.min_length,e.eos_token_id)),e.min_new_tokens!==null&&e.eos_token_id!==null&&e.min_new_tokens>0&&r.push(new Zh(t,e.min_new_tokens,e.eos_token_id)),e.forced_bos_token_id!==null&&r.push(new Uh(e.forced_bos_token_id)),e.forced_eos_token_id!==null&&r.push(new Wh(e.max_length,e.forced_eos_token_id)),e.suppress_tokens!==null&&r.push(new Gh(e.suppress_tokens)),e.begin_suppress_tokens!==null){let n=t>1||e.forced_bos_token_id===null?t:t+1;r.push(new Kh(e.begin_suppress_tokens,n))}return e.guidance_scale!==null&&e.guidance_scale>1&&r.push(new $h(e.guidance_scale)),e.temperature===0&&e.do_sample&&(A.warn("`do_sample` changed to false because `temperature: 0` implies greedy sampling (always selecting the most likely token), which is incompatible with `do_sample: true`."),e.do_sample=!1),e.do_sample&&e.temperature!==null&&e.temperature!==1&&r.push(new eg(e.temperature)),n!==null&&r.extend(n),r}_prepare_generation_config(e,t,n=tg){let r={...this.config};for(let e of[`decoder`,`generator`,`text_config`])e in r&&Object.assign(r,r[e]);let i=new n(r);return Object.assign(i,this.generation_config??{}),e&&Object.assign(i,e),t&&Object.assign(i,ci(t,Object.getOwnPropertyNames(i))),i}_get_stopping_criteria(e,t=null){let n=new rg;return e.max_length!==null&&n.push(new ig(e.max_length,this.config.max_position_embeddings??null)),e.eos_token_id!==null&&n.push(new ag(e.eos_token_id)),t&&n.extend(t),n}_validate_model_class(){if(!this.can_generate){let e=[gg.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES,gg.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES,gg.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES,gg.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES].filter(Boolean),t=wg.get(this.constructor),n=/* @__PURE__ */ new Set,r=this.config.model_type;for(let t of e){let e=t?.get(r);e&&n.add(e)}let i=`The current model class (${t}) is not compatible with \`.generate()\`, as it doesn't have a language model head.`;throw n.size>0&&(i+=` Please use the following class instead: ${[...n].join(`, `)}`),Error(i)}}prepare_inputs_for_generation(...e){if(!this._prepare_inputs_for_generation)throw Error(`prepare_inputs_for_generation is not implemented for this model.`);return this._prepare_inputs_for_generation(this,...e)}_update_model_kwargs_for_generation({generated_input_ids:e,outputs:t,model_inputs:n,is_encoder_decoder:r}){return n.past_key_values=Og(t,n.past_key_values),n.input_ids=new H(`int64`,e.flat(),[e.length,1]),r?`decoder_attention_mask`in n&&(n.decoder_attention_mask=U([n.decoder_attention_mask,vu([n.decoder_attention_mask.dims[0],1])],1)):n.attention_mask=U([n.attention_mask,vu([n.attention_mask.dims[0],1])],1),n.position_ids=null,n}_prepare_model_inputs({inputs:e,bos_token_id:t,model_kwargs:n}){let r=ci(n,this.forward_params),i=this.main_input_name;if(i in r){if(e)throw Error("`inputs`: {inputs}` were passed alongside {input_name} which is not allowed. Make sure to either pass {inputs} or {input_name}=...")}else r[i]=e;return{inputs_tensor:r[i],model_inputs:r,model_input_name:i}}async _prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:e,model_inputs:t,model_input_name:n,generation_config:r}){if(this.sessions.model.inputNames.includes(`inputs_embeds`)&&!t.inputs_embeds&&`_prepare_inputs_embeds`in this){let{input_ids:e,pixel_values:n,attention_mask:r,...i}=t,a=await this._prepare_inputs_embeds(t);t={...i,...ci(a,[`inputs_embeds`,`attention_mask`])}}let{last_hidden_state:i}=await Eg(this,t);if(r.guidance_scale!==null&&r.guidance_scale>1)i=U([i,_u(i,0)],0),`attention_mask`in t&&(t.attention_mask=U([t.attention_mask,xu(t.attention_mask)],0));else if(t.decoder_input_ids){let e=vg(t.decoder_input_ids).dims[0];if(e!==i.dims[0]){if(i.dims[0]!==1)throw Error(`The encoder outputs have a different batch size (${i.dims[0]}) than the decoder inputs (${e}).`);i=U(Array.from({length:e},()=>i),0)}}return t.encoder_outputs=i,t}_prepare_decoder_input_ids_for_generation({batch_size:e,model_input_name:t,model_kwargs:n,decoder_start_token_id:r,bos_token_id:i,generation_config:a}){let{decoder_input_ids:o,...s}=n;if(!(o instanceof H)){if(o)Array.isArray(o[0])||(o=Array.from({length:e},()=>o));else if(r??=i,this.config.model_type===`musicgen`)o=Array.from({length:e*this.config.decoder.num_codebooks},()=>[r]);else if(Array.isArray(r)){if(r.length!==e)throw Error(`\`decoder_start_token_id\` expected to have length ${e} but got ${r.length}`);o=r}else o=Array.from({length:e},()=>[r]);o=vg(o)}return s.decoder_attention_mask=yu(o),{input_ids:o,model_inputs:s}}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,streamer:i=null,...a}){this._validate_model_class(),t=this._prepare_generation_config(t,a);let{inputs_tensor:o,model_inputs:s,model_input_name:c}=this._prepare_model_inputs({inputs:e,model_kwargs:a}),l=this.config.is_encoder_decoder;l&&(`encoder_outputs`in s||(s=await this._prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:o,model_inputs:s,model_input_name:c,generation_config:t})));let u;l?{input_ids:u,model_inputs:s}=this._prepare_decoder_input_ids_for_generation({batch_size:s[c].dims.at(0),model_input_name:c,model_kwargs:s,decoder_start_token_id:t.decoder_start_token_id,bos_token_id:t.bos_token_id,generation_config:t}):u=s[c];let d=u.dims.at(-1);t.max_new_tokens!==null&&(t.max_length=d+t.max_new_tokens);let f=this._get_logits_processor(t,d,n),p=this._get_stopping_criteria(t,r),m=s[c].dims.at(0),h=og.getSampler(t),g=Array(m).fill(0),_=u.tolist();i&&i.put(_);let v,y={},b={};for(;;){if(s=this.prepare_inputs_for_generation(_,s,t),v=await this.forward(s),t.return_dict_in_generate){if(t.output_attentions){let e=kg(v);for(let t in e)t in y||(y[t]=[]),y[t].push(e[t])}else this._return_dict_in_generate_keys&&Object.assign(b,ci(v,this._return_dict_in_generate_keys))}let e=f(_,v.logits.slice(null,-1,null).to(`float32`)),n=[];for(let t=0;te))break;s=this._update_model_kwargs_for_generation({generated_input_ids:n,outputs:v,model_inputs:s,is_encoder_decoder:l})}i&&i.end();let x=new H(`int64`,_.flat(),[_.length,_[0].length]),S=Og(v,s.past_key_values),C=new Set(Object.values(S));for(let e of Object.values(v))e.location===`gpu-buffer`&&!C.has(e)&&e.dispose();return`past_key_values`in a||t.return_dict_in_generate||await S.dispose(),t.return_dict_in_generate?{sequences:x,past_key_values:S,...y,...b}:x}async _encode_input(e,t,n){if(!Object.hasOwn(this.sessions,e))throw Error(`Model does not have a ${e} session.`);let r=this.sessions[e];return(await J(r,ci(t,r.inputNames)))[n]}async encode_image(e){return this._encode_input(`vision_encoder`,e,`image_features`)}async encode_text(e){return this._encode_input(`embed_tokens`,e,`inputs_embeds`)}async encode_audio(e){return this._encode_input(`audio_encoder`,e,`audio_features`)}};async function Tg(e,t){let{encoder_outputs:n,input_ids:r,decoder_input_ids:i,decoder_attention_mask:a,...o}=t;return n||=(await Eg(e,ci(t,e.sessions.model.inputNames))).last_hidden_state,o.input_ids=i,o.encoder_hidden_states=n,e.sessions.decoder_model_merged.inputNames.includes(`encoder_attention_mask`)&&(o.encoder_attention_mask=t.attention_mask),a&&!o.attention_mask&&(o.attention_mask=a),await Ng(e,o,!0)}async function Eg(e,t){let n=e.sessions.model,r=ci(t,n.inputNames);if(n.inputNames.includes(`inputs_embeds`)&&!r.inputs_embeds){if(!t.input_ids)throw Error("Both `input_ids` and `inputs_embeds` are missing in the model inputs.");r.inputs_embeds=await e.encode_text({input_ids:t.input_ids})}if(n.inputNames.includes(`token_type_ids`)&&!r.token_type_ids){if(!r.input_ids)throw Error("Both `input_ids` and `token_type_ids` are missing in the model inputs.");r.token_type_ids=xu(r.input_ids)}if(n.inputNames.includes(`pixel_mask`)&&!r.pixel_mask){if(!r.pixel_values)throw Error("Both `pixel_values` and `pixel_mask` are missing in the model inputs.");let e=r.pixel_values.dims;r.pixel_mask=vu([e[0],e[2],e[3]])}return await J(n,r)}async function Dg(e,t){let n=await e.encode(t);return await e.decode(n)}function Og(e,t){let n=/* @__PURE__ */ Object.create(null);for(let r in e)if(r.startsWith(`present`)){let i=r.replace(`present_ssm`,`past_ssm`).replace(`present_conv`,`past_conv`).replace(`present_recurrent`,`past_recurrent`).replace(`present_compressor`,`past_compressor`).replace(`present_indexer`,`past_indexer`).replace(`present`,`past_key_values`);n[i]=r.includes(`encoder`)&&t?t[i]:e[r]}return t?(t.update(n),t):new ug(n)}function kg(e){let t={};for(let n of[`cross_attentions`,`encoder_attentions`,`decoder_attentions`])for(let r in e)r.startsWith(n)&&(n in t||(t[n]=[]),t[n].push(e[r]));return t}function Ag(e,t){return e.map(e=>typeof e==`number`?e:t[e]??0)}function jg(e,t,n){if(n&&Object.keys(n).length>0)return Object.assign(t,n),n;let r=e.sessions.decoder_model_merged??e.sessions.model,i=(t[e.main_input_name]??t.attention_mask)?.dims?.[0]??1,a=yh(e.config),o=e.config?.normalized_config?.num_heads,s={batch_size:i};typeof o==`number`&&(s[`batch_size x num_heads`]=i*o);let c=/* @__PURE__ */ Object.create(null);for(let e of r.inputMetadata){if(!a.has(e.name))continue;let n=Ag(e.shape,s),r=n.reduce((e,t)=>e*t,1),i=Zl[e.type],o=new H(e.type,new i(r),n);t[e.name]=o,c[e.name]=o}return n?(n.update(c),n):new ug(c)}function Mg(e,t,n){t.num_logits_to_keep||(e.sessions.decoder_model_merged??e.sessions.model)?.inputNames.includes(`num_logits_to_keep`)&&(t.num_logits_to_keep=new H(`int64`,[n],[]))}async function Ng(e,t,n=!1){let r=e.sessions[n?`decoder_model_merged`:`model`],{past_key_values:i,...a}=t;return r.inputNames.includes(`use_cache_branch`)&&(a.use_cache_branch=yg(i!=null&&Object.keys(i).length>0)),r.inputNames.includes(`position_ids`)&&a.attention_mask&&!a.position_ids&&(a.position_ids=Rg(a,i,+!![`paligemma`,`gemma3_text`,`gemma3`].includes(e.config.model_type))),Mg(e,a,0n),jg(e,a,i),await J(r,ci(a,r.inputNames))}async function Pg(e,{encode_function:t,merge_function:n,modality_input_names:r,modality_output_name:i,input_ids:a=null,attention_mask:o=null,position_ids:s=null,inputs_embeds:c=null,past_key_values:l=null,generation_config:u=null,logits_processor:d=null,num_logits_to_keep:f=null,...p}){if(!c){c=await e.encode_text({input_ids:a,...p});let s=ci(p,r);if(Object.keys(s).length>0){if(a.dims[1]!==1){let e=await t({...s,...p});({inputs_embeds:c,attention_mask:o}=n({[i]:e,inputs_embeds:c,input_ids:a,attention_mask:o}))}else if(l&&a.dims[1]===1){let e=a.dims[1],t=l.get_seq_length();o=U([vu([a.dims[0],t]),o.slice(null,[o.dims[1]-e,o.dims[1]])],1)}}}if(!s&&[`qwen2_vl`,`qwen2_vl_text`,`qwen2_5_vl`,`qwen2_5_vl_text`,`qwen3_vl`,`qwen3_vl_text`,`qwen3_vl_moe`,`qwen3_vl_moe_text`,`qwen3_5`,`qwen3_5_text`,`qwen3_5_moe`,`qwen3_5_moe_text`,`glm_ocr`,`glm_ocr_text`].includes(e.config.model_type)){let{image_grid_thw:t,video_grid_thw:n}=p;[s]=e.get_rope_index(a,t,n,o)}return await Ng(e,{inputs_embeds:c,past_key_values:l,attention_mask:o,position_ids:s,generation_config:u,logits_processor:d,num_logits_to_keep:f},!0)}async function Fg(e,t){return await Pg(e,{...t,modality_input_names:[`audio_values`,`input_features`],modality_output_name:`audio_features`,encode_function:e.encode_audio.bind(e),merge_function:e._merge_input_ids_with_audio_features.bind(e)})}async function Ig(e,t){return await Pg(e,{...t,modality_input_names:[`pixel_values`],modality_output_name:`image_features`,encode_function:e.encode_image.bind(e),merge_function:e._merge_input_ids_with_image_features.bind(e)})}function Lg(e,t=0){let[n,r]=e.dims,i=e.data,a=new BigInt64Array(i.length);for(let e=0;ee.dims[1]||i[e.at(-1)])),Mg(e,n,1n),{...n,decoder_input_ids:vg(t)}}function Vg(e,...t){return e.config.is_encoder_decoder?Bg(e,...t):zg(e,...t)}function Hg({modality_token_id:e,inputs_embeds:t,modality_features:n,input_ids:r,attention_mask:i}){let a=r.tolist().map(t=>t.reduce((t,n,r)=>(n==e&&t.push(r),t),[])),o=a.reduce((e,t)=>e+t.length,0),s=n.dims[0];if(o!==s)throw Error(`Number of tokens and features do not match: tokens: ${o}, features ${s}`);let c=0;for(let e=0;e[r,await nl(e,t[r],!1,n)])))}var Kg={};Sr(Kg,{ASTForAudioClassification:()=>l_,ASTModel:()=>c_,ASTPreTrainedModel:()=>s_,AfmoeForCausalLM:()=>r_,AfmoeModel:()=>n_,AfmoePreTrainedModel:()=>t_,AlbertForMaskedLM:()=>Zg,AlbertForQuestionAnswering:()=>Xg,AlbertForSequenceClassification:()=>Yg,AlbertModel:()=>Jg,AlbertPreTrainedModel:()=>qg,ApertusForCausalLM:()=>e_,ApertusModel:()=>$g,ApertusPreTrainedModel:()=>Qg,ArceeForCausalLM:()=>o_,ArceeModel:()=>a_,ArceePreTrainedModel:()=>i_,BartForConditionalGeneration:()=>f_,BartForSequenceClassification:()=>p_,BartModel:()=>d_,BartPretrainedModel:()=>u_,BaseModelOutput:()=>Mh,BeitForImageClassification:()=>g_,BeitModel:()=>h_,BeitPreTrainedModel:()=>m_,BertForMaskedLM:()=>y_,BertForQuestionAnswering:()=>S_,BertForSequenceClassification:()=>b_,BertForTokenClassification:()=>x_,BertModel:()=>v_,BertPreTrainedModel:()=>__,BlenderbotForConditionalGeneration:()=>T_,BlenderbotModel:()=>w_,BlenderbotPreTrainedModel:()=>C_,BlenderbotSmallForConditionalGeneration:()=>O_,BlenderbotSmallModel:()=>D_,BlenderbotSmallPreTrainedModel:()=>E_,BloomForCausalLM:()=>j_,BloomModel:()=>A_,BloomPreTrainedModel:()=>k_,CHMv2ForDepthEstimation:()=>G_,CHMv2PreTrainedModel:()=>W_,CLIPModel:()=>Z_,CLIPPreTrainedModel:()=>X_,CLIPSegForImageSegmentation:()=>iv,CLIPSegModel:()=>rv,CLIPSegPreTrainedModel:()=>nv,CLIPTextModel:()=>Q_,CLIPTextModelWithProjection:()=>$_,CLIPVisionModel:()=>ev,CLIPVisionModelWithProjection:()=>tv,CamembertForMaskedLM:()=>P_,CamembertForQuestionAnswering:()=>L_,CamembertForSequenceClassification:()=>F_,CamembertForTokenClassification:()=>I_,CamembertModel:()=>N_,CamembertPreTrainedModel:()=>M_,CausalLMOutput:()=>Ih,CausalLMOutputWithPast:()=>Lh,ChatterboxModel:()=>V_,ChatterboxPreTrainedModel:()=>B_,ChineseCLIPModel:()=>U_,ChineseCLIPPreTrainedModel:()=>H_,ClapAudioModelWithProjection:()=>Y_,ClapModel:()=>q_,ClapPreTrainedModel:()=>K_,ClapTextModelWithProjection:()=>J_,CodeGenForCausalLM:()=>sv,CodeGenModel:()=>ov,CodeGenPreTrainedModel:()=>av,Cohere2ForCausalLM:()=>pv,Cohere2Model:()=>fv,Cohere2PreTrainedModel:()=>dv,CohereAsrForConditionalGeneration:()=>gv,CohereAsrModel:()=>hv,CohereAsrPreTrainedModel:()=>mv,CohereForCausalLM:()=>uv,CohereModel:()=>lv,CoherePreTrainedModel:()=>cv,ConvBertForMaskedLM:()=>yv,ConvBertForQuestionAnswering:()=>Sv,ConvBertForSequenceClassification:()=>bv,ConvBertForTokenClassification:()=>xv,ConvBertModel:()=>vv,ConvBertPreTrainedModel:()=>_v,ConvNextForImageClassification:()=>Tv,ConvNextModel:()=>wv,ConvNextPreTrainedModel:()=>Cv,ConvNextV2ForImageClassification:()=>Ov,ConvNextV2Model:()=>Dv,ConvNextV2PreTrainedModel:()=>Ev,DFineForObjectDetection:()=>Fv,DFineModel:()=>Pv,DFinePreTrainedModel:()=>Nv,DINOv3ConvNextModel:()=>Oy,DINOv3ConvNextPreTrainedModel:()=>Dy,DINOv3ViTModel:()=>Ay,DINOv3ViTPreTrainedModel:()=>ky,DPTForDepthEstimation:()=>Vy,DPTModel:()=>By,DPTPreTrainedModel:()=>zy,DacDecoderModel:()=>Vv,DacDecoderOutput:()=>Lv,DacEncoderModel:()=>Bv,DacEncoderOutput:()=>Iv,DacModel:()=>zv,DacPreTrainedModel:()=>Rv,DebertaForMaskedLM:()=>Wv,DebertaForQuestionAnswering:()=>qv,DebertaForSequenceClassification:()=>Gv,DebertaForTokenClassification:()=>Kv,DebertaModel:()=>Uv,DebertaPreTrainedModel:()=>Hv,DebertaV2ForMaskedLM:()=>ny,DebertaV2ForQuestionAnswering:()=>ay,DebertaV2ForSequenceClassification:()=>ry,DebertaV2ForTokenClassification:()=>iy,DebertaV2Model:()=>ty,DebertaV2PreTrainedModel:()=>ey,DecisionTransformerModel:()=>sy,DecisionTransformerPreTrainedModel:()=>oy,DeepseekV3ForCausalLM:()=>Xv,DeepseekV3Model:()=>Yv,DeepseekV3PreTrainedModel:()=>Jv,DeepseekV4ForCausalLM:()=>$v,DeepseekV4Model:()=>Qv,DeepseekV4PreTrainedModel:()=>Zv,DeiTForImageClassification:()=>uy,DeiTModel:()=>ly,DeiTPreTrainedModel:()=>cy,DepthAnythingForDepthEstimation:()=>fy,DepthAnythingPreTrainedModel:()=>dy,DepthProForDepthEstimation:()=>my,DepthProPreTrainedModel:()=>py,DetrForObjectDetection:()=>_y,DetrForSegmentation:()=>vy,DetrModel:()=>gy,DetrObjectDetectionOutput:()=>yy,DetrPreTrainedModel:()=>hy,DetrSegmentationOutput:()=>by,Dinov2ForImageClassification:()=>Cy,Dinov2Model:()=>Sy,Dinov2PreTrainedModel:()=>xy,Dinov2WithRegistersForImageClassification:()=>Ey,Dinov2WithRegistersModel:()=>Ty,Dinov2WithRegistersPreTrainedModel:()=>wy,DistilBertForMaskedLM:()=>Iy,DistilBertForQuestionAnswering:()=>Fy,DistilBertForSequenceClassification:()=>Ny,DistilBertForTokenClassification:()=>Py,DistilBertModel:()=>My,DistilBertPreTrainedModel:()=>jy,DonutSwinModel:()=>Ry,DonutSwinPreTrainedModel:()=>Ly,EdgeTamModel:()=>OE,EfficientNetForImageClassification:()=>Wy,EfficientNetModel:()=>Uy,EfficientNetPreTrainedModel:()=>Hy,ElectraForMaskedLM:()=>qy,ElectraForQuestionAnswering:()=>Xy,ElectraForSequenceClassification:()=>Jy,ElectraForTokenClassification:()=>Yy,ElectraModel:()=>Ky,ElectraPreTrainedModel:()=>Gy,Ernie4_5ForCausalLM:()=>$y,Ernie4_5Model:()=>Qy,Ernie4_5PretrainedModel:()=>Zy,EsmForMaskedLM:()=>nb,EsmForSequenceClassification:()=>rb,EsmForTokenClassification:()=>ib,EsmModel:()=>tb,EsmPreTrainedModel:()=>eb,EuroBertForMaskedLM:()=>sb,EuroBertForSequenceClassification:()=>cb,EuroBertForTokenClassification:()=>lb,EuroBertModel:()=>ob,EuroBertPreTrainedModel:()=>ab,ExaoneForCausalLM:()=>fb,ExaoneModel:()=>db,ExaonePreTrainedModel:()=>ub,FalconForCausalLM:()=>hb,FalconH1ForCausalLM:()=>vb,FalconH1Model:()=>_b,FalconH1PreTrainedModel:()=>gb,FalconModel:()=>mb,FalconPreTrainedModel:()=>pb,FastViTForImageClassification:()=>xb,FastViTModel:()=>bb,FastViTPreTrainedModel:()=>yb,Florence2ForConditionalGeneration:()=>Cb,Florence2PreTrainedModel:()=>Sb,GLPNForDepthEstimation:()=>rx,GLPNModel:()=>nx,GLPNPreTrainedModel:()=>tx,GPT2LMHeadModel:()=>vx,GPT2Model:()=>_x,GPT2PreTrainedModel:()=>gx,GPTBigCodeForCausalLM:()=>ox,GPTBigCodeModel:()=>ax,GPTBigCodePreTrainedModel:()=>ix,GPTJForCausalLM:()=>xx,GPTJModel:()=>bx,GPTJPreTrainedModel:()=>yx,GPTNeoForCausalLM:()=>lx,GPTNeoModel:()=>cx,GPTNeoPreTrainedModel:()=>sx,GPTNeoXForCausalLM:()=>fx,GPTNeoXModel:()=>dx,GPTNeoXPreTrainedModel:()=>ux,Gemma2ForCausalLM:()=>kb,Gemma2Model:()=>Ob,Gemma2PreTrainedModel:()=>Db,Gemma3ForCausalLM:()=>Lb,Gemma3ForConditionalGeneration:()=>Ib,Gemma3Model:()=>Fb,Gemma3PreTrainedModel:()=>Pb,Gemma3nForCausalLM:()=>Bb,Gemma3nForConditionalGeneration:()=>zb,Gemma3nPreTrainedModel:()=>Rb,Gemma4ForCausalLM:()=>Hb,Gemma4ForConditionalGeneration:()=>Vb,GemmaForCausalLM:()=>Eb,GemmaModel:()=>Tb,GemmaPreTrainedModel:()=>wb,GlmForCausalLM:()=>Gb,GlmModel:()=>Wb,GlmMoeDsaForCausalLM:()=>Jb,GlmMoeDsaModel:()=>qb,GlmMoeDsaPreTrainedModel:()=>Kb,GlmOcrForConditionalGeneration:()=>ex,GlmPreTrainedModel:()=>Ub,GptOssForCausalLM:()=>hx,GptOssModel:()=>mx,GptOssPreTrainedModel:()=>px,GraniteForCausalLM:()=>wx,GraniteModel:()=>Cx,GraniteMoeHybridForCausalLM:()=>Dx,GraniteMoeHybridModel:()=>Ex,GraniteMoeHybridPreTrainedModel:()=>Tx,GranitePreTrainedModel:()=>Sx,GraniteSpeechForConditionalGeneration:()=>Ax,GroundingDinoForObjectDetection:()=>Mx,GroundingDinoPreTrainedModel:()=>jx,GroupViTModel:()=>Px,GroupViTPreTrainedModel:()=>Nx,HeliumForCausalLM:()=>Lx,HeliumModel:()=>Ix,HeliumPreTrainedModel:()=>Fx,HieraForImageClassification:()=>Bx,HieraModel:()=>zx,HieraPreTrainedModel:()=>Rx,HrmTextForCausalLM:()=>Ux,HrmTextModel:()=>Hx,HrmTextPreTrainedModel:()=>Vx,HubertForCTC:()=>Zx,HubertForSequenceClassification:()=>Qx,HubertModel:()=>Xx,HubertPreTrainedModel:()=>Yx,HunYuanDenseV1ForCausalLM:()=>tS,HunYuanDenseV1Model:()=>eS,HunYuanDenseV1PreTrainedModel:()=>$x,IJepaForImageClassification:()=>aS,IJepaModel:()=>iS,IJepaPreTrainedModel:()=>rS,Idefics3ForConditionalGeneration:()=>nS,ImageMattingOutput:()=>zh,JAISLMHeadModel:()=>cS,JAISModel:()=>sS,JAISPreTrainedModel:()=>oS,JinaCLIPModel:()=>uS,JinaCLIPPreTrainedModel:()=>lS,JinaCLIPTextModel:()=>dS,JinaCLIPVisionModel:()=>fS,Lfm2ForCausalLM:()=>hS,Lfm2Model:()=>mS,Lfm2MoeForCausalLM:()=>yS,Lfm2MoeModel:()=>vS,Lfm2MoePreTrainedModel:()=>_S,Lfm2PreTrainedModel:()=>pS,Lfm2VlForConditionalGeneration:()=>bS,LightOnOcrForConditionalGeneration:()=>gS,LiteWhisperForConditionalGeneration:()=>LO,Llama4ForCausalLM:()=>TS,Llama4PreTrainedModel:()=>wS,LlamaForCausalLM:()=>CS,LlamaModel:()=>SS,LlamaPreTrainedModel:()=>xS,LlavaForConditionalGeneration:()=>jb,LlavaOnevisionForConditionalGeneration:()=>jb,LlavaPreTrainedModel:()=>Ab,LlavaQwen2ForCausalLM:()=>Nb,LongT5ForConditionalGeneration:()=>OS,LongT5Model:()=>DS,LongT5PreTrainedModel:()=>ES,M2M100ForConditionalGeneration:()=>jS,M2M100Model:()=>AS,M2M100PreTrainedModel:()=>kS,MBartForCausalLM:()=>HS,MBartForConditionalGeneration:()=>BS,MBartForSequenceClassification:()=>VS,MBartModel:()=>zS,MBartPreTrainedModel:()=>RS,MPNetForMaskedLM:()=>iw,MPNetForQuestionAnswering:()=>sw,MPNetForSequenceClassification:()=>aw,MPNetForTokenClassification:()=>ow,MPNetModel:()=>rw,MPNetPreTrainedModel:()=>nw,MT5ForConditionalGeneration:()=>pw,MT5Model:()=>fw,MT5PreTrainedModel:()=>dw,MarianMTModel:()=>PS,MarianModel:()=>NS,MarianPreTrainedModel:()=>MS,MaskFormerForInstanceSegmentation:()=>LS,MaskFormerModel:()=>IS,MaskFormerPreTrainedModel:()=>FS,MaskedLMOutput:()=>Ph,Metric3DForDepthEstimation:()=>WS,Metric3DPreTrainedModel:()=>US,Metric3Dv2ForDepthEstimation:()=>KS,Metric3Dv2PreTrainedModel:()=>GS,MgpstrForSceneTextRecognition:()=>YS,MgpstrModelOutput:()=>qS,MgpstrPreTrainedModel:()=>JS,MimiDecoderModel:()=>tC,MimiDecoderOutput:()=>ZS,MimiEncoderModel:()=>eC,MimiEncoderOutput:()=>XS,MimiModel:()=>$S,MimiPreTrainedModel:()=>QS,Ministral3ForCausalLM:()=>sC,Ministral3Model:()=>oC,Ministral3PreTrainedModel:()=>aC,MinistralForCausalLM:()=>iC,MinistralModel:()=>rC,MinistralPreTrainedModel:()=>nC,Mistral3ForConditionalGeneration:()=>dC,Mistral4ForCausalLM:()=>mC,Mistral4Model:()=>pC,Mistral4PreTrainedModel:()=>fC,MistralForCausalLM:()=>uC,MistralModel:()=>lC,MistralPreTrainedModel:()=>cC,MobileBertForMaskedLM:()=>_C,MobileBertForQuestionAnswering:()=>yC,MobileBertForSequenceClassification:()=>vC,MobileBertModel:()=>gC,MobileBertPreTrainedModel:()=>hC,MobileLLMForCausalLM:()=>SC,MobileLLMModel:()=>xC,MobileLLMPreTrainedModel:()=>bC,MobileNetV1ForImageClassification:()=>TC,MobileNetV1ForSemanticSegmentation:()=>EC,MobileNetV1Model:()=>wC,MobileNetV1PreTrainedModel:()=>CC,MobileNetV2ForImageClassification:()=>kC,MobileNetV2ForSemanticSegmentation:()=>AC,MobileNetV2Model:()=>OC,MobileNetV2PreTrainedModel:()=>DC,MobileNetV3ForImageClassification:()=>NC,MobileNetV3ForSemanticSegmentation:()=>PC,MobileNetV3Model:()=>MC,MobileNetV3PreTrainedModel:()=>jC,MobileNetV4ForImageClassification:()=>LC,MobileNetV4ForSemanticSegmentation:()=>RC,MobileNetV4Model:()=>IC,MobileNetV4PreTrainedModel:()=>FC,MobileViTForImageClassification:()=>VC,MobileViTModel:()=>BC,MobileViTPreTrainedModel:()=>zC,MobileViTV2ForImageClassification:()=>WC,MobileViTV2Model:()=>UC,MobileViTV2PreTrainedModel:()=>HC,ModelOutput:()=>jh,ModernBertDecoderForCausalLM:()=>QC,ModernBertDecoderModel:()=>ZC,ModernBertDecoderPreTrainedModel:()=>XC,ModernBertForMaskedLM:()=>qC,ModernBertForSequenceClassification:()=>JC,ModernBertForTokenClassification:()=>YC,ModernBertModel:()=>KC,ModernBertPreTrainedModel:()=>GC,Moondream1ForConditionalGeneration:()=>Mb,MoonshineForConditionalGeneration:()=>tw,MoonshineModel:()=>ew,MoonshinePreTrainedModel:()=>$C,MptForCausalLM:()=>uw,MptModel:()=>lw,MptPreTrainedModel:()=>cw,MultiModalityCausalLM:()=>hw,MultiModalityPreTrainedModel:()=>mw,MusicgenForCausalLM:()=>vw,MusicgenForConditionalGeneration:()=>yw,MusicgenModel:()=>_w,MusicgenPreTrainedModel:()=>gw,NanoChatForCausalLM:()=>Sw,NanoChatModel:()=>xw,NanoChatPreTrainedModel:()=>bw,NemotronHForCausalLM:()=>Tw,NemotronHModel:()=>ww,NemotronHPreTrainedModel:()=>Cw,NeoBertForMaskedLM:()=>Ow,NeoBertForQuestionAnswering:()=>jw,NeoBertForSequenceClassification:()=>kw,NeoBertForTokenClassification:()=>Aw,NeoBertModel:()=>Dw,NeoBertPreTrainedModel:()=>Ew,NomicBertModel:()=>Nw,NomicBertPreTrainedModel:()=>Mw,OPTForCausalLM:()=>eT,OPTModel:()=>$w,OPTPreTrainedModel:()=>Qw,Olmo2ForCausalLM:()=>zw,Olmo2Model:()=>Rw,Olmo2PreTrainedModel:()=>Lw,Olmo3ForCausalLM:()=>Hw,Olmo3Model:()=>Vw,Olmo3PreTrainedModel:()=>Bw,OlmoForCausalLM:()=>Iw,OlmoHybridForCausalLM:()=>Gw,OlmoHybridModel:()=>Ww,OlmoHybridPreTrainedModel:()=>Uw,OlmoModel:()=>Fw,OlmoPreTrainedModel:()=>Pw,OpenAIPrivacyFilterForTokenClassification:()=>Jw,OpenAIPrivacyFilterModel:()=>qw,OpenAIPrivacyFilterPreTrainedModel:()=>Kw,OpenELMForCausalLM:()=>Zw,OpenELMModel:()=>Xw,OpenELMPreTrainedModel:()=>Yw,OwlViTForObjectDetection:()=>oT,OwlViTModel:()=>aT,OwlViTPreTrainedModel:()=>iT,Owlv2ForObjectDetection:()=>rT,Owlv2Model:()=>nT,Owlv2PreTrainedModel:()=>tT,PaliGemmaForConditionalGeneration:()=>sT,ParakeetForCTC:()=>lT,ParakeetPreTrainedModel:()=>cT,PatchTSMixerForPrediction:()=>fT,PatchTSMixerModel:()=>dT,PatchTSMixerPreTrainedModel:()=>uT,PatchTSTForPrediction:()=>hT,PatchTSTModel:()=>mT,PatchTSTPreTrainedModel:()=>pT,Phi3ForCausalLM:()=>xT,Phi3Model:()=>bT,Phi3PreTrainedModel:()=>yT,Phi3VForCausalLM:()=>CT,Phi3VPreTrainedModel:()=>ST,PhiForCausalLM:()=>vT,PhiModel:()=>_T,PhiPreTrainedModel:()=>gT,PreTrainedModel:()=>Z,PvtForImageClassification:()=>ET,PvtModel:()=>TT,PvtPreTrainedModel:()=>wT,PyAnnoteForAudioFrameClassification:()=>kT,PyAnnoteModel:()=>OT,PyAnnotePreTrainedModel:()=>DT,QuestionAnsweringModelOutput:()=>Fh,Qwen2ForCausalLM:()=>MT,Qwen2Model:()=>jT,Qwen2MoeForCausalLM:()=>FT,Qwen2MoeModel:()=>PT,Qwen2MoePreTrainedModel:()=>NT,Qwen2PreTrainedModel:()=>AT,Qwen2VLForCausalLM:()=>Zb,Qwen2VLForConditionalGeneration:()=>Xb,Qwen2VLPreTrainedModel:()=>Yb,Qwen2_5_VLForCausalLM:()=>$b,Qwen2_5_VLForConditionalGeneration:()=>Qb,Qwen3ForCausalLM:()=>RT,Qwen3Model:()=>LT,Qwen3MoeForCausalLM:()=>VT,Qwen3MoeModel:()=>BT,Qwen3MoePreTrainedModel:()=>zT,Qwen3NextForCausalLM:()=>WT,Qwen3NextModel:()=>UT,Qwen3NextPreTrainedModel:()=>HT,Qwen3PreTrainedModel:()=>IT,Qwen3VLForCausalLM:()=>KT,Qwen3VLForConditionalGeneration:()=>GT,Qwen3VLMoeForCausalLM:()=>JT,Qwen3VLMoeForConditionalGeneration:()=>qT,Qwen3_5ForCausalLM:()=>XT,Qwen3_5ForConditionalGeneration:()=>YT,Qwen3_5MoeForCausalLM:()=>QT,Qwen3_5MoeForConditionalGeneration:()=>ZT,RFDetrForObjectDetection:()=>iE,RFDetrModel:()=>rE,RFDetrObjectDetectionOutput:()=>aE,RFDetrPreTrainedModel:()=>nE,RTDetrForObjectDetection:()=>jv,RTDetrModel:()=>Av,RTDetrObjectDetectionOutput:()=>Mv,RTDetrPreTrainedModel:()=>kv,RTDetrV2ForObjectDetection:()=>bE,RTDetrV2Model:()=>yE,RTDetrV2ObjectDetectionOutput:()=>xE,RTDetrV2PreTrainedModel:()=>vE,ResNetForImageClassification:()=>tE,ResNetModel:()=>eE,ResNetPreTrainedModel:()=>$T,RoFormerForMaskedLM:()=>mE,RoFormerForQuestionAnswering:()=>_E,RoFormerForSequenceClassification:()=>hE,RoFormerForTokenClassification:()=>gE,RoFormerModel:()=>pE,RoFormerPreTrainedModel:()=>fE,RobertaForMaskedLM:()=>cE,RobertaForQuestionAnswering:()=>dE,RobertaForSequenceClassification:()=>lE,RobertaForTokenClassification:()=>uE,RobertaModel:()=>sE,RobertaPreTrainedModel:()=>oE,Sam2ImageSegmentationOutput:()=>TE,Sam2Model:()=>DE,Sam2PreTrainedModel:()=>EE,Sam3TrackerModel:()=>kE,SamImageSegmentationOutput:()=>SE,SamModel:()=>wE,SamPreTrainedModel:()=>CE,SapiensForDepthEstimation:()=>ME,SapiensForNormalEstimation:()=>NE,SapiensForSemanticSegmentation:()=>jE,SapiensPreTrainedModel:()=>AE,SegformerForImageClassification:()=>IE,SegformerForSemanticSegmentation:()=>LE,SegformerModel:()=>FE,SegformerPreTrainedModel:()=>PE,Seq2SeqLMOutput:()=>Rh,SequenceClassifierOutput:()=>Y,SiglipModel:()=>zE,SiglipPreTrainedModel:()=>RE,SiglipTextModel:()=>BE,SiglipVisionModel:()=>VE,SmolLM3ForCausalLM:()=>WE,SmolLM3Model:()=>UE,SmolLM3PreTrainedModel:()=>HE,SmolVLMForConditionalGeneration:()=>GE,SnacDecoderModel:()=>YE,SnacEncoderModel:()=>JE,SnacModel:()=>qE,SnacPreTrainedModel:()=>KE,SolarOpenForCausalLM:()=>QE,SolarOpenModel:()=>ZE,SolarOpenPreTrainedModel:()=>XE,SpeechT5ForSpeechToText:()=>tD,SpeechT5ForTextToSpeech:()=>nD,SpeechT5HifiGan:()=>rD,SpeechT5Model:()=>eD,SpeechT5PreTrainedModel:()=>$E,SqueezeBertForMaskedLM:()=>oD,SqueezeBertForQuestionAnswering:()=>cD,SqueezeBertForSequenceClassification:()=>sD,SqueezeBertModel:()=>aD,SqueezeBertPreTrainedModel:()=>iD,StableLmForCausalLM:()=>dD,StableLmModel:()=>uD,StableLmPreTrainedModel:()=>lD,Starcoder2ForCausalLM:()=>mD,Starcoder2Model:()=>pD,Starcoder2PreTrainedModel:()=>fD,StyleTextToSpeech2Model:()=>gD,StyleTextToSpeech2PreTrainedModel:()=>hD,SupertonicForConditionalGeneration:()=>vD,SupertonicPreTrainedModel:()=>_D,Swin2SRForImageSuperResolution:()=>TD,Swin2SRModel:()=>wD,Swin2SRPreTrainedModel:()=>CD,SwinForImageClassification:()=>xD,SwinForSemanticSegmentation:()=>SD,SwinModel:()=>bD,SwinPreTrainedModel:()=>yD,T5ForConditionalGeneration:()=>OD,T5Model:()=>DD,T5PreTrainedModel:()=>ED,TableTransformerForObjectDetection:()=>jD,TableTransformerModel:()=>AD,TableTransformerObjectDetectionOutput:()=>MD,TableTransformerPreTrainedModel:()=>kD,TokenClassifierOutput:()=>Nh,TrOCRForCausalLM:()=>PD,TrOCRPreTrainedModel:()=>ND,UltravoxModel:()=>kx,UltravoxPreTrainedModel:()=>Ox,UniSpeechForCTC:()=>LD,UniSpeechForSequenceClassification:()=>RD,UniSpeechModel:()=>ID,UniSpeechPreTrainedModel:()=>FD,UniSpeechSatForAudioFrameClassification:()=>UD,UniSpeechSatForCTC:()=>VD,UniSpeechSatForSequenceClassification:()=>HD,UniSpeechSatModel:()=>BD,UniSpeechSatPreTrainedModel:()=>zD,VaultGemmaForCausalLM:()=>KD,VaultGemmaModel:()=>GD,VaultGemmaPreTrainedModel:()=>WD,ViTForImageClassification:()=>XD,ViTMAEModel:()=>QD,ViTMAEPreTrainedModel:()=>ZD,ViTMSNForImageClassification:()=>tO,ViTMSNModel:()=>eO,ViTMSNPreTrainedModel:()=>$D,ViTModel:()=>YD,ViTPreTrainedModel:()=>JD,VisionEncoderDecoderModel:()=>qD,VitMatteForImageMatting:()=>rO,VitMattePreTrainedModel:()=>nO,VitPoseForPoseEstimation:()=>aO,VitPosePreTrainedModel:()=>iO,VitsModel:()=>cO,VitsModelOutput:()=>oO,VitsPreTrainedModel:()=>sO,VoxtralForConditionalGeneration:()=>lO,VoxtralRealtimeForConditionalGeneration:()=>yO,VoxtralRealtimePreTrainedModel:()=>vO,Wav2Vec2BertForCTC:()=>SO,Wav2Vec2BertForSequenceClassification:()=>CO,Wav2Vec2BertModel:()=>xO,Wav2Vec2BertPreTrainedModel:()=>bO,Wav2Vec2ForAudioFrameClassification:()=>Jx,Wav2Vec2ForCTC:()=>Kx,Wav2Vec2ForSequenceClassification:()=>qx,Wav2Vec2Model:()=>Gx,Wav2Vec2PreTrainedModel:()=>Wx,WavLMForAudioFrameClassification:()=>AO,WavLMForCTC:()=>DO,WavLMForSequenceClassification:()=>OO,WavLMForXVector:()=>kO,WavLMModel:()=>EO,WavLMPreTrainedModel:()=>TO,WeSpeakerResNetModel:()=>MO,WeSpeakerResNetPreTrainedModel:()=>jO,WhisperForConditionalGeneration:()=>IO,WhisperModel:()=>FO,WhisperPreTrainedModel:()=>PO,XLMForQuestionAnswering:()=>UO,XLMForSequenceClassification:()=>VO,XLMForTokenClassification:()=>HO,XLMModel:()=>zO,XLMPreTrainedModel:()=>RO,XLMRobertaForMaskedLM:()=>KO,XLMRobertaForQuestionAnswering:()=>YO,XLMRobertaForSequenceClassification:()=>qO,XLMRobertaForTokenClassification:()=>JO,XLMRobertaModel:()=>GO,XLMRobertaPreTrainedModel:()=>WO,XLMWithLMHeadModel:()=>BO,XVectorOutput:()=>wO,YolosForObjectDetection:()=>QO,YolosModel:()=>ZO,YolosObjectDetectionOutput:()=>$O,YolosPreTrainedModel:()=>XO,YoutuForCausalLM:()=>nk,YoutuModel:()=>tk,YoutuPreTrainedModel:()=>ek,ZayaForCausalLM:()=>ak,ZayaModel:()=>ik,ZayaPreTrainedModel:()=>rk});var qg=class extends Z{},Jg=class extends qg{},Yg=class extends qg{async _call(e){return new Y(await super._call(e))}},Xg=class extends qg{async _call(e){return new Fh(await super._call(e))}},Zg=class extends qg{async _call(e){return new Ph(await super._call(e))}},Qg=class extends Z{},$g=class extends Qg{},e_=class extends Qg{},t_=class extends Z{},n_=class extends t_{},r_=class extends t_{},i_=class extends Z{},a_=class extends i_{},o_=class extends i_{},s_=class extends Z{},c_=class extends s_{},l_=class extends s_{},u_=class extends Z{},d_=class extends u_{},f_=class extends u_{},p_=class extends u_{async _call(e){return new Y(await super._call(e))}},m_=class extends Z{},h_=class extends m_{},g_=class extends m_{async _call(e){return new Y(await super._call(e))}},__=class extends Z{},v_=class extends __{},y_=class extends __{async _call(e){return new Ph(await super._call(e))}},b_=class extends __{async _call(e){return new Y(await super._call(e))}},x_=class extends __{async _call(e){return new Nh(await super._call(e))}},S_=class extends __{async _call(e){return new Fh(await super._call(e))}},C_=class extends Z{},w_=class extends C_{},T_=class extends C_{},E_=class extends Z{},D_=class extends E_{},O_=class extends E_{},k_=class extends Z{},A_=class extends k_{},j_=class extends k_{},M_=class extends Z{},N_=class extends M_{},P_=class extends M_{async _call(e){return new Ph(await super._call(e))}},F_=class extends M_{async _call(e){return new Y(await super._call(e))}},I_=class extends M_{async _call(e){return new Nh(await super._call(e))}},L_=class extends M_{async _call(e){return new Fh(await super._call(e))}},R_=4299n,z_=6561n,B_=class extends Z{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`audio_values`,`exaggeration`,`audio_features`,`audio_tokens`,`speaker_embeddings`,`speaker_features`,`past_key_values`];main_input_name=`input_ids`;_return_dict_in_generate_keys=[`audio_tokens`,`speaker_embeddings`,`speaker_features`]},V_=class extends B_{async encode_speech(e){return J(this.sessions.speech_encoder,{audio_values:e})}async forward({input_ids:e=null,attention_mask:t=null,audio_values:n=null,exaggeration:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,audio_features:u=null,audio_tokens:d=null,speaker_embeddings:f=null,speaker_features:p=null,...m}){let h;if(!a){let s=this.sessions.embed_tokens.inputNames,c={input_ids:e};if(s.includes(`exaggeration`)){if(!(r instanceof H)){let t=e.dims[0];if(r==null)r=gu([t],.5);else if(typeof r==`number`)r=gu([t],r);else if(Array.isArray(r))r=new H(`float32`,r,[t]);else throw Error("Unsupported type for `exaggeration` input")}c.exaggeration=r}if(s.includes(`position_ids`)&&(c.position_ids=i),{inputs_embeds:a}=await J(this.sessions.embed_tokens,c),u&&d&&f&&p&&(h={audio_features:u,audio_tokens:d,speaker_embeddings:f,speaker_features:p}),h||n)h??=await this.encode_speech(n),a=U([h.audio_features,a],1),t=vu([a.dims[0],a.dims[1]]);else{let e=a.dims[1];if(!o||e!==1)throw Error(`Incorrect state encountered during generation.`);let n=o.get_seq_length();t=vu([a.dims[0],n+e])}}return{...await Ng(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1),...h}}prepare_inputs_for_generation(e,t,n){return!t.position_ids&&this.sessions.embed_tokens.inputNames.includes(`position_ids`)&&(t.position_ids=t.input_ids.dims[1]===1?new H(`int64`,Array.from({length:e.length},(t,n)=>e[n].length-e[n].findLastIndex(e=>e==z_)-1),[e.length,1]):new H(`int64`,t.input_ids.tolist().map(e=>{let t=0;return e.map(e=>e>=z_?0:t++)}).flat(),t.input_ids.dims)),t.input_ids.dims[1]===1&&(delete t.audio_values,delete t.audio_features,delete t.audio_tokens,delete t.speaker_embeddings,delete t.speaker_features),zg(this,e,t,n)}async generate(e){let t=e.past_key_values,{sequences:n,audio_tokens:r,speaker_embeddings:i,speaker_features:a,past_key_values:o}=await super.generate({...e,return_dict_in_generate:!0});try{let t=n.slice(null,[e.input_ids.dims[1],-1]),o=U([r,t,gu([t.dims[0],3],R_)],1),{waveform:s}=await J(this.sessions.conditional_decoder,{speech_tokens:o,speaker_features:a,speaker_embeddings:i});return s}finally{o!==t&&await o?.dispose()}}},H_=class extends Z{},U_=class extends H_{},W_=class extends Z{},G_=class extends W_{},K_=class extends Z{},q_=class extends K_{},J_=class extends K_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},Y_=class extends K_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`audio_model`})}},X_=class extends Z{},Z_=class extends X_{},Q_=class extends X_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},$_=class extends X_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},ev=class extends X_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},tv=class extends X_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},nv=class extends Z{},rv=class extends nv{},iv=class extends nv{},av=class extends Z{},ov=class extends av{},sv=class extends av{},cv=class extends Z{},lv=class extends cv{},uv=class extends cv{},dv=class extends Z{},fv=class extends dv{},pv=class extends dv{},mv=class extends Z{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},hv=class extends mv{},gv=class extends mv{},_v=class extends Z{},vv=class extends _v{},yv=class extends _v{async _call(e){return new Ph(await super._call(e))}},bv=class extends _v{async _call(e){return new Y(await super._call(e))}},xv=class extends _v{async _call(e){return new Nh(await super._call(e))}},Sv=class extends _v{async _call(e){return new Fh(await super._call(e))}},Cv=class extends Z{},wv=class extends Cv{},Tv=class extends Cv{async _call(e){return new Y(await super._call(e))}},Ev=class extends Z{},Dv=class extends Ev{},Ov=class extends Ev{async _call(e){return new Y(await super._call(e))}},kv=class extends Z{},Av=class extends kv{},jv=class extends kv{async _call(e){return new Mv(await super._call(e))}},Mv=class extends jh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},Nv=class extends Z{},Pv=class extends Nv{},Fv=class extends Nv{async _call(e){return new Mv(await super._call(e))}},Iv=class extends jh{constructor({audio_codes:e}){super(),this.audio_codes=e}},Lv=class extends jh{constructor({audio_values:e}){super(),this.audio_values=e}},Rv=class extends Z{main_input_name=`input_values`;forward_params=[`input_values`]},zv=class extends Rv{async encode(e){return new Iv(await J(this.sessions.encoder_model,e))}async decode(e){return new Lv(await J(this.sessions.decoder_model,e))}},Bv=class extends Rv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},Vv=class extends Rv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},Hv=class extends Z{},Uv=class extends Hv{},Wv=class extends Hv{async _call(e){return new Ph(await super._call(e))}},Gv=class extends Hv{async _call(e){return new Y(await super._call(e))}},Kv=class extends Hv{async _call(e){return new Nh(await super._call(e))}},qv=class extends Hv{async _call(e){return new Fh(await super._call(e))}},Jv=class extends Z{},Yv=class extends Jv{},Xv=class extends Jv{},Zv=class extends Z{},Qv=class extends Zv{},$v=class extends Zv{},ey=class extends Z{},ty=class extends ey{},ny=class extends ey{async _call(e){return new Ph(await super._call(e))}},ry=class extends ey{async _call(e){return new Y(await super._call(e))}},iy=class extends ey{async _call(e){return new Nh(await super._call(e))}},ay=class extends ey{async _call(e){return new Fh(await super._call(e))}},oy=class extends Z{},sy=class extends oy{},cy=class extends Z{},ly=class extends cy{},uy=class extends cy{async _call(e){return new Y(await super._call(e))}},dy=class extends Z{},fy=class extends dy{},py=class extends Z{},my=class extends py{},hy=class extends Z{},gy=class extends hy{},_y=class extends hy{async _call(e){return new yy(await super._call(e))}},vy=class extends hy{async _call(e){return new by(await super._call(e))}},yy=class extends jh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},by=class extends jh{constructor({logits:e,pred_boxes:t,pred_masks:n}){super(),this.logits=e,this.pred_boxes=t,this.pred_masks=n}},xy=class extends Z{},Sy=class extends xy{},Cy=class extends xy{async _call(e){return new Y(await super._call(e))}},wy=class extends Z{},Ty=class extends wy{},Ey=class extends wy{async _call(e){return new Y(await super._call(e))}},Dy=class extends Z{},Oy=class extends Dy{},ky=class extends Z{},Ay=class extends ky{},jy=class extends Z{},My=class extends jy{},Ny=class extends jy{async _call(e){return new Y(await super._call(e))}},Py=class extends jy{async _call(e){return new Nh(await super._call(e))}},Fy=class extends jy{async _call(e){return new Fh(await super._call(e))}},Iy=class extends jy{async _call(e){return new Ph(await super._call(e))}},Ly=class extends Z{},Ry=class extends Ly{},zy=class extends Z{},By=class extends zy{},Vy=class extends zy{},Hy=class extends Z{},Uy=class extends Hy{},Wy=class extends Hy{async _call(e){return new Y(await super._call(e))}},Gy=class extends Z{},Ky=class extends Gy{},qy=class extends Gy{async _call(e){return new Ph(await super._call(e))}},Jy=class extends Gy{async _call(e){return new Y(await super._call(e))}},Yy=class extends Gy{async _call(e){return new Nh(await super._call(e))}},Xy=class extends Gy{async _call(e){return new Fh(await super._call(e))}},Zy=class extends Z{},Qy=class extends Zy{},$y=class extends Zy{},eb=class extends Z{},tb=class extends eb{},nb=class extends eb{async _call(e){return new Ph(await super._call(e))}},rb=class extends eb{async _call(e){return new Y(await super._call(e))}},ib=class extends eb{async _call(e){return new Nh(await super._call(e))}},ab=class extends Z{},ob=class extends ab{},sb=class extends ab{async _call(e){return new Ph(await super._call(e))}},cb=class extends ab{async _call(e){return new Y(await super._call(e))}},lb=class extends ab{async _call(e){return new Nh(await super._call(e))}},ub=class extends Z{},db=class extends ub{},fb=class extends ub{},pb=class extends Z{},mb=class extends pb{},hb=class extends pb{},gb=class extends Z{},_b=class extends gb{},vb=class extends gb{},yb=class extends Z{},bb=class extends yb{},xb=class extends yb{async _call(e){return new Y(await super._call(e))}},Sb=class extends Z{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`pixel_values`,`encoder_outputs`,`decoder_input_ids`,`decoder_inputs_embeds`,`decoder_attention_mask`,`past_key_values`];main_input_name=`inputs_embeds`},Cb=class extends Sb{_merge_input_ids_with_image_features({inputs_embeds:e,image_features:t,input_ids:n,attention_mask:r}){return{inputs_embeds:U([t,e],1),attention_mask:U([vu(t.dims.slice(0,2)),r],1)}}async _prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:n,attention_mask:r}){if(!e&&!t)throw Error("Either `input_ids` or `pixel_values` should be provided.");let i,a;return e&&(i=await this.encode_text({input_ids:e})),t&&(a=await this.encode_image({pixel_values:t})),i&&a?{inputs_embeds:n,attention_mask:r}=this._merge_input_ids_with_image_features({inputs_embeds:i,image_features:a,input_ids:e,attention_mask:r}):n=i||a,{inputs_embeds:n,attention_mask:r}}async forward({input_ids:e,pixel_values:t,attention_mask:n,decoder_input_ids:r,decoder_attention_mask:i,encoder_outputs:a,past_key_values:o,inputs_embeds:s,decoder_inputs_embeds:c,num_logits_to_keep:l=null}){if(s||({inputs_embeds:s,attention_mask:n}=await this._prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:s,attention_mask:n})),!a){let{last_hidden_state:e}=await Eg(this,{inputs_embeds:s,attention_mask:n});a=e}if(!c){if(!r)throw Error("Either `decoder_input_ids` or `decoder_inputs_embeds` should be provided.");c=await this.encode_text({input_ids:r})}let u={inputs_embeds:c,attention_mask:i,encoder_attention_mask:n,encoder_hidden_states:a,past_key_values:o,num_logits_to_keep:l};return await Ng(this,u,!0)}},wb=class extends Z{},Tb=class extends wb{},Eb=class extends wb{},Db=class extends Z{},Ob=class extends Db{},kb=class extends Db{},Ab=class extends Z{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`position_ids`,`past_key_values`]},jb=class extends Ab{_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Ug({image_token_id:this.config.image_token_index??this.config.image_token_id,...e,image_features:n})}},Mb=class extends jb{},Nb=class extends jb{},Pb=class extends Z{},Fb=class extends Pb{},Ib=class extends jb{},Lb=class extends Ib{},Rb=class extends Z{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`input_features`,`input_features_mask`,`past_key_values`]},zb=class extends Rb{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,input_features:r=null,input_features_mask:i=null,position_ids:a=null,inputs_embeds:o=null,per_layer_inputs:s=null,past_key_values:c=null,generation_config:l=null,logits_processor:u=null,num_logits_to_keep:d=null,...f}){if((!o||!s)&&({inputs_embeds:o,per_layer_inputs:s}=await J(this.sessions.embed_tokens,{input_ids:e}),e.dims[1]!==1)){if(n){let{image_features:r}=await this._encode_vision({pixel_values:n,...f});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_image_features({image_features:r,inputs_embeds:o,input_ids:e,attention_mask:t}))}if(r){let{audio_features:n}=await J(this.sessions.audio_encoder,{input_features:r,input_features_mask:i});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_audio_features({audio_features:n,inputs_embeds:o,input_ids:e,attention_mask:t}))}}return await Ng(this,{inputs_embeds:o,per_layer_inputs:s,past_key_values:c,attention_mask:t,position_ids:a,generation_config:l,logits_processor:u,num_logits_to_keep:d},!0)}_encode_vision(e){return J(this.sessions.vision_encoder,{pixel_values:e.pixel_values})}_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Ug({image_token_id:this.config.image_token_id,...e,image_features:n})}_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Wg({audio_token_id:this.config.audio_token_id,...e,audio_features:n})}},Bb=class extends zb{},Vb=class extends zb{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`image_position_ids`,`input_features`,`input_features_mask`,`past_key_values`];_encode_vision(e){return J(this.sessions.vision_encoder,{pixel_values:e.pixel_values,pixel_position_ids:e.image_position_ids})}},Hb=class extends Vb{},Ub=class extends Z{},Wb=class extends Ub{},Gb=class extends Ub{},Kb=class extends Z{},qb=class extends Kb{},Jb=class extends Kb{},Yb=class extends Z{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`,`pixel_values`,`image_grid_thw`]},Xb=class extends Yb{image_grid_thw_name=`grid_thw`;_get_text_only_rope_index(e,t){if(t){let{data:e,dims:n}=Lg(t),r=BigInt64Array.from({length:3*e.length},(t,n)=>e[n%e.length]),i=Array.from({length:n[0]},(t,r)=>cl(e.subarray(n[1]*r,n[1]*(r+1)))[0]+1n+BigInt(n[1]));return[new H(`int64`,r,[3,...n]),new H(`int64`,i,[i.length,1])]}{let[t,n]=e.dims;return[new H(`int64`,BigInt64Array.from({length:3*t*n},(e,r)=>BigInt(Math.floor(r%n/t))),[3,...e.dims]),bu([t,1])]}}_reorder_and_write_positions(e,t,n,r){let i=e.reduce((e,t)=>e+t.length,0),a=Array(i),o=0;for(let t=0;t<3;++t)for(let n of e){let e=n.length/3;for(let r=t*e;r<(t+1)*e;++r)a[o++]=n[r]}let s=0;for(let e=0;e(t==s&&e.push(n),e),[]).map(e=>c[e+1]),u=l.filter(e=>e==a).length,d=l.filter(e=>e==o).length,f=[],p=0,m=u,h=d;for(let e=0;et>p&&e==a),s=c.findIndex((e,t)=>t>p&&e==o),l=m>0&&e!==-1?e:c.length+1,u=h>0&&s!==-1?s:c.length+1,d,g,_,v;l0?cl(f.at(-1))[0]+1:0;f.push(Array.from({length:3*S},(e,t)=>C+t%S));let ee=S+C,w=y*b*x,te=Array.from({length:w},(e,t)=>ee+Math.floor(t/(b*x))),ne=Array.from({length:w},(e,t)=>ee+Math.floor(t/x)%b),re=Array.from({length:w},(e,t)=>ee+t%x);f.push([te,ne,re].flat()),p=d+w}if(p0?cl(f.at(-1))[0]+1:0,t=c.length-p;f.push(Array.from({length:3*t},(n,r)=>e+r%t))}return f}get_rope_index(e,t,n,r){let{vision_config:i}=this.config,a=i.spatial_merge_size??2;if(t||n){let i=e.tolist();r||=yu(e);let o=r.tolist(),s=Array.from({length:3},()=>Array.from({length:e.dims[0]},()=>Array.from({length:e.dims[1]},()=>0))),c=t?t.tolist():[],l=n?n.tolist():[],u={image_index:0,video_index:0},d=[];for(let e=0;eo[e][n]==1),n=this._get_multimodal_rope_positions({filtered_ids:t,image_grid_thw_list:c,video_grid_thw_list:l,spatial_merge_size:a,state:u}),r=this._reorder_and_write_positions(n,o[e],s,e);d.push(cl(r)[0]+1-i[e].length)}return[new H(`int64`,s.flat(1/0),[3,e.dims[0],e.dims[1]]),new H(`int64`,d,[d.length,1])]}return this._get_text_only_rope_index(e,r)}async encode_image({pixel_values:e,image_grid_thw:t}){return(await J(this.sessions.vision_encoder,{pixel_values:e,[this.image_grid_thw_name]:t})).image_features}_merge_input_ids_with_image_features(e){return Ug({image_token_id:this.config.image_token_id,...e})}prepare_inputs_for_generation(e,t,n){if(Mg(this,t,1n),!t.attention_mask||t.position_ids||!(this.sessions.decoder_model_merged??this.sessions.model).inputNames.includes(`position_ids`))return t;if(!t.past_key_values)[t.position_ids,t.rope_deltas]=this.get_rope_index(t.input_ids,t.image_grid_thw,t.video_grid_thw,t.attention_mask);else{t.pixel_values=null;let e=t.past_key_values.get_seq_length();if(en+e);t.position_ids=uu([r,r,r],0)}}return t}},Zb=class extends Xb{},Qb=class extends Xb{image_grid_thw_name=`image_grid_thw`},$b=class extends Zb{image_grid_thw_name=`image_grid_thw`},ex=class extends Qb{get_vision_position_ids(e,t,n,r){let i=Math.floor(t[0]/n),a=Math.floor(t[1]/r),o=Math.floor(t[2]/r),s=a*o*i,c=Array.from({length:s},()=>e),l=Array.from({length:s},(t,n)=>e+Math.floor(n/(o*i))),u=Array.from({length:s},(t,n)=>e+n%o);return[...c,...l,...u]}_get_multimodal_rope_positions({filtered_ids:e,image_grid_thw_list:t,video_grid_thw_list:n,spatial_merge_size:r,state:i}){let{image_token_id:a}=this.config,o=[],s=0,c=+(e[0]==a);for(let t=1;t<=e.length;++t){let n=tl+n%e)),l+=e}else{let e=t[i.image_index++].map(Number),n=e[0];u.push(this.get_vision_position_ids(l,e,n,r)),l+=Math.max(e[1],e[2])/r}return u}},tx=class extends Z{},nx=class extends tx{},rx=class extends tx{},ix=class extends Z{},ax=class extends ix{},ox=class extends ix{},sx=class extends Z{},cx=class extends sx{},lx=class extends sx{},ux=class extends Z{},dx=class extends ux{},fx=class extends ux{},px=class extends Z{},mx=class extends px{},hx=class extends px{},gx=class extends Z{},_x=class extends gx{},vx=class extends gx{},yx=class extends Z{},bx=class extends yx{},xx=class extends yx{},Sx=class extends Z{},Cx=class extends Sx{},wx=class extends Sx{},Tx=class extends Z{},Ex=class extends Tx{},Dx=class extends Tx{},Ox=class extends Z{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`audio_values`,`past_key_values`]},kx=class extends Ox{_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Wg({audio_token_id:this.config.ignore_index??this.config.audio_token_id??this.config.audio_token_index,...e,audio_features:n})}},Ax=class extends kx{forward_params=[`input_ids`,`attention_mask`,`input_features`,`past_key_values`]},jx=class extends Z{},Mx=class extends jx{},Nx=class extends Z{},Px=class extends Nx{},Fx=class extends Z{},Ix=class extends Fx{},Lx=class extends Fx{},Rx=class extends Z{},zx=class extends Rx{},Bx=class extends Rx{async _call(e){return new Y(await super._call(e))}},Vx=class extends Z{},Hx=class extends Vx{},Ux=class extends Vx{forward_params=[`input_ids`,`attention_mask`,`token_type_ids`,`past_key_values`];prepare_inputs_for_generation(e,t,n){let r=zg(this,e,t,n);return r.token_type_ids=(r.past_key_values?xu:yu)(r.input_ids),r}},Wx=class extends Z{},Gx=class extends Wx{},Kx=class extends Wx{async _call(e){return new Ih(await super._call(e))}},qx=class extends Wx{async _call(e){return new Y(await super._call(e))}},Jx=class extends Wx{async _call(e){return new Nh(await super._call(e))}},Yx=class extends Z{},Xx=class extends Wx{},Zx=class extends Wx{async _call(e){return new Ih(await super._call(e))}},Qx=class extends Wx{async _call(e){return new Y(await super._call(e))}},$x=class extends Z{},eS=class extends $x{},tS=class extends $x{},nS=class extends jb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`position_ids`,`past_key_values`]},rS=class extends Z{},iS=class extends rS{},aS=class extends rS{async _call(e){return new Y(await super._call(e))}},oS=class extends Z{},sS=class extends oS{},cS=class extends oS{},lS=class extends Z{},uS=class extends lS{async forward(e){let t=!e.input_ids,n=!e.pixel_values;if(t&&n)throw Error("Either `input_ids` or `pixel_values` should be provided.");if(t&&(e.input_ids=vu([e.pixel_values.dims[0],1])),n){let{image_size:t}=this.config.vision_config;e.pixel_values=gu([0,3,t,t],0)}let{text_embeddings:r,image_embeddings:i,l2norm_text_embeddings:a,l2norm_image_embeddings:o}=await super.forward(e),s={};return t||(s.text_embeddings=r,s.l2norm_text_embeddings=a),n||(s.image_embeddings=i,s.l2norm_image_embeddings=o),s}},dS=class extends lS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},fS=class extends lS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},pS=class extends Z{},mS=class extends pS{},hS=class extends pS{},gS=class extends jb{},_S=class extends Z{},vS=class extends _S{},yS=class extends _S{},bS=class extends jb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`spatial_shapes`,`position_ids`,`past_key_values`]},xS=class extends Z{},SS=class extends xS{},CS=class extends xS{},wS=class extends Z{},TS=class extends wS{},ES=class extends Z{},DS=class extends ES{},OS=class extends ES{},kS=class extends Z{},AS=class extends kS{},jS=class extends kS{},MS=class extends Z{},NS=class extends MS{},PS=class extends MS{},FS=class extends Z{},IS=class extends FS{},LS=class extends FS{},RS=class extends Z{},zS=class extends RS{},BS=class extends RS{},VS=class extends RS{async _call(e){return new Y(await super._call(e))}},HS=class extends RS{},US=class extends Z{},WS=class extends US{},GS=class extends Z{},KS=class extends GS{},qS=class extends jh{constructor({char_logits:e,bpe_logits:t,wp_logits:n}){super(),this.char_logits=e,this.bpe_logits=t,this.wp_logits=n}get logits(){return[this.char_logits,this.bpe_logits,this.wp_logits]}},JS=class extends Z{},YS=class extends JS{async _call(e){return new qS(await super._call(e))}},XS=class extends jh{constructor({audio_codes:e}){super(),this.audio_codes=e}},ZS=class extends jh{constructor({audio_values:e}){super(),this.audio_values=e}},QS=class extends Z{main_input_name=`input_values`;forward_params=[`input_values`]},$S=class extends QS{async encode(e){return new XS(await J(this.sessions.encoder_model,e))}async decode(e){return new ZS(await J(this.sessions.decoder_model,e))}},eC=class extends QS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},tC=class extends QS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},nC=class extends Z{},rC=class extends nC{},iC=class extends nC{},aC=class extends Z{},oC=class extends aC{},sC=class extends aC{},cC=class extends Z{},lC=class extends cC{},uC=class extends cC{},dC=class extends jb{},fC=class extends Z{},pC=class extends fC{},mC=class extends fC{},hC=class extends Z{},gC=class extends hC{},_C=class extends hC{async _call(e){return new Ph(await super._call(e))}},vC=class extends hC{async _call(e){return new Y(await super._call(e))}},yC=class extends hC{async _call(e){return new Fh(await super._call(e))}},bC=class extends Z{},xC=class extends bC{},SC=class extends bC{},CC=class extends Z{},wC=class extends CC{},TC=class extends CC{async _call(e){return new Y(await super._call(e))}},EC=class extends CC{},DC=class extends Z{},OC=class extends DC{},kC=class extends DC{async _call(e){return new Y(await super._call(e))}},AC=class extends DC{},jC=class extends Z{},MC=class extends jC{},NC=class extends jC{async _call(e){return new Y(await super._call(e))}},PC=class extends jC{},FC=class extends Z{},IC=class extends FC{},LC=class extends FC{async _call(e){return new Y(await super._call(e))}},RC=class extends FC{},zC=class extends Z{},BC=class extends zC{},VC=class extends zC{async _call(e){return new Y(await super._call(e))}},HC=class extends Z{},UC=class extends HC{},WC=class extends HC{async _call(e){return new Y(await super._call(e))}},GC=class extends Z{},KC=class extends GC{},qC=class extends GC{async _call(e){return new Ph(await super._call(e))}},JC=class extends GC{async _call(e){return new Y(await super._call(e))}},YC=class extends GC{async _call(e){return new Nh(await super._call(e))}},XC=class extends Z{},ZC=class extends XC{},QC=class extends XC{},$C=class extends Z{requires_attention_mask=!1;main_input_name=`input_values`;forward_params=[`input_values`,`decoder_input_ids`,`past_key_values`]},ew=class extends $C{},tw=class extends $C{},nw=class extends Z{},rw=class extends nw{},iw=class extends nw{async _call(e){return new Ph(await super._call(e))}},aw=class extends nw{async _call(e){return new Y(await super._call(e))}},ow=class extends nw{async _call(e){return new Nh(await super._call(e))}},sw=class extends nw{async _call(e){return new Fh(await super._call(e))}},cw=class extends Z{},lw=class extends cw{},uw=class extends cw{},dw=class extends Z{},fw=class extends dw{},pw=class extends dw{},mw=class extends Z{},hw=class extends mw{forward_params=[`input_ids`,`pixel_values`,`images_seq_mask`,`images_emb_mask`,`attention_mask`,`position_ids`,`past_key_values`];constructor(...e){super(...e),this._generation_mode=`text`}async forward(e){let t=this._generation_mode??`text`,n;if(t===`text`||!e.past_key_values){let t=this.sessions.prepare_inputs_embeds;n=await J(t,ci(e,t.inputNames))}else{let t=this.sessions.gen_img_embeds;n=await J(t,ci({image_ids:e.input_ids},t.inputNames))}let r={...e,...n},i=await Ng(this,r),a=this.sessions[t===`text`?`lm_head`:`gen_head`];if(!a)throw Error(`Unable to find "${a}" generation head`);let o=await J(a,ci(i,a.inputNames));return{...n,...i,...o}}prepare_inputs_for_generation(e,t,n){let r=!!t.past_key_values;return Mg(this,t,1n),n.guidance_scale!==null&&n.guidance_scale>1&&(r?t.input_ids=U([t.input_ids,t.input_ids],0):(t.input_ids=U([t.input_ids,_u(t.input_ids,BigInt(n.pad_token_id))],0),t.attention_mask=U([t.attention_mask,_u(t.attention_mask,0n)],0))),(r||!t.pixel_values)&&(t.pixel_values=gu([0,0,3,384,384],1)),r&&(t.images_seq_mask=new H(`bool`,[,].fill(!0).fill(!1,0,1),[1,1]),t.images_emb_mask=new H(`bool`,[].fill(!1),[1,1,0])),t}async generate(e){return this._generation_mode=`text`,super.generate(e)}async generate_images(e){this._generation_mode=`image`;let t=(e.inputs??e[this.main_input_name]).dims[1],n=(await super.generate(e)).slice(null,[t,null]),r=this.sessions.image_decode,{decoded_image:i}=await J(r,{generated_tokens:n}),a=i.add_(1).mul_(255/2).clamp_(0,255).to(`uint8`),o=[];for(let e of a){let t=Bf.fromTensor(e);o.push(t)}return o}},gw=class extends Z{},_w=class extends gw{},vw=class extends gw{},yw=class extends Z{forward_params=[`input_ids`,`attention_mask`,`encoder_outputs`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`];_apply_and_filter_by_delay_pattern_mask(e){let[t,n]=e.dims,r=this.config.decoder.num_codebooks,i=n-r,a=0;for(let t=0;t0&&o<=i&&(e.data[a++]=e.data[t])}let o=Math.floor(t/r),s=a/(o*r);return new H(e.type,e.data.slice(0,a),[o,r,s])}prepare_inputs_for_generation(e,t,n){let r=BigInt(this.config.decoder.pad_token_id),i=structuredClone(e);for(let e=0;e=t&&(i[e][t]=r);return n.guidance_scale!==null&&n.guidance_scale>1&&(i=i.concat(i)),Bg(this,i,t,n)}async generate(e){let t=await super.generate(e),n=this._apply_and_filter_by_delay_pattern_mask(t).unsqueeze_(0),{audio_values:r}=await J(this.sessions.encodec_decode,{audio_codes:n});return r}},bw=class extends Z{},xw=class extends bw{},Sw=class extends bw{},Cw=class extends Z{},ww=class extends Cw{},Tw=class extends Cw{},Ew=class extends Z{},Dw=class extends Ew{},Ow=class extends Ew{async _call(e){return new Ph(await super._call(e))}},kw=class extends Ew{async _call(e){return new Y(await super._call(e))}},Aw=class extends Ew{async _call(e){return new Nh(await super._call(e))}},jw=class extends Ew{async _call(e){return new Fh(await super._call(e))}},Mw=class extends Z{},Nw=class extends Mw{},Pw=class extends Z{},Fw=class extends Pw{},Iw=class extends Pw{},Lw=class extends Z{},Rw=class extends Lw{},zw=class extends Lw{},Bw=class extends Z{},Vw=class extends Bw{},Hw=class extends Bw{},Uw=class extends Z{},Ww=class extends Uw{},Gw=class extends Uw{},Kw=class extends Z{},qw=class extends Kw{},Jw=class extends Kw{async _call(e){return new Y(await super._call(e))}},Yw=class extends Z{},Xw=class extends Yw{},Zw=class extends Yw{},Qw=class extends Z{},$w=class extends Qw{},eT=class extends Qw{},tT=class extends Z{},nT=class extends tT{},rT=class extends tT{},iT=class extends Z{},aT=class extends iT{},oT=class extends iT{},sT=class extends jb{},cT=class extends Z{},lT=class extends cT{async _call(e){return new Ih(await super._call(e))}},uT=class extends Z{},dT=class extends uT{},fT=class extends uT{},pT=class extends Z{},mT=class extends pT{},hT=class extends pT{},gT=class extends Z{},_T=class extends gT{},vT=class extends gT{},yT=class extends Z{},bT=class extends yT{},xT=class extends yT{},ST=class extends Z{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`pixel_values`,`image_sizes`,`past_key_values`]},CT=class extends ST{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,image_sizes:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,...u}){if(!a){let t;if(n&&e.dims[1]!==1){if(!r)throw Error("`image_sizes` must be provided when `pixel_values` is provided.");({image_features:t}=await J(this.sessions.vision_encoder,{pixel_values:n,image_sizes:r}))}else{let e=this.config.normalized_config.hidden_size;t=new H(`float32`,[],[0,e])}({inputs_embeds:a}=await J(this.sessions.prepare_inputs_embeds,{input_ids:e,image_features:t}))}return await Ng(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,position_ids:i,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1)}},wT=class extends Z{},TT=class extends wT{},ET=class extends wT{async _call(e){return new Y(await super._call(e))}},DT=class extends Z{},OT=class extends DT{},kT=class extends DT{async _call(e){return new Nh(await super._call(e))}},AT=class extends Z{},jT=class extends AT{},MT=class extends AT{},NT=class extends Z{},PT=class extends NT{},FT=class extends NT{},IT=class extends Z{},LT=class extends IT{},RT=class extends IT{},zT=class extends Z{},BT=class extends zT{},VT=class extends zT{},HT=class extends Z{},UT=class extends HT{},WT=class extends HT{},GT=class extends Qb{},KT=class extends $b{},qT=class extends GT{},JT=class extends KT{},YT=class extends GT{},XT=class extends YT{},ZT=class extends YT{},QT=class extends XT{},$T=class extends Z{},eE=class extends $T{},tE=class extends $T{async _call(e){return new Y(await super._call(e))}},nE=class extends Z{},rE=class extends nE{},iE=class extends nE{async _call(e){return new aE(await super._call(e))}},aE=class extends Mv{},oE=class extends Z{},sE=class extends oE{},cE=class extends oE{async _call(e){return new Ph(await super._call(e))}},lE=class extends oE{async _call(e){return new Y(await super._call(e))}},uE=class extends oE{async _call(e){return new Nh(await super._call(e))}},dE=class extends oE{async _call(e){return new Fh(await super._call(e))}},fE=class extends Z{},pE=class extends fE{},mE=class extends fE{async _call(e){return new Ph(await super._call(e))}},hE=class extends fE{async _call(e){return new Y(await super._call(e))}},gE=class extends fE{async _call(e){return new Nh(await super._call(e))}},_E=class extends fE{async _call(e){return new Fh(await super._call(e))}},vE=class extends Z{},yE=class extends vE{},bE=class extends vE{async _call(e){return new xE(await super._call(e))}},xE=class extends Mv{},SE=class extends jh{constructor({iou_scores:e,pred_masks:t}){super(),this.iou_scores=e,this.pred_masks=t}},CE=class extends Z{},wE=class extends CE{async get_image_embeddings({pixel_values:e}){return await Eg(this,{pixel_values:e})}async forward(e){e=!e.image_embeddings||!e.image_positional_embeddings?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_labels??=vu(e.input_points.dims.slice(0,-1));let t={image_embeddings:e.image_embeddings,image_positional_embeddings:e.image_positional_embeddings};return e.input_points&&(t.input_points=e.input_points),e.input_labels&&(t.input_labels=e.input_labels),e.input_boxes&&(t.input_boxes=e.input_boxes),await J(this.sessions.prompt_encoder_mask_decoder,t)}async _call(e){return new SE(await super._call(e))}},TE=class extends jh{constructor({iou_scores:e,pred_masks:t,object_score_logits:n}){super(),this.iou_scores=e,this.pred_masks=t,this.object_score_logits=n}},EE=class extends Z{},DE=class extends EE{async get_image_embeddings({pixel_values:e}){return await Eg(this,{pixel_values:e})}async forward(e){let{num_feature_levels:t}=this.config.vision_config;if(e=Array.from({length:t},(e,t)=>`image_embeddings.${t}`).some(t=>!e[t])?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_points){if(e.input_boxes&&e.input_boxes.dims[1]!==1)throw Error("When both `input_points` and `input_boxes` are provided, the number of boxes per image must be 1.");let t=e.input_points.dims;e.input_labels??=vu(t.slice(0,-1)),e.input_boxes??=gu([t[0],0,4],0)}else if(e.input_boxes){let t=e.input_boxes.dims;e.input_labels=gu([t[0],t[1],0],-1n),e.input_points=gu([t[0],1,0,2],0)}else throw Error("At least one of `input_points` or `input_boxes` must be provided.");let n=this.sessions.prompt_encoder_mask_decoder;return await J(n,ci(e,n.inputNames))}async _call(e){return new TE(await super._call(e))}},OE=class extends DE{},kE=class extends DE{},AE=class extends Z{},jE=class extends AE{},ME=class extends AE{},NE=class extends AE{},PE=class extends Z{},FE=class extends PE{},IE=class extends PE{},LE=class extends PE{},RE=class extends Z{},zE=class extends RE{},BE=class extends RE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},VE=class extends X_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},HE=class extends Z{},UE=class extends HE{},WE=class extends HE{},GE=class extends nS{},KE=class extends Z{main_input_name=`input_values`;forward_params=[`input_values`]},qE=class extends KE{async encode(e){return await J(this.sessions.encoder_model,e)}async decode(e){return await J(this.sessions.decoder_model,e)}},JE=class extends KE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},YE=class extends KE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},XE=class extends Z{},ZE=class extends XE{},QE=class extends XE{},$E=class extends Z{},eD=class extends $E{},tD=class extends $E{},nD=class extends $E{async generate_speech(e,t,{threshold:n=.5,minlenratio:r=0,maxlenratio:i=20,vocoder:a=null}={}){let o={input_ids:e},{encoder_outputs:s,encoder_attention_mask:c}=await Eg(this,o),l=s.dims[1]/this.config.reduction_factor,u=Math.floor(l*i),d=Math.floor(l*r),f=this.config.num_mel_bins,p=[],m=null,h=null,g=0;for(;;){++g;let e=yg(!!h),r;r=h?h.output_sequence_out:new H(`float32`,new Float32Array(f),[1,1,f]);let i={use_cache_branch:e,output_sequence:r,encoder_attention_mask:c,speaker_embeddings:t,encoder_hidden_states:s};jg(this,i,m),h=await J(this.sessions.decoder_model_merged,i),m=Og(h,m);let{prob:a,spectrum:o}=h;if(p.push(o),g>=d&&(Array.from(a.data).filter(e=>e>=n).length>0||g>=u))break}let _=U(p),{waveform:v}=await J(a.sessions.model,{spectrogram:_});return{spectrogram:_,waveform:v}}},rD=class extends Z{main_input_name=`spectrogram`},iD=class extends Z{},aD=class extends iD{},oD=class extends iD{async _call(e){return new Ph(await super._call(e))}},sD=class extends iD{async _call(e){return new Y(await super._call(e))}},cD=class extends iD{async _call(e){return new Fh(await super._call(e))}},lD=class extends Z{},uD=class extends lD{},dD=class extends lD{},fD=class extends Z{},pD=class extends fD{},mD=class extends fD{},hD=class extends Z{},gD=class extends hD{},_D=class extends Z{},vD=class extends _D{async generate_speech({input_ids:e,attention_mask:t,style:n,num_inference_steps:r=5,speed:i=1.05}){let{sampling_rate:a,chunk_compress_factor:o,base_chunk_size:s,latent_dim:c}=this.config,{last_hidden_state:l,durations:u}=await J(this.sessions.text_encoder,{input_ids:e,attention_mask:t,style:n}),d=u.div(i).mul_(a),f=s*o,p=d.data,m=Int32Array.from(p,e=>Math.ceil(e/f)),h=Math.max(...m),g=e.dims[0],_=new BigInt64Array(g*h);for(let e=0;ee*t,1),r=Zl[e.type];c[e.name]=new H(e.type,new r(n),t)}let f=Zl[d],p=new H(d,new f(s*uO),[1,s,uO]),m=t[Symbol.asyncIterator]?.()??t[Symbol.iterator]?.();if(!m)throw Error(`input_features must be iterable or async iterable`);return{encoder_session:i,enc_kv_cache:c,enc_padding_cache:p,enc_past_seq_len:0,audio_embed_queue:[],audio_embed_total_tokens:0,audio_queue_offset:0,audio_consumed:0,stream_exhausted:!1,chunks_iter:m,text_hidden_size:n.hidden_size}}async function mO(e,t){let n=t.dims[2],r=Math.floor((dO+n-3)/2)+1,i=new H(`int64`,BigInt64Array.from({length:r},(t,n)=>BigInt(e.enc_past_seq_len+n)),[1,r]),a=e.enc_past_seq_len+r,o=vu([1,a]),{audio_embeds:s,present_padding_cache:c,...l}=await J(e.encoder_session,{input_features:t,attention_mask:o,position_ids:i,past_padding_cache:e.enc_padding_cache,...e.enc_kv_cache});e.enc_padding_cache.location===`gpu-buffer`&&e.enc_padding_cache.dispose(),e.enc_padding_cache=c;for(let t in l)if(t.startsWith(`present.`)){let n=t.replace(`present`,`past_key_values`),r=e.enc_kv_cache[n];r?.location===`gpu-buffer`&&r.dispose(),e.enc_kv_cache[n]=l[t]}return e.enc_past_seq_len=a,s}async function hO(e,t){for(;e.audio_embed_total_tokens0&&e.audio_embed_queue.length>0;){let t=e.audio_embed_queue[0],n=t.tokens-e.audio_queue_offset,o=Math.min(a,n),s=e.audio_queue_offset*e.text_hidden_size;for(let n=0;n=t.tokens&&(e.audio_embed_queue.shift(),e.audio_queue_offset=0)}e.audio_consumed+=n-a}var _O=class extends ng{constructor(e){super(),this._s=e}_call(e){let t=this._s.stream_exhausted&&this._s.audio_embed_queue.length===0;return e.map(()=>t)}},vO=class extends Z{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`]},yO=class extends vO{async forward({input_ids:e,past_key_values:t,...n}){let r=e.dims[1],i=fO.get(this);i&&await hO(i,i.audio_consumed+r);let{inputs_embeds:a}=await J(this.sessions.embed_tokens,{input_ids:e});i&&gO(i,a,r);let o={inputs_embeds:a,...n};jg(this,o,t);let s=this.sessions.decoder_model_merged;return await J(s,ci(o,s.inputNames))}async generate({input_features:e,stopping_criteria:t,...n}){if(!e)throw Error(`input_features (generator/iterable) must be provided`);let r=pO(this,e);fO.set(this,r);let i=new rg;i.push(new _O(r)),t&&i.extend(t);try{return await super.generate({...n,stopping_criteria:i})}finally{r.enc_kv_cache.dispose(),fO.delete(this)}}},bO=class extends Z{},xO=class extends bO{},SO=class extends bO{async _call(e){return new Ih(await super._call(e))}},CO=class extends bO{async _call(e){return new Y(await super._call(e))}},wO=class extends jh{constructor({logits:e,embeddings:t}){super(),this.logits=e,this.embeddings=t}},TO=class extends Z{},EO=class extends TO{},DO=class extends TO{async _call(e){return new Ih(await super._call(e))}},OO=class extends TO{async _call(e){return new Y(await super._call(e))}},kO=class extends TO{async _call(e){return new wO(await super._call(e))}},AO=class extends TO{async _call(e){return new Nh(await super._call(e))}},jO=class extends Z{},MO=class extends jO{},NO=class extends tg{return_timestamps=null;return_token_timestamps=null;num_frames=null;alignment_heads=null;task=null;language=null;no_timestamps_token_id=null;prompt_ids=null;is_multilingual=null;lang_to_id=null;task_to_id=null;max_initial_timestamp_index=1},PO=class extends Z{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`attention_mask`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},FO=class extends PO{},IO=class extends PO{_prepare_generation_config(e,t){return super._prepare_generation_config(e,t,NO)}_retrieve_init_tokens(e){let t=[e.decoder_start_token_id],n=e.language,r=e.task;if(e.is_multilingual){n||=(A.warn(`No language specified - defaulting to English (en).`),`en`);let i=`<|${Ed(n)}|>`;t.push(e.lang_to_id[i]),t.push(e.task_to_id[r??`transcribe`])}else if(n||r)throw Error("Cannot specify `task` or `language` for an English-only model. If the model is intended to be multilingual, pass `is_multilingual=true` to generate, or update the generation config.");return!e.return_timestamps&&e.no_timestamps_token_id&&t.at(-1)!==e.no_timestamps_token_id?t.push(e.no_timestamps_token_id):e.return_timestamps&&t.at(-1)===e.no_timestamps_token_id&&(A.warn("<|notimestamps|> prompt token is removed from generation_config since `return_timestamps` is set to `true`."),t.pop()),t.filter(e=>e!=null)}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,...i}){t=this._prepare_generation_config(t,i);let a=i.decoder_input_ids instanceof H?Eu(i.decoder_input_ids):i.decoder_input_ids??this._retrieve_init_tokens(t);if(t.return_timestamps&&(n??=new Hh,n.push(new qh(t,a))),t.begin_suppress_tokens&&(n??=new Hh,n.push(new Kh(t.begin_suppress_tokens,a.length))),t.return_token_timestamps){if(!t.alignment_heads)throw Error("Model generation config has no `alignment_heads`, token-level timestamps not available. See https://gist.github.com/hollance/42e32852f24243b748ae6bc1f985b13a on how to add this property to the generation config.");t.task===`translate`&&A.warn(`Token-level timestamps may not be reliable for task 'translate'.`),t.output_attentions=!0,t.return_dict_in_generate=!0}if(t.return_timestamps&&!i.max_new_tokens)return this._generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:a,kwargs:i});let o=await super.generate({inputs:e,generation_config:t,logits_processor:n,decoder_input_ids:a,...i});return t.return_token_timestamps&&(o.token_timestamps=this._extract_token_timestamps(o,t.alignment_heads,t.num_frames,.02,a.length)),o}async _generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:r,kwargs:i}){let a=t.no_timestamps_token_id+1,o=Array.isArray(t.eos_token_id)?t.eos_token_id[0]:t.eos_token_id,s=t.return_token_timestamps,c=e,l=c.dims[2],u=2*this.config.max_source_positions,d=0,f=[],p=[];for(;de+n)}if(v.length>0&&v.at(-1)===o&&v.pop(),v.length===0)break;let b=v.map(e=>e>=a),x=v.length>=2&&b[v.length-1]&&!b[v.length-2],S=[];for(let e=0;e0){if(x)C=e-d;else{let e=S.at(-1);C=(v[e-1]-a)*2,ee=e}}else C=e-d;let w=Math.floor(d/2),te=a+1500;for(let e=0;e=a&&(v[e]=Math.min(v[e]+w,te));f.push(...v.slice(0,ee)),y&&p.push(...y.slice(0,ee)),d+=C}f.push(o);let m=[...r,...f];if(s){let e=new H(`int64`,m.map(BigInt),[1,m.length]),t=[...Array(r.length).fill(0),...p,0];return{sequences:e,token_timestamps:new H(`float32`,new Float32Array(t),[1,t.length])}}return new H(`int64`,m.map(BigInt),[1,m.length])}_extract_token_timestamps(e,t,n=null,r=.02,i=0){if(!e.cross_attentions)throw Error("Model outputs must contain cross attentions to extract timestamps. This is most likely because the model was not exported with `output_attentions=True`.");n??A.warn("`num_frames` has not been set, meaning the entire audio will be analyzed. This may lead to inaccurate token-level timestamps for short audios (< 30 seconds).");let a=this.config.median_filter_width;a===void 0&&(A.warn("Model config has no `median_filter_width`, using default value of 7."),a=7);let o=e.cross_attentions,s=Array.from({length:this.config.decoder_layers},(e,t)=>U(o.map(e=>e[t]),2)),c=uu(t.map(([e,t])=>{if(e>=s.length)throw Error(`Layer index ${e} is out of bounds for cross attentions (length ${s.length}).`);return n?s[e].slice(null,t,null,[0,n]):s[e].slice(null,t)})).permute(1,0,2,3),[l,u]=fu(c,-2,0,!0),d=c.clone();for(let e=0;e0?d.slice(null,null,[i,d.dims[2]],null):d,1)],p=e.sequences.dims,m=new H(`float32`,new Float32Array(p[0]*p[1]),p);for(let e=0;et[n+1]-t[n])).map(e=>!!e),o=[];for(let e=0;e0&&s.push(o.at(-1)),m[e].data.set(s)}return m}},LO=class extends IO{},RO=class extends Z{},zO=class extends RO{},BO=class extends RO{async _call(e){return new Ph(await super._call(e))}},VO=class extends RO{async _call(e){return new Y(await super._call(e))}},HO=class extends RO{async _call(e){return new Nh(await super._call(e))}},UO=class extends RO{async _call(e){return new Fh(await super._call(e))}},WO=class extends Z{},GO=class extends WO{},KO=class extends WO{async _call(e){return new Ph(await super._call(e))}},qO=class extends WO{async _call(e){return new Y(await super._call(e))}},JO=class extends WO{async _call(e){return new Nh(await super._call(e))}},YO=class extends WO{async _call(e){return new Fh(await super._call(e))}},XO=class extends Z{},ZO=class extends XO{},QO=class extends XO{async _call(e){return new $O(await super._call(e))}},$O=class extends jh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},ek=class extends Z{},tk=class extends ek{},nk=class extends ek{},rk=class extends Z{},ik=class extends rk{},ak=class extends rk{},ok=/* @__PURE__ */ new Map([[`bert`,`BertModel`],[`eurobert`,`EuroBertModel`],[`neobert`,`NeoBertModel`],[`modernbert`,`ModernBertModel`],[`nomic_bert`,`NomicBertModel`],[`roformer`,`RoFormerModel`],[`electra`,`ElectraModel`],[`esm`,`EsmModel`],[`convbert`,`ConvBertModel`],[`camembert`,`CamembertModel`],[`deberta`,`DebertaModel`],[`deberta-v2`,`DebertaV2Model`],[`mpnet`,`MPNetModel`],[`albert`,`AlbertModel`],[`distilbert`,`DistilBertModel`],[`roberta`,`RobertaModel`],[`xlm`,`XLMModel`],[`xlm-roberta`,`XLMRobertaModel`],[`clap`,`ClapModel`],[`clip`,`CLIPModel`],[`clipseg`,`CLIPSegModel`],[`chinese_clip`,`ChineseCLIPModel`],[`siglip`,`SiglipModel`],[`jina_clip`,`JinaCLIPModel`],[`mobilebert`,`MobileBertModel`],[`squeezebert`,`SqueezeBertModel`],[`wav2vec2`,`Wav2Vec2Model`],[`wav2vec2-bert`,`Wav2Vec2BertModel`],[`unispeech`,`UniSpeechModel`],[`unispeech-sat`,`UniSpeechSatModel`],[`hubert`,`HubertModel`],[`wavlm`,`WavLMModel`],[`audio-spectrogram-transformer`,`ASTModel`],[`vits`,`VitsModel`],[`pyannote`,`PyAnnoteModel`],[`wespeaker-resnet`,`WeSpeakerResNetModel`],[`detr`,`DetrModel`],[`rt_detr`,`RTDetrModel`],[`rt_detr_v2`,`RTDetrV2Model`],[`rf_detr`,`RFDetrModel`],[`d_fine`,`DFineModel`],[`table-transformer`,`TableTransformerModel`],[`vit`,`ViTModel`],[`ijepa`,`IJepaModel`],[`pvt`,`PvtModel`],[`vit_msn`,`ViTMSNModel`],[`vit_mae`,`ViTMAEModel`],[`groupvit`,`GroupViTModel`],[`fastvit`,`FastViTModel`],[`mobilevit`,`MobileViTModel`],[`mobilevitv2`,`MobileViTV2Model`],[`owlvit`,`OwlViTModel`],[`owlv2`,`Owlv2Model`],[`beit`,`BeitModel`],[`deit`,`DeiTModel`],[`hiera`,`HieraModel`],[`convnext`,`ConvNextModel`],[`convnextv2`,`ConvNextV2Model`],[`dinov2`,`Dinov2Model`],[`dinov2_with_registers`,`Dinov2WithRegistersModel`],[`dinov3_vit`,`DINOv3ViTModel`],[`dinov3_convnext`,`DINOv3ConvNextModel`],[`resnet`,`ResNetModel`],[`swin`,`SwinModel`],[`swin2sr`,`Swin2SRModel`],[`donut-swin`,`DonutSwinModel`],[`yolos`,`YolosModel`],[`dpt`,`DPTModel`],[`glpn`,`GLPNModel`],[`hifigan`,`SpeechT5HifiGan`],[`efficientnet`,`EfficientNetModel`],[`decision_transformer`,`DecisionTransformerModel`],[`patchtst`,`PatchTSTModel`],[`patchtsmixer`,`PatchTSMixerModel`],[`mobilenet_v1`,`MobileNetV1Model`],[`mobilenet_v2`,`MobileNetV2Model`],[`mobilenet_v3`,`MobileNetV3Model`],[`mobilenet_v4`,`MobileNetV4Model`],[`maskformer`,`MaskFormerModel`],[`mgp-str`,`MgpstrForSceneTextRecognition`],[`style_text_to_speech_2`,`StyleTextToSpeech2Model`],[`openai_privacy_filter`,`OpenAIPrivacyFilterModel`]]),sk=/* @__PURE__ */ new Map([[`t5`,`T5Model`],[`longt5`,`LongT5Model`],[`mt5`,`MT5Model`],[`bart`,`BartModel`],[`mbart`,`MBartModel`],[`marian`,`MarianModel`],[`whisper`,`WhisperModel`],[`cohere_asr`,`CohereAsrModel`],[`m2m_100`,`M2M100Model`],[`blenderbot`,`BlenderbotModel`],[`blenderbot-small`,`BlenderbotSmallModel`]]),ck=/* @__PURE__ */ new Map([[`mimi`,`MimiModel`],[`dac`,`DacModel`],[`snac`,`SnacModel`]]),lk=/* @__PURE__ */ new Map([[`bloom`,`BloomModel`],[`jais`,`JAISModel`],[`gpt2`,`GPT2Model`],[`gpt_oss`,`GptOssModel`],[`gptj`,`GPTJModel`],[`gpt_bigcode`,`GPTBigCodeModel`],[`gpt_neo`,`GPTNeoModel`],[`gpt_neox`,`GPTNeoXModel`],[`codegen`,`CodeGenModel`],[`llama`,`LlamaModel`],[`apertus`,`ApertusModel`],[`nanochat`,`NanoChatModel`],[`arcee`,`ArceeModel`],[`afmoe`,`AfmoeModel`],[`lfm2`,`Lfm2Model`],[`lfm2_moe`,`Lfm2MoeModel`],[`smollm3`,`SmolLM3Model`],[`exaone`,`ExaoneModel`],[`olmo`,`OlmoModel`],[`olmo2`,`Olmo2Model`],[`olmo3`,`Olmo3Model`],[`olmo_hybrid`,`OlmoHybridModel`],[`mobilellm`,`MobileLLMModel`],[`granite`,`GraniteModel`],[`granitemoehybrid`,`GraniteMoeHybridModel`],[`cohere`,`CohereModel`],[`cohere2`,`Cohere2Model`],[`gemma`,`GemmaModel`],[`gemma2`,`Gemma2Model`],[`vaultgemma`,`VaultGemmaModel`],[`gemma3_text`,`Gemma3Model`],[`helium`,`HeliumModel`],[`glm`,`GlmModel`],[`glm_moe_dsa`,`GlmMoeDsaModel`],[`openelm`,`OpenELMModel`],[`qwen2`,`Qwen2Model`],[`qwen2_moe`,`Qwen2MoeModel`],[`qwen3`,`Qwen3Model`],[`qwen3_moe`,`Qwen3MoeModel`],[`qwen3_next`,`Qwen3NextModel`],[`phi`,`PhiModel`],[`phi3`,`Phi3Model`],[`mpt`,`MptModel`],[`opt`,`OPTModel`],[`mistral`,`MistralModel`],[`mistral4`,`Mistral4Model`],[`ministral`,`MinistralModel`],[`ministral3`,`Ministral3Model`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2Model`],[`deepseek_v3`,`DeepseekV3Model`],[`deepseek_v4`,`DeepseekV4Model`],[`falcon`,`FalconModel`],[`falcon_h1`,`FalconH1Model`],[`nemotron_h`,`NemotronHModel`],[`solar_open`,`SolarOpenModel`],[`stablelm`,`StableLmModel`],[`modernbert-decoder`,`ModernBertDecoderModel`],[`hunyuan_v1_dense`,`HunYuanDenseV1Model`],[`youtu`,`YoutuModel`],[`zaya`,`ZayaModel`],[`hrm_text`,`HrmTextModel`]]),uk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForSpeechToText`],[`whisper`,`WhisperForConditionalGeneration`],[`lite-whisper`,`LiteWhisperForConditionalGeneration`],[`moonshine`,`MoonshineForConditionalGeneration`],[`cohere_asr`,`CohereAsrForConditionalGeneration`]]),dk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForTextToSpeech`]]),fk=/* @__PURE__ */ new Map([[`vits`,`VitsModel`],[`musicgen`,`MusicgenForConditionalGeneration`],[`supertonic`,`SupertonicForConditionalGeneration`]]),pk=/* @__PURE__ */ new Map([[`bert`,`BertForSequenceClassification`],[`eurobert`,`EuroBertForSequenceClassification`],[`neobert`,`NeoBertForSequenceClassification`],[`modernbert`,`ModernBertForSequenceClassification`],[`roformer`,`RoFormerForSequenceClassification`],[`electra`,`ElectraForSequenceClassification`],[`esm`,`EsmForSequenceClassification`],[`convbert`,`ConvBertForSequenceClassification`],[`camembert`,`CamembertForSequenceClassification`],[`deberta`,`DebertaForSequenceClassification`],[`deberta-v2`,`DebertaV2ForSequenceClassification`],[`mpnet`,`MPNetForSequenceClassification`],[`albert`,`AlbertForSequenceClassification`],[`distilbert`,`DistilBertForSequenceClassification`],[`roberta`,`RobertaForSequenceClassification`],[`xlm`,`XLMForSequenceClassification`],[`xlm-roberta`,`XLMRobertaForSequenceClassification`],[`bart`,`BartForSequenceClassification`],[`mbart`,`MBartForSequenceClassification`],[`mobilebert`,`MobileBertForSequenceClassification`],[`squeezebert`,`SqueezeBertForSequenceClassification`]]),mk=/* @__PURE__ */ new Map([[`bert`,`BertForTokenClassification`],[`eurobert`,`EuroBertForTokenClassification`],[`neobert`,`NeoBertForTokenClassification`],[`modernbert`,`ModernBertForTokenClassification`],[`roformer`,`RoFormerForTokenClassification`],[`electra`,`ElectraForTokenClassification`],[`esm`,`EsmForTokenClassification`],[`convbert`,`ConvBertForTokenClassification`],[`camembert`,`CamembertForTokenClassification`],[`deberta`,`DebertaForTokenClassification`],[`deberta-v2`,`DebertaV2ForTokenClassification`],[`mpnet`,`MPNetForTokenClassification`],[`distilbert`,`DistilBertForTokenClassification`],[`roberta`,`RobertaForTokenClassification`],[`xlm`,`XLMForTokenClassification`],[`xlm-roberta`,`XLMRobertaForTokenClassification`],[`openai_privacy_filter`,`OpenAIPrivacyFilterForTokenClassification`]]),hk=/* @__PURE__ */ new Map([[`t5`,`T5ForConditionalGeneration`],[`longt5`,`LongT5ForConditionalGeneration`],[`mt5`,`MT5ForConditionalGeneration`],[`bart`,`BartForConditionalGeneration`],[`mbart`,`MBartForConditionalGeneration`],[`marian`,`MarianMTModel`],[`m2m_100`,`M2M100ForConditionalGeneration`],[`blenderbot`,`BlenderbotForConditionalGeneration`],[`blenderbot-small`,`BlenderbotSmallForConditionalGeneration`]]),gk=/* @__PURE__ */ new Map([[`bloom`,`BloomForCausalLM`],[`gpt2`,`GPT2LMHeadModel`],[`gpt_oss`,`GptOssForCausalLM`],[`jais`,`JAISLMHeadModel`],[`gptj`,`GPTJForCausalLM`],[`gpt_bigcode`,`GPTBigCodeForCausalLM`],[`gpt_neo`,`GPTNeoForCausalLM`],[`gpt_neox`,`GPTNeoXForCausalLM`],[`codegen`,`CodeGenForCausalLM`],[`llama`,`LlamaForCausalLM`],[`nanochat`,`NanoChatForCausalLM`],[`apertus`,`ApertusForCausalLM`],[`llama4_text`,`Llama4ForCausalLM`],[`arcee`,`ArceeForCausalLM`],[`afmoe`,`AfmoeForCausalLM`],[`lfm2`,`Lfm2ForCausalLM`],[`lfm2_moe`,`Lfm2MoeForCausalLM`],[`smollm3`,`SmolLM3ForCausalLM`],[`exaone`,`ExaoneForCausalLM`],[`olmo`,`OlmoForCausalLM`],[`olmo2`,`Olmo2ForCausalLM`],[`olmo3`,`Olmo3ForCausalLM`],[`olmo_hybrid`,`OlmoHybridForCausalLM`],[`mobilellm`,`MobileLLMForCausalLM`],[`granite`,`GraniteForCausalLM`],[`granitemoehybrid`,`GraniteMoeHybridForCausalLM`],[`cohere`,`CohereForCausalLM`],[`cohere2`,`Cohere2ForCausalLM`],[`gemma`,`GemmaForCausalLM`],[`gemma2`,`Gemma2ForCausalLM`],[`vaultgemma`,`VaultGemmaForCausalLM`],[`gemma3_text`,`Gemma3ForCausalLM`],[`gemma3`,`Gemma3ForCausalLM`],[`helium`,`HeliumForCausalLM`],[`glm`,`GlmForCausalLM`],[`glm_moe_dsa`,`GlmMoeDsaForCausalLM`],[`openelm`,`OpenELMForCausalLM`],[`qwen2`,`Qwen2ForCausalLM`],[`qwen2_moe`,`Qwen2MoeForCausalLM`],[`qwen3`,`Qwen3ForCausalLM`],[`qwen3_moe`,`Qwen3MoeForCausalLM`],[`qwen3_next`,`Qwen3NextForCausalLM`],[`qwen2_vl`,`Qwen2VLForCausalLM`],[`qwen2_5_vl`,`Qwen2_5_VLForCausalLM`],[`qwen3_vl`,`Qwen3VLForCausalLM`],[`qwen3_vl_moe`,`Qwen3VLMoeForCausalLM`],[`qwen3_5`,`Qwen3_5ForCausalLM`],[`qwen3_5_text`,`Qwen3_5ForCausalLM`],[`qwen3_5_moe`,`Qwen3_5MoeForCausalLM`],[`gemma3n`,`Gemma3nForCausalLM`],[`gemma4`,`Gemma4ForCausalLM`],[`phi`,`PhiForCausalLM`],[`phi3`,`Phi3ForCausalLM`],[`mpt`,`MptForCausalLM`],[`opt`,`OPTForCausalLM`],[`mbart`,`MBartForCausalLM`],[`mistral`,`MistralForCausalLM`],[`mistral4`,`Mistral4ForCausalLM`],[`ministral`,`MinistralForCausalLM`],[`ministral3`,`Ministral3ForCausalLM`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2ForCausalLM`],[`deepseek_v3`,`DeepseekV3ForCausalLM`],[`deepseek_v4`,`DeepseekV4ForCausalLM`],[`falcon`,`FalconForCausalLM`],[`falcon_h1`,`FalconH1ForCausalLM`],[`nemotron_h`,`NemotronHForCausalLM`],[`trocr`,`TrOCRForCausalLM`],[`solar_open`,`SolarOpenForCausalLM`],[`stablelm`,`StableLmForCausalLM`],[`modernbert-decoder`,`ModernBertDecoderForCausalLM`],[`hunyuan_v1_dense`,`HunYuanDenseV1ForCausalLM`],[`youtu`,`YoutuForCausalLM`],[`zaya`,`ZayaForCausalLM`],[`hrm_text`,`HrmTextForCausalLM`],[`phi3_v`,`Phi3VForCausalLM`]]),_k=/* @__PURE__ */ new Map([[`multi_modality`,`MultiModalityCausalLM`]]),vk=/* @__PURE__ */ new Map([[`bert`,`BertForMaskedLM`],[`eurobert`,`EuroBertForMaskedLM`],[`neobert`,`NeoBertForMaskedLM`],[`modernbert`,`ModernBertForMaskedLM`],[`roformer`,`RoFormerForMaskedLM`],[`electra`,`ElectraForMaskedLM`],[`esm`,`EsmForMaskedLM`],[`convbert`,`ConvBertForMaskedLM`],[`camembert`,`CamembertForMaskedLM`],[`deberta`,`DebertaForMaskedLM`],[`deberta-v2`,`DebertaV2ForMaskedLM`],[`mpnet`,`MPNetForMaskedLM`],[`albert`,`AlbertForMaskedLM`],[`distilbert`,`DistilBertForMaskedLM`],[`roberta`,`RobertaForMaskedLM`],[`xlm`,`XLMWithLMHeadModel`],[`xlm-roberta`,`XLMRobertaForMaskedLM`],[`mobilebert`,`MobileBertForMaskedLM`],[`squeezebert`,`SqueezeBertForMaskedLM`]]),yk=/* @__PURE__ */ new Map([[`bert`,`BertForQuestionAnswering`],[`neobert`,`NeoBertForQuestionAnswering`],[`roformer`,`RoFormerForQuestionAnswering`],[`electra`,`ElectraForQuestionAnswering`],[`convbert`,`ConvBertForQuestionAnswering`],[`camembert`,`CamembertForQuestionAnswering`],[`deberta`,`DebertaForQuestionAnswering`],[`deberta-v2`,`DebertaV2ForQuestionAnswering`],[`mpnet`,`MPNetForQuestionAnswering`],[`albert`,`AlbertForQuestionAnswering`],[`distilbert`,`DistilBertForQuestionAnswering`],[`roberta`,`RobertaForQuestionAnswering`],[`xlm`,`XLMForQuestionAnswering`],[`xlm-roberta`,`XLMRobertaForQuestionAnswering`],[`mobilebert`,`MobileBertForQuestionAnswering`],[`squeezebert`,`SqueezeBertForQuestionAnswering`]]),bk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`]]),xk=/* @__PURE__ */ new Map([[`llava`,`LlavaForConditionalGeneration`],[`llava_onevision`,`LlavaOnevisionForConditionalGeneration`],[`moondream1`,`Moondream1ForConditionalGeneration`],[`florence2`,`Florence2ForConditionalGeneration`],[`qwen2_vl`,`Qwen2VLForConditionalGeneration`],[`qwen2_5_vl`,`Qwen2_5_VLForConditionalGeneration`],[`qwen3_vl`,`Qwen3VLForConditionalGeneration`],[`qwen3_vl_moe`,`Qwen3VLMoeForConditionalGeneration`],[`qwen3_5`,`Qwen3_5ForConditionalGeneration`],[`qwen3_5_moe`,`Qwen3_5MoeForConditionalGeneration`],[`lfm2_vl`,`Lfm2VlForConditionalGeneration`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`],[`paligemma`,`PaliGemmaForConditionalGeneration`],[`llava_qwen2`,`LlavaQwen2ForCausalLM`],[`gemma3`,`Gemma3ForConditionalGeneration`],[`gemma3n`,`Gemma3nForConditionalGeneration`],[`gemma4`,`Gemma4ForConditionalGeneration`],[`mistral3`,`Mistral3ForConditionalGeneration`],[`lighton_ocr`,`LightOnOcrForConditionalGeneration`],[`glm_ocr`,`GlmOcrForConditionalGeneration`]]),Sk=/* @__PURE__ */ new Map([[`granite_speech`,`GraniteSpeechForConditionalGeneration`],[`ultravox`,`UltravoxModel`],[`voxtral`,`VoxtralForConditionalGeneration`],[`voxtral_realtime`,`VoxtralRealtimeForConditionalGeneration`]]),Ck=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`]]),wk=/* @__PURE__ */ new Map([[`vit`,`ViTForImageClassification`],[`ijepa`,`IJepaForImageClassification`],[`pvt`,`PvtForImageClassification`],[`vit_msn`,`ViTMSNForImageClassification`],[`fastvit`,`FastViTForImageClassification`],[`mobilevit`,`MobileViTForImageClassification`],[`mobilevitv2`,`MobileViTV2ForImageClassification`],[`beit`,`BeitForImageClassification`],[`deit`,`DeiTForImageClassification`],[`hiera`,`HieraForImageClassification`],[`convnext`,`ConvNextForImageClassification`],[`convnextv2`,`ConvNextV2ForImageClassification`],[`dinov2`,`Dinov2ForImageClassification`],[`dinov2_with_registers`,`Dinov2WithRegistersForImageClassification`],[`resnet`,`ResNetForImageClassification`],[`swin`,`SwinForImageClassification`],[`segformer`,`SegformerForImageClassification`],[`efficientnet`,`EfficientNetForImageClassification`],[`mobilenet_v1`,`MobileNetV1ForImageClassification`],[`mobilenet_v2`,`MobileNetV2ForImageClassification`],[`mobilenet_v3`,`MobileNetV3ForImageClassification`],[`mobilenet_v4`,`MobileNetV4ForImageClassification`]]),Tk=/* @__PURE__ */ new Map([[`detr`,`DetrForObjectDetection`],[`rt_detr`,`RTDetrForObjectDetection`],[`rt_detr_v2`,`RTDetrV2ForObjectDetection`],[`rf_detr`,`RFDetrForObjectDetection`],[`d_fine`,`DFineForObjectDetection`],[`table-transformer`,`TableTransformerForObjectDetection`],[`yolos`,`YolosForObjectDetection`]]),Ek=/* @__PURE__ */ new Map([[`owlvit`,`OwlViTForObjectDetection`],[`owlv2`,`Owlv2ForObjectDetection`],[`grounding-dino`,`GroundingDinoForObjectDetection`]]),Dk=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`clipseg`,`CLIPSegForImageSegmentation`]]),Ok=/* @__PURE__ */ new Map([[`segformer`,`SegformerForSemanticSegmentation`],[`sapiens`,`SapiensForSemanticSegmentation`],[`swin`,`SwinForSemanticSegmentation`],[`mobilenet_v1`,`MobileNetV1ForSemanticSegmentation`],[`mobilenet_v2`,`MobileNetV2ForSemanticSegmentation`],[`mobilenet_v3`,`MobileNetV3ForSemanticSegmentation`],[`mobilenet_v4`,`MobileNetV4ForSemanticSegmentation`]]),kk=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`maskformer`,`MaskFormerForInstanceSegmentation`]]),Ak=/* @__PURE__ */ new Map([[`sam`,`SamModel`],[`sam2`,`Sam2Model`],[`edgetam`,`EdgeTamModel`],[`sam3_tracker`,`Sam3TrackerModel`]]),jk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForCTC`],[`wav2vec2-bert`,`Wav2Vec2BertForCTC`],[`unispeech`,`UniSpeechForCTC`],[`unispeech-sat`,`UniSpeechSatForCTC`],[`wavlm`,`WavLMForCTC`],[`hubert`,`HubertForCTC`],[`parakeet_ctc`,`ParakeetForCTC`]]),Mk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForSequenceClassification`],[`wav2vec2-bert`,`Wav2Vec2BertForSequenceClassification`],[`unispeech`,`UniSpeechForSequenceClassification`],[`unispeech-sat`,`UniSpeechSatForSequenceClassification`],[`wavlm`,`WavLMForSequenceClassification`],[`hubert`,`HubertForSequenceClassification`],[`audio-spectrogram-transformer`,`ASTForAudioClassification`]]),Nk=/* @__PURE__ */ new Map([[`wavlm`,`WavLMForXVector`]]),Pk=/* @__PURE__ */ new Map([[`unispeech-sat`,`UniSpeechSatForAudioFrameClassification`],[`wavlm`,`WavLMForAudioFrameClassification`],[`wav2vec2`,`Wav2Vec2ForAudioFrameClassification`],[`pyannote`,`PyAnnoteForAudioFrameClassification`]]),Fk=/* @__PURE__ */ new Map([[`vitmatte`,`VitMatteForImageMatting`]]),Ik=/* @__PURE__ */ new Map([[`patchtst`,`PatchTSTForPrediction`],[`patchtsmixer`,`PatchTSMixerForPrediction`]]),Lk=/* @__PURE__ */ new Map([[`swin2sr`,`Swin2SRForImageSuperResolution`]]),Rk=/* @__PURE__ */ new Map([[`chmv2`,`CHMv2ForDepthEstimation`],[`dpt`,`DPTForDepthEstimation`],[`depth_anything`,`DepthAnythingForDepthEstimation`],[`glpn`,`GLPNForDepthEstimation`],[`sapiens`,`SapiensForDepthEstimation`],[`depth_pro`,`DepthProForDepthEstimation`],[`metric3d`,`Metric3DForDepthEstimation`],[`metric3dv2`,`Metric3Dv2ForDepthEstimation`]]),zk=/* @__PURE__ */ new Map([[`sapiens`,`SapiensForNormalEstimation`]]),Bk=/* @__PURE__ */ new Map([[`vitpose`,`VitPoseForPoseEstimation`]]),Vk=/* @__PURE__ */ new Map([[`clip`,`CLIPVisionModelWithProjection`],[`siglip`,`SiglipVisionModel`],[`jina_clip`,`JinaCLIPVisionModel`]]),Hk=[[ok,X.EncoderOnly],[sk,X.EncoderDecoder],[lk,X.DecoderOnlyWithoutHead],[ck,X.AutoEncoder],[pk,X.EncoderOnly],[mk,X.EncoderOnly],[hk,X.Seq2Seq],[uk,X.Seq2Seq],[gk,X.DecoderOnly],[_k,X.MultiModality],[vk,X.EncoderOnly],[yk,X.EncoderOnly],[bk,X.Vision2Seq],[xk,X.ImageTextToText],[Sk,X.AudioTextToText],[wk,X.EncoderOnly],[Dk,X.EncoderOnly],[kk,X.EncoderOnly],[Ok,X.EncoderOnly],[Fk,X.EncoderOnly],[Ik,X.EncoderOnly],[Lk,X.EncoderOnly],[Rk,X.EncoderOnly],[zk,X.EncoderOnly],[Bk,X.EncoderOnly],[Tk,X.EncoderOnly],[Ek,X.EncoderOnly],[Ak,X.MaskGeneration],[jk,X.EncoderOnly],[Mk,X.EncoderOnly],[dk,X.Seq2Seq],[fk,X.EncoderOnly],[Nk,X.EncoderOnly],[Pk,X.EncoderOnly],[Vk,X.EncoderOnly]];for(let[e,t]of Hk)for(let n of e.values()){Sg.set(n,t);let e=Kg[n];wg.set(e,n),Cg.set(n,e)}var Uk=[[`MusicgenForConditionalGeneration`,yw,X.Musicgen],[`Phi3VForCausalLM`,CT,X.Phi3V],[`CLIPTextModelWithProjection`,$_,X.EncoderOnly],[`SiglipTextModel`,BE,X.EncoderOnly],[`JinaCLIPTextModel`,dS,X.EncoderOnly],[`ClapTextModelWithProjection`,J_,X.EncoderOnly],[`ClapAudioModelWithProjection`,Y_,X.EncoderOnly],[`DacEncoderModel`,Bv,X.EncoderOnly],[`DacDecoderModel`,Vv,X.EncoderOnly],[`MimiEncoderModel`,eC,X.EncoderOnly],[`MimiDecoderModel`,tC,X.EncoderOnly],[`SnacEncoderModel`,JE,X.EncoderOnly],[`SnacDecoderModel`,YE,X.EncoderOnly],[`Gemma3nForConditionalGeneration`,zb,X.ImageAudioTextToText],[`Gemma4ForConditionalGeneration`,Vb,X.ImageAudioTextToText],[`SupertonicForConditionalGeneration`,vD,X.Supertonic],[`ChatterboxModel`,V_,X.Chatterbox],[`VoxtralRealtimeForConditionalGeneration`,yO,X.VoxtralRealtime]];for(let[e,t,n]of Uk)Sg.set(e,n),wg.set(t,e),Cg.set(e,t);var Wk=/* @__PURE__ */ new Map([[`modnet`,Dk],[`birefnet`,Dk],[`isnet`,Dk],[`ben`,Dk]]);for(let[e,t]of Wk.entries())t.set(e,`PreTrainedModel`),Sg.set(e,X.EncoderOnly),Cg.set(e,Z);var Gk=new Set(Wk.keys());Sg.set(`PreTrainedModel`,X.EncoderOnly),wg.set(Z,`PreTrainedModel`);var Q={MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES:pk,MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES:mk,MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES:dk,MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES:fk,MODEL_FOR_MASKED_LM_MAPPING_NAMES:vk,MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES:yk,MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES:wk,MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES:Dk,MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES:Ok,MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES:kk,MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES:Tk,MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES:Ek,MODEL_FOR_MASK_GENERATION_MAPPING_NAMES:Ak,MODEL_FOR_CTC_MAPPING_NAMES:jk,MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES:Mk,MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES:Nk,MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES:Pk,MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES:Ck,MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES:Fk,MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES:Lk,MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES:Rk,MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES:zk,MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES:Bk,MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES:Vk,MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES:xk,MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES:Sk,MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES:hk,MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES:uk,MODEL_FOR_CAUSAL_LM_MAPPING_NAMES:gk,MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES:bk};_g(Q);var $=class{static MODEL_CLASS_MAPPINGS=null;static BASE_IF_FAIL=!1;static supports(e){if(!this.MODEL_CLASS_MAPPINGS)return!1;for(let t of this.MODEL_CLASS_MAPPINGS)if(t.has(e))return!0;return this.BASE_IF_FAIL}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d};if(f.config=await Sh.from_pretrained(e,f),!this.MODEL_CLASS_MAPPINGS)throw Error("`MODEL_CLASS_MAPPINGS` not implemented for this type of `AutoClass`: "+this.name);let{model_type:p}=f.config;for(let t of this.MODEL_CLASS_MAPPINGS){let n=t.get(p);if(!n){for(let e of t.values())if(e[0]===p){n=e;break}if(!n)continue}return await Kg[n].from_pretrained(e,f)}if(this.BASE_IF_FAIL)return Gk.has(p)||A.warn(`Unknown model class "${p}", attempting to construct from base class.`),await Z.from_pretrained(e,f);throw Error(`Unsupported model type: ${p}`)}},Kk=class extends ${static MODEL_CLASS_MAPPINGS=Hk.map(e=>e[0]);static BASE_IF_FAIL=!0},qk=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES]},Jk=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES]},Yk=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES]},Xk=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES]},Zk=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES]},Qk=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES]},$k=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES]},eA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_MASKED_LM_MAPPING_NAMES]},tA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES]},nA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES]},rA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES]},iA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES]},aA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES]},oA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES]},sA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES]},cA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES]};(class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_MASK_GENERATION_MAPPING_NAMES]});var lA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_CTC_MAPPING_NAMES]},uA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES]};(class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES]}),class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES]};var dA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES]};(class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES]});var fA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES]},pA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES]};(class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES]}),class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES]};var mA=class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES]};(class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES]}),class extends ${static MODEL_CLASS_MAPPINGS=[Q.MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES]};async function hA(e){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>Bf.read(e)))}async function gA(e,t){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>typeof e==`string`||e instanceof URL?Ud(e,t):e instanceof Float64Array?new Float32Array(e):e))}function _A(e,t){t&&(e=e.map(e=>e|0));let[n,r,i,a]=e;return{xmin:n,ymin:r,xmax:i,ymax:a}}var vA=class extends $r{constructor({task:e,model:t,tokenizer:n=null,processor:r=null}){super(),this.task=e,this.model=t,this.tokenizer=n,this.processor=r}async dispose(){await this.model.dispose()}},yA=class extends vA{async _call(e,{top_k:t=1}={}){let n=this.tokenizer(e,{padding:!0,truncation:!0}),r=await this.model(n),{problem_type:i,id2label:a}=this.model.config,o=i===`multi_label_classification`?e=>e.sigmoid():e=>new H(`float32`,al(e.data),e.dims),s=[];for(let e of r.logits){let n=await ru(o(e),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));t===1?s.push(...i):s.push(i)}return Array.isArray(e)||t===1?s:s[0]}},bA=class extends vA{async _call(e,{ignore_labels:t=[`O`],aggregation_strategy:n=`none`}={}){if(n!==`none`&&n!==`simple`)throw Error(`Invalid aggregation_strategy: "${n}". Must be one of "none" or "simple".`);let r=Array.isArray(e),i=this.tokenizer(r?e:[e],{padding:!0,truncation:!0}),a=(await this.model(i)).logits,o=this.model.config.id2label,s=[];for(let e=0;e{let o=0,s=[];for(let n=i;ne==u),i=a[e].tolist(),f=o[e].tolist();for(let n=1;ne==t[n])!==-1)&&(i[n]=-1/0,f[n]=-1/0);let p=al(i).map((e,t)=>[e,t]),m=al(f).map((e,t)=>[e,t]);p[0][0]=0,m[0][0]=0;let h=oi(p,m).filter(e=>e[0][1]<=e[1][1]).map(e=>[e[0][1],e[1][1],e[0][0]*e[1][0]]).sort((e,t)=>t[2]-e[2]),g=[];for(let e=0;ee==n);if(c===-1)throw Error(`Mask token (${r}) not found in text.`);let l=a[e][c],u=await ru(new H(`float32`,al(l.data),l.dims),t),d=u[0].tolist(),f=u[1].tolist();o.push(f.map((e,t)=>{let n=i.slice();return n[c]=e,{score:d[t],token:Number(e),token_str:this.tokenizer.decode([e]),sequence:this.tokenizer.decode(n,{skip_special_tokens:!0})}}))}return Array.isArray(e)?o:o[0]}},TA=class extends vA{_default_generation_config={max_new_tokens:256};_key=`generated_text`;async _call(e,t={}){Array.isArray(e)||(e=[e]),this.model.config.prefix&&(e=e.map(e=>this.model.config.prefix+e));let n=this.model.config.task_specific_params;n&&n[this.task]&&n[this.task].prefix&&(e=e.map(e=>n[this.task].prefix+e));let r=this.tokenizer,i={padding:!0,truncation:!0},a;a=this.task===`translation`&&`_build_translation_inputs`in r?r._build_translation_inputs(e,i,t):r(e,i);let o=await this.model.generate({...a,...this._default_generation_config,...t});return r.batch_decode(o,{skip_special_tokens:!0}).map(e=>({[this._key]:e}))}},EA=class extends TA{_key=`summary_text`},DA=class extends TA{_key=`translation_text`};function OA(e){return Array.isArray(e)&&e.every(e=>`role`in e&&`content`in e)}var kA=class extends vA{_default_generation_config={max_new_tokens:256};async _call(e,t={}){let{add_special_tokens:n,return_full_text:r,tools:i,documents:a,chat_template:o,tokenizer_encode_kwargs:s,...c}=t,l=!1,u=!1,d=n??(this.tokenizer.add_bos_token||this.tokenizer.add_eos_token)??!1,f=s,p;if(typeof e==`string`)p=e=[e];else if(Array.isArray(e)&&e.every(e=>typeof e==`string`))l=!0,p=e;else{if(OA(e))e=[e];else if(Array.isArray(e)&&e.every(OA))l=!0;else throw Error(`Input must be a string, an array of strings, a Chat, or an array of Chats`);u=!0;let t={tokenize:!1,add_generation_prompt:!0,...ci({tools:i,documents:a,chat_template:o},[`tools`,`documents`,`chat_template`]),...f};p=e.map(e=>this.tokenizer.apply_chat_template(e,t)),d=!1,f=void 0}let m=u?!1:r??!0;this.tokenizer.padding_side=`left`;let h=this.tokenizer(p,{add_special_tokens:d,padding:!0,truncation:!0,...f}),g=await this.model.generate({...h,...this._default_generation_config,...c}),_=this.tokenizer.batch_decode(g,{skip_special_tokens:!0}),v;!m&&h.input_ids.dims.at(-1)>0&&(v=this.tokenizer.batch_decode(h.input_ids,{skip_special_tokens:!0}).map(e=>e.length));let y=Array.from({length:e.length},e=>[]);for(let t=0;t<_.length;++t){let n=Math.floor(t/g.dims[0]*e.length);v&&(_[t]=_[t].slice(v[n])),y[n].push({generated_text:u?[...e[n],{role:`assistant`,content:_[t]}]:_[t]})}return!l&&y.length===1?y[0]:y}},AA=class extends vA{constructor(e){super(e),this.label2id=Object.fromEntries(Object.entries(this.model.config.label2id).map(([e,t])=>[e.toLowerCase(),t])),this.entailment_id=this.label2id.entailment,this.entailment_id===void 0&&(A.warn(`Could not find 'entailment' in label2id mapping. Using 2 as entailment_id.`),this.entailment_id=2),this.contradiction_id=this.label2id.contradiction??this.label2id.not_entailment,this.contradiction_id===void 0&&(A.warn(`Could not find 'contradiction' in label2id mapping. Using 0 as contradiction_id.`),this.contradiction_id=0)}async _call(e,t,{hypothesis_template:n=`This example is {}.`,multi_label:r=!1}={}){let i=Array.isArray(e);i||(e=[e]),Array.isArray(t)||(t=[t]);let a=t.map(e=>n.replace(`{}`,e)),o=r||t.length===1,s=[];for(let n of e){let e=[];for(let t of a){let r=this.tokenizer(n,{text_pair:t,padding:!0,truncation:!0}),i=await this.model(r);o?e.push([i.logits.data[this.contradiction_id],i.logits.data[this.entailment_id]]):e.push(i.logits.data[this.entailment_id])}let r=(o?e.map(e=>al(e)[1]):al(e)).map((e,t)=>[e,t]).sort((e,t)=>t[0]-e[0]);s.push({sequence:n,labels:r.map(e=>t[e[1]]),scores:r.map(e=>e[0])})}return i?s:s[0]}},jA=class extends vA{async _call(e,{top_k:t=5}={}){let n=this.processor.feature_extractor.config.sampling_rate,r=await gA(e,n),i=this.model.config.id2label,a=[];for(let e of r){let n=await this.processor(e),r=(await this.model(n)).logits[0],o=await ru(new H(`float32`,al(r.data),r.dims),t),s=o[0].tolist(),c=o[1].tolist().map((e,t)=>({label:i?i[e]:`LABEL_${e}`,score:s[t]}));a.push(c)}return Array.isArray(e)?a:a[0]}},MA=class extends vA{async _call(e,t,{hypothesis_template:n=`This is a sound of {}.`}={}){let r=!Array.isArray(e);r&&(e=[e]);let i=t.map(e=>n.replace(`{}`,e)),a=this.tokenizer(i,{padding:!0,truncation:!0}),o=this.processor.feature_extractor.config.sampling_rate,s=await gA(e,o),c=[];for(let e of s){let n=await this.processor(e),r=al((await this.model({...a,...n})).logits_per_audio.data);c.push([...r].map((e,n)=>({score:e,label:t[n]})))}return r?c[0]:c}},NA=class extends vA{_default_generation_config={};async _call(e,t={}){switch(t={...this._default_generation_config,...t},this.model.config.model_type){case`whisper`:case`lite-whisper`:return this._call_whisper(e,t);case`wav2vec2`:case`wav2vec2-bert`:case`unispeech`:case`unispeech-sat`:case`hubert`:case`parakeet_ctc`:return this._call_wav2vec2(e,t);case`moonshine`:return this._call_moonshine(e,t);case`cohere_asr`:return this._call_cohere_asr(e,t);default:throw Error(`AutomaticSpeechRecognitionPipeline does not support model type '${this.model.config.model_type}'.`)}}async _call_wav2vec2(e,t){t.language&&A.warn('`language` parameter is not yet supported for `wav2vec2` models, defaulting to "English".'),t.task&&A.warn('`task` parameter is not yet supported for `wav2vec2` models, defaulting to "transcribe".');let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await gA(r,i),o=[];for(let e of a){let t=await this.processor(e),n=(await this.model(t)).logits[0],r=[];for(let e of n)r.push(cl(e.data)[1]);let i=this.tokenizer.decode(r,{skip_special_tokens:!0}).trim();o.push({text:i})}return n?o[0]:o}async _call_whisper(e,t){let n=t.return_timestamps??!1,r=t.chunk_length_s??0,i=t.force_full_sequences??!1,a=t.stride_length_s??null,o={...t};n===`word`&&(o.return_token_timestamps=!0,o.return_timestamps=!0);let s=!Array.isArray(e),c=s?[e]:e,l=this.processor.feature_extractor.config,u=l.chunk_length/this.model.config.max_source_positions,d=l.hop_length,f=l.sampling_rate,p=await gA(c,f),m=[];for(let e of p){let t=[];if(r>0){if(a===null)a=r/6;else if(r<=a)throw Error("`chunk_length_s` must be larger than `stride_length_s`.");let n=f*r,i=f*a,o=n-2*i,s=0;for(;;){let r=s+n,a=e.subarray(s,r),c=await this.processor(a),l=s===0,u=r>=e.length;if(t.push({stride:[a.length,l?0:i,u?0:i],input_features:c.input_features,is_last:u}),u)break;s+=o}}else t=[{stride:[e.length,0,0],input_features:(await this.processor(e)).input_features,is_last:!0}];for(let e of t){o.num_frames=Math.floor(e.stride[0]/d);let t=await this.model.generate({inputs:e.input_features,...o});if(n===`word`){let n=t.sequences.tolist()[0],r=t.token_timestamps.tolist()[0],i=this.tokenizer.timestamp_begin,a=Math.max(n.findIndex(e=>Number(e)>=i),0);e.tokens=n.slice(a),e.token_timestamps=r.slice(a).map(e=>ml(e,2))}else e.tokens=t[0].tolist();e.stride=e.stride.map(e=>e/f)}let[s,c]=this.tokenizer._decode_asr(t,{time_precision:u,return_timestamps:n,force_full_sequences:i});m.push({text:s,...c})}return s?m[0]:m}async _call_moonshine(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await gA(r,i),o=[];for(let e of a){let n=await this.processor(e),r=Math.floor(e.length/i)*6,a=await this.model.generate({max_new_tokens:r,...t,...n}),s=this.tokenizer.batch_decode(a,{skip_special_tokens:!0})[0];o.push({text:s})}return n?o[0]:o}async _call_cohere_asr(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor,a=i.config.sampling_rate,o=await gA(r,a),s=t.language??`en`,c=this.processor.get_decoder_prompt_ids(s),l=[];for(let e of o){let n=i.split_audio(e),r=[];for(let e of n){let n=await this.processor(e),i=await this.model.generate({...n,decoder_input_ids:c,...t}),a=this.tokenizer.decode(i[0].tolist(),{skip_special_tokens:!0}).trim();r.push(a)}let a=this.processor.constructor.join_chunks(r,s);l.push({text:a})}return n?l[0]:l}},PA=class extends vA{DEFAULT_VOCODER_ID=`Xenova/speecht5_hifigan`;constructor(e){super(e),this.vocoder=e.vocoder??null}async _prepare_speaker_embeddings(e,t){if((typeof e==`string`||e instanceof URL)&&(e=new Float32Array(await(await k.fetch(e)).arrayBuffer())),e instanceof Float32Array)e=new H(`float32`,e,[e.length]);else if(!(e instanceof H))throw Error("Speaker embeddings must be a `Tensor`, `Float32Array`, `string`, or `URL`.");if(t>1){if(e.dims[0]===1)e=e.repeat(t,1);else if(e.dims[0]!==t)throw Error(`Expected speaker embeddings batch size to be 1 or ${t}, but got ${e.dims[0]}.`)}return e}_postprocess_waveform(e,t,n,r=null){let i=t.data,[a,o]=t.dims,s=r?r.data:null,c=[];for(let e=0;e({generated_text:e.trim()}));a.push(r)}return n?a:a[0]}},IA=class extends vA{async _call(e,{top_k:t=5}={}){let n=await hA(e),{pixel_values:r}=await this.processor(n),i=await this.model({pixel_values:r}),{id2label:a}=this.model.config,o=[];for(let e of i.logits){let n=await ru(new H(`float32`,al(e.data),e.dims),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));o.push(i)}return Array.isArray(e)?o:o[0]}},LA={panoptic:`post_process_panoptic_segmentation`,instance:`post_process_instance_segmentation`,semantic:`post_process_semantic_segmentation`},RA=class extends vA{async _call(e,{threshold:t=.5,mask_threshold:n=.5,overlap_mask_area_threshold:r=.8,label_ids_to_fuse:i=null,target_sizes:a=null,subtask:o=null}={}){if(Array.isArray(e)&&e.length!==1)throw Error(`Image segmentation pipeline currently only supports a batch size of 1.`);let s=await hA(e),c=s.map(e=>[e.height,e.width]),l=await this.processor(s),{inputNames:u,outputNames:d}=this.model.sessions.model;if(!u.includes(`pixel_values`)){if(u.length!==1)throw Error(`Expected a single input name, but got ${u.length} inputs: ${u}.`);let e=u[0];if(e in l)throw Error(`Input name ${e} already exists in the inputs.`);l[e]=l.pixel_values}let f=await this.model(l),p=null;if(o!==null)p=LA[o];else if(this.processor.image_processor){for(let[e,t]of Object.entries(LA))if(t in this.processor.image_processor){p=this.processor.image_processor[t].bind(this.processor.image_processor),o=e;break}}let m=this.model.config.id2label,h=[];if(!o){let e=f[d[0]];for(let t=0;te<-1e-5||e>1.00001)&&r.sigmoid_();let i=await Bf.fromTensor(r.mul_(255).to(`uint8`)).resize(n[1],n[0]);h.push({label:null,score:null,mask:i})}}else if(o===`panoptic`||o===`instance`){let e=p(f,t,n,r,i,a??c)[0],o=e.segmentation;for(let t of e.segments_info){let e=new Uint8ClampedArray(o.data.length);for(let n=0;n{let n=e.clone();return n.putAlpha(r[t].mask),n});return Array.isArray(e)?i:i[0]}},model:[iA,aA,oA],default:{model:`Xenova/modnet`},type:`image`},"zero-shot-image-classification":{pipeline:class extends vA{async _call(e,t,{hypothesis_template:n=`This is a photo of {}`}={}){let r=Array.isArray(e),i=await hA(e),a=t.map(e=>n.replace(`{}`,e)),o=this.tokenizer(a,{padding:this.model.config.model_type!==`siglip`||`max_length`,truncation:!0}),{pixel_values:s}=await this.processor(i),c=await this.model({...o,pixel_values:s}),l=this.model.config.model_type===`siglip`?e=>e.sigmoid().data:e=>al(e.data),u=[];for(let e of c.logits_per_image){let n=[...l(e)].map((e,n)=>({score:e,label:t[n]}));n.sort((e,t)=>t.score-e.score),u.push(n)}return r?u:u[0]}},model:Kk,default:{model:`Xenova/clip-vit-base-patch32`},type:`multimodal`},"object-detection":{pipeline:class extends vA{async _call(e,{threshold:t=.9,percentage:n=!1}={}){let r=Array.isArray(e);if(r&&e.length!==1)throw Error(`Object detection pipeline currently only supports a batch size of 1.`);let i=await hA(e),a=n?null:i.map(e=>[e.height,e.width]),{pixel_values:o,pixel_mask:s}=await this.processor(i),c=await this.model({pixel_values:o,pixel_mask:s}),l=this.processor.image_processor.post_process_object_detection(c,t,a),{id2label:u}=this.model.config,d=l.map(e=>e.boxes.map((t,r)=>({score:e.scores[r],label:u[e.classes[r]],box:_A(t,!n)})));return r?d:d[0]}},model:sA,default:{model:`Xenova/detr-resnet-50`},type:`multimodal`},"zero-shot-object-detection":{pipeline:class extends vA{async _call(e,t,{threshold:n=.1,top_k:r=null,percentage:i=!1}={}){let a=Array.isArray(e),o=await hA(e),s=this.tokenizer(t,{padding:!0,truncation:!0}),c=await this.processor(o),l=[];for(let e=0;e({score:e.scores[n],label:e.labels[n],box:_A(t,!i)}))}else{let e=this.processor.image_processor.post_process_object_detection(f,n,u,!0)[0];p=e.boxes.map((n,r)=>({score:e.scores[r],label:t[e.classes[r]],box:_A(n,!i)}))}p.sort((e,t)=>t.score-e.score),r!==null&&(p=p.slice(0,r)),l.push(p)}return a?l:l[0]}},model:cA,default:{model:`Xenova/owlvit-base-patch32`},type:`multimodal`},"document-question-answering":{pipeline:class extends vA{_default_generation_config={max_new_tokens:256};async _call(e,t,n={}){if(Array.isArray(e)){if(e.length!==1)throw Error(`Document Question Answering pipeline currently only supports a batch size of 1.`);e=e[0]}let r=(await hA(e))[0],{pixel_values:i}=await this.processor(r),a=`${t}`,o=this.tokenizer(a,{add_special_tokens:!1,padding:!0,truncation:!0}).input_ids,s=await this.model.generate({inputs:i,max_length:this.model.config.decoder.max_position_embeddings,decoder_input_ids:o,...this._default_generation_config,...n}),c=this.tokenizer.batch_decode(s)[0].match(/(.*?)<\/s_answer>/),l=null;return c&&c.length>=2&&(l=c[1].trim()),[{answer:l}]}},model:dA,default:{model:`Xenova/donut-base-finetuned-docvqa`},type:`multimodal`},"image-to-image":{pipeline:class extends vA{async _call(e){let t=await hA(e),n=await this.processor(t),r=await this.model(n),i=[];for(let e of r.reconstruction){let t=e.squeeze().clamp_(0,1).mul_(255).round_().to(`uint8`);i.push(Bf.fromTensor(t))}return Array.isArray(e)?i:i[0]}},model:fA,default:{model:`Xenova/swin2SR-classical-sr-x2-64`},type:`image`},"depth-estimation":{pipeline:class extends vA{async _call(e){let t=await hA(e),n=await this.processor(t),{predicted_depth:r}=await this.model(n),i=[];for(let e=0;et).sort((e,t)=>o[t]-o[e]).slice(0,r).map(e=>({index:e,score:o[e]}))}k.allowLocalModels=!1,k.backends.onnx.wasm.numThreads=1,k.cacheKey=`interior-image-field-v2`;let WA,GA,KA=!1;const qA=e=>self.postMessage(e);function JA(){return WA??=(async()=>{qA({status:`loading`,label:`Đang tải mô hình tìm kiếm`});let[e,t,n,r]=await Promise.all([G.from_pretrained(BA),$_.from_pretrained(BA,{dtype:`fp32`,device:`wasm`,progress_callback:e=>{e.status===`progress`&&e.file?.endsWith(`.onnx`)&&qA({status:`loading`,label:`Đang tải mô hình tìm kiếm`,progress:e.progress})}}),VA(zA+`image-embeddings.json`).then(e=>JSON.parse(new TextDecoder().decode(e))),VA(zA+`image-embeddings_25k-512-32bit.bin`)]),i=new Float32Array(r);if(i.length!==n.length*512)throw Error(`The image database and embeddings do not match.`);return HA(i,512),qA({status:`loading`,label:`Đang khởi động tìm kiếm`,progress:100}),await t(e(`a photograph`,{padding:!0,truncation:!0})),qA({status:`ready`,count:n.length}),{tokenizer:e,model:t,metadata:n,embeddings:i}})().catch(e=>{throw WA=null,e})}async function YA(){if(!KA){KA=!0;try{let{tokenizer:e,model:t,metadata:n,embeddings:r}=await JA();for(;GA;){let i=GA;GA=null;let a=performance.now();try{let{text_embeds:o}=await t(e(i.text,{padding:!0,truncation:!0}));if(GA||i.cancelled)continue;let s=UA(o.data,r,512).map(({index:e,score:t})=>({...n[e],score:t}));qA({status:`complete`,id:i.id,text:i.text,output:s,elapsed:performance.now()-a})}catch(e){qA({status:`error`,id:i.id,message:e.message})}}}catch(e){qA({status:`error`,id:GA?.id,message:e.message}),GA=null}finally{KA=!1}}}self.addEventListener(`message`,({data:e})=>{e.type===`init`?JA().catch(e=>qA({status:`error`,message:e.message})):e.type===`search`?(GA={id:e.id,text:e.text},YA()):e.type===`clear`&&(GA=null)}); \ No newline at end of file diff --git a/dist/assets/worker-hEU_3YGf.js b/dist/assets/worker-hEU_3YGf.js deleted file mode 100644 index 4b31f1cecef9b3cae11a8040af49207c1d9e2e22..0000000000000000000000000000000000000000 --- a/dist/assets/worker-hEU_3YGf.js +++ /dev/null @@ -1,45 +0,0 @@ -var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n=/* @__PURE__ */ (e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")}),r=/* @__PURE__ */ t({InferenceSession:()=>Me,TRACE:()=>Ce,TRACE_EVENT_BEGIN:()=>De,TRACE_EVENT_END:()=>Oe,TRACE_FUNC_BEGIN:()=>Te,TRACE_FUNC_END:()=>Ee,Tensor:()=>xe,default:()=>rr,env:()=>w,registerBackend:()=>h}),i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,c=(e=>typeof n<`u`?n:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof n<`u`?n:e)[t]}):e)(function(e){ -/*! -* ONNX Runtime Web v1.31.0-dev.20260914-8d85527a0 -* Copyright (c) Microsoft Corporation. All rights reserved. -* Licensed under the MIT License. -*/ -if(typeof n<`u`)return n.apply(this,arguments);throw Error(`Dynamic require of "`+e+`" is not supported`)}),l=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},u=(e,t)=>{for(var n in t)i(e,n,{get:t[n],enumerable:!0})},d=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(let c of o(t))!s.call(e,c)&&c!==n&&i(e,c,{get:()=>t[c],enumerable:!(r=a(t,c))||r.enumerable});return e},f=e=>d(i({},`__esModule`,{value:!0}),e),p,m,h,g,_,v=l(()=>{p=/* @__PURE__ */ new Map,m=[],h=(e,t,n)=>{if(t&&typeof t.init==`function`&&typeof t.createInferenceSessionHandler==`function`){let r=p.get(e);if(r===void 0)p.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let t=m.indexOf(e);t!==-1&&m.splice(t,1);for(let t=0;t{let t=p.get(e);if(!t)return`backend not found.`;if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(e){return n||(t.error=`${e}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},_=async e=>{let t=e.executionProviders||[],n=t.map(e=>typeof e==`string`?e:e.name),r=n.length===0?m:n,i,a=[],o=/* @__PURE__ */ new Set;for(let e of r){let t=await g(e);typeof t==`string`?a.push({name:e,err:t}):(i||=t,i===t&&o.add(e))}if(!i)throw Error(`no available backend found. ERR: ${a.map(e=>`[${e.name}] ${e.err}`).join(`, `)}`);for(let{name:e,err:t}of a)n.includes(e)&&console.warn(`removing requested execution provider "${e}" from session options because it is not available: ${t}`);let s=t.filter(e=>o.has(typeof e==`string`?e:e.name));return[i,new Proxy(e,{get:(e,t)=>t===`executionProviders`?s:Reflect.get(e,t)})]}}),y=l(()=>{v()}),b,x=l(()=>{b=`1.31.0-dev.20260911-2a43ec07e`}),S,C,ee=l(()=>{x(),S=`warning`,C={wasm:{},webgl:{},webgpu:{},versions:{common:b},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);S=e}},get logLevel(){return S}},Object.defineProperty(C,"logLevel",{enumerable:!0})}),w,te=l(()=>{ee(),w=C}),ne,re,ie=l(()=>{ne=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t!==void 0&&t.format!==void 0?t.format:`RGB`,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t{be(),ae=(e,t)=>{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:`RGB`,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,ae(o,s)}throw Error(`Can not access image data`)}else{if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(ae(e.data,s))}});throw Error(`Input data provided is not supported - aborted tensor creation`)}if(o!==void 0)return ae(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},se=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new ye({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ce=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new ye({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},le=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new ye({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},ue=(e,t,n)=>new ye({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]})}),de,fe,pe,me,he=l(()=>{de=/* @__PURE__ */ new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),fe=/* @__PURE__ */ new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]),pe=!1,me=()=>{if(!pe){pe=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<`u`&&n.from;e&&(de.set(`int64`,BigInt64Array),fe.set(BigInt64Array,`int64`)),t&&(de.set(`uint64`,BigUint64Array),fe.set(BigUint64Array,`uint64`)),r?(de.set(`float16`,n),fe.set(n,`float16`)):de.set(`float16`,Uint16Array)}}}),ge,_e,ve=l(()=>{be(),ge=e=>{let t=1;for(let n=0;n{switch(e.location){case`cpu`:return new ye(e.type,e.data,t);case`cpu-pinned`:return new ye({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new ye({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new ye({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new ye({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}}}),ye,be=l(()=>{ie(),T(),he(),ve(),ye=class{constructor(e,t,n){me();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=de.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`){if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=de.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray){if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`)}else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=fe.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=ge(i);if(this.cpuData&&a!==this.cpuData.length&&(r!==`uint4`&&r!==`int4`||Math.ceil(a/2)!==this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return oe(e,t)}static fromTexture(e,t){return se(e,t)}static fromGpuBuffer(e,t){return ce(e,t)}static fromMLTensor(e,t){return le(e,t)}static fromPinnedBuffer(e,t,n){return ue(e,t,n)}toDataURL(e){return ne(this,e)}toImageData(e){return re(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return _e(this,e)}}}),xe,Se=l(()=>{be(),xe=ye}),Ce,we,Te,Ee,De,Oe,ke=l(()=>{ee(),Ce=(e,t)=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.timeStamp(`${e}::ORT::${t}`)},we=(e,t)=>{let n=(/* @__PURE__ */ Error()).stack?.split(/\r\n|\r|\n/g)||[],r=!1;for(let i=0;i{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||we(`BEGIN`,e)},Ee=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||we(`END`,e)},De=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.time(`ORT::${e}`)},Oe=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.timeEnd(`ORT::${e}`)}}),Ae,je=l(()=>{v(),Se(),ke(),Ae=class e{constructor(e){this.handler=e}async run(e,t,n){Te(),De(`InferenceSession.run`);let r={},i={};if(typeof e!=`object`||!e||e instanceof xe||Array.isArray(e))throw TypeError(`'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.`);let a=!0;if(typeof t==`object`){if(t===null)throw TypeError(`Unexpected argument[1]: cannot be null.`);if(t instanceof xe)throw TypeError(`'fetches' cannot be a Tensor`);if(Array.isArray(t)){if(t.length===0)throw TypeError(`'fetches' cannot be an empty array.`);a=!1;for(let e of t){if(typeof e!=`string`)throw TypeError(`'fetches' must be a string array or an object.`);if(this.outputNames.indexOf(e)===-1)throw RangeError(`'fetches' contains invalid output name: ${e}.`);r[e]=null}if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else{let e=!1,o=Object.getOwnPropertyNames(t);for(let n of this.outputNames)if(o.indexOf(n)!==-1){let i=t[n];(i===null||i instanceof xe)&&(e=!0,a=!1,r[n]=i)}if(e){if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else i=t}}else if(typeof t<`u`)throw TypeError(`Unexpected argument[1]: must be 'fetches' or 'options'.`);for(let t of this.inputNames)if(typeof e[t]>`u`)throw Error(`input '${t}' is missing in 'feeds'.`);if(a)for(let e of this.outputNames)r[e]=null;let o=await this.handler.run(e,r,i),s={};for(let e in o)if(Object.hasOwnProperty.call(o,e)){let t=o[e];s[e]=t instanceof xe?t:new xe(t.type,t.data,t.dims)}return Oe(`InferenceSession.run`),Ee(),s}async release(){return this.handler.dispose()}static async create(t,n,r,i){Te(),De(`InferenceSession.create`);let a,o={};if(typeof t==`string`){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof Uint8Array){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&t instanceof SharedArrayBuffer){let e=t,s=0,c=t.byteLength;if(typeof n==`object`&&n)o=n;else if(typeof n==`number`){if(s=n,!Number.isSafeInteger(s))throw RangeError(`'byteOffset' must be an integer.`);if(s<0||s>=e.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${e.byteLength}).`);if(c=t.byteLength-s,typeof r==`number`){if(c=r,!Number.isSafeInteger(c))throw RangeError(`'byteLength' must be an integer.`);if(c<=0||s+c>e.byteLength)throw RangeError(`'byteLength' is out of range (0, ${e.byteLength-s}].`);if(typeof i==`object`&&i)o=i;else if(typeof i<`u`)throw TypeError(`'options' must be an object.`)}else if(typeof r<`u`)throw TypeError(`'byteLength' must be a number.`)}else if(typeof n<`u`)throw TypeError(`'options' must be an object.`);a=new Uint8Array(e,s,c)}else throw TypeError(`Unexpected argument[0]: must be 'path' or 'buffer'.`);let[s,c]=await _(o),l=await s.createInferenceSessionHandler(a,c);return Oe(`InferenceSession.create`),Ee(),new e(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),Me,Ne=l(()=>{je(),Me=Ae}),Pe=l(()=>{}),Fe=l(()=>{}),Ie=l(()=>{}),Le=l(()=>{}),Re={};u(Re,{InferenceSession:()=>Me,TRACE:()=>Ce,TRACE_EVENT_BEGIN:()=>De,TRACE_EVENT_END:()=>Oe,TRACE_FUNC_BEGIN:()=>Te,TRACE_FUNC_END:()=>Ee,Tensor:()=>xe,env:()=>w,registerBackend:()=>h});var ze=l(()=>{y(),te(),Ne(),Se(),Pe(),Fe(),ke(),Ie(),Le()}),Be=l(()=>{}),Ve={};u(Ve,{default:()=>We});var He,Ue,We,Ge=l(()=>{Dn(),ht(),ot(),He=`ort-wasm-proxy-worker`,Ue=globalThis.self?.name===He,Ue&&(self.onmessage=e=>{let{type:t,in:n}=e.data;try{switch(t){case`init-wasm`:mt(n.wasm).then(()=>{hn(n).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})})},e=>{postMessage({type:t,err:e})});break;case`init-ep`:{let{epName:e,env:r}=n;gn(r,e).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})});break}case`copy-from`:{let{buffer:e}=n,r=bn(e);postMessage({type:t,out:r});break}case`create`:{let{model:e,options:r}=n;xn(e,r).then(e=>{postMessage({type:t,out:e})},e=>{postMessage({type:t,err:e})});break}case`release`:Sn(n),postMessage({type:t});break;case`run`:{let{sessionId:e,inputIndices:r,inputs:i,outputIndices:a,options:o}=n;wn(e,r,i,a,Array(a.length).fill(null),o).then(e=>{e.some(e=>e[3]!==`cpu`)?postMessage({type:t,err:`Proxy does not support non-cpu tensor location.`}):postMessage({type:t,out:e},En([...i,...e]))},e=>{postMessage({type:t,err:e})});break}case`end-profiling`:Tn(n),postMessage({type:t})}}catch(e){postMessage({type:t,err:e})}}),We=Ue?null:e=>new Worker(e??Ye,{type:`module`,name:He})}),Ke,qe,Je,Ye,Xe,Ze,Qe,$e,et,tt,nt,rt,it,at,ot=l(()=>{Be(),Ke=typeof location>`u`?void 0:location.origin,qe=import.meta.url>`file:`&&import.meta.url<`file;`,Je=()=>qe?new URL(new URL(`ort.webgpu.min.mjs`,import.meta.url).href,Ke).href:import.meta.url,Ye=Je(),Xe=()=>{if(Ye&&!Ye.startsWith(`blob:`))return Ye.substring(0,Ye.lastIndexOf(`/`)+1)},Ze=(e,t)=>{try{let n=t??Ye;return(n?new URL(e,n):new URL(e)).origin===Ke}catch{return!1}},Qe=(e,t)=>{let n=t??Ye;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},$e=(e,t)=>`${t??`./`}${e}`,et=async e=>{let t=await(await fetch(e,{credentials:`same-origin`})).blob();return URL.createObjectURL(t)},tt=async e=>(await import( -/*webpackIgnore:true*/ -/*@vite-ignore*/ -e)).default,nt=(Ge(),f(Ve)).default,rt=async()=>{if(!Ye)throw Error(`Failed to load proxy worker: cannot determine the script source URL.`);if(Ze(Ye))return[void 0,nt()];let e=await et(Ye);return[e,nt(e)]},it=void 0,at=async(e,t,n,r)=>{let i=it&&!(e||t);if(i){if(Ye)i=Ze(Ye)||r&&!n;else if(r&&!n)i=!0;else throw Error(`cannot determine the script source URL.`)}if(i)return[void 0,it];{let r=`ort-wasm-simd-threaded.asyncify.mjs`,i=e??Qe(r,t),a=n&&i&&!Ze(i,t),o=a?await et(i):i??$e(r,t);return[a?o:void 0,await tt(o)]}}}),st,ct,lt,ut,dt,ft,pt,mt,E,ht=l(()=>{ot(),ct=!1,lt=!1,ut=!1,dt=()=>{if(typeof SharedArrayBuffer>`u`)return!1;try{return typeof MessageChannel<`u`&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},ft=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},pt=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},mt=async e=>{if(ct)return Promise.resolve();if(lt)throw Error(`multiple calls to 'initializeWebAssembly()' detected.`);if(ut)throw Error(`previous call to 'initializeWebAssembly()' failed.`);lt=!0;let t=e.initTimeout,n=e.numThreads;if(e.simd!==!1){if(e.simd===`relaxed`){if(!pt())throw Error(`Relaxed WebAssembly SIMD is not supported in the current environment.`)}else if(!ft())throw Error(`WebAssembly SIMD is not supported in the current environment.`)}let r=dt();n>1&&!r&&(typeof self<`u`&&!self.crossOriginIsolated&&console.warn(`env.wasm.numThreads is set to `+n+`, but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info.`),console.warn(`WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading.`),e.numThreads=n=1);let i=e.wasmPaths,a=typeof i==`string`?i:void 0,o=i?.mjs,s=o?.href??o,c=i?.wasm,l=c?.href??c,u=e.wasmBinary,[d,f]=await at(s,a,n>1,!!u||!!l),p=!1,m=[];if(t>0&&m.push(new Promise(e=>{setTimeout(()=>{p=!0,e()},t)})),m.push(new Promise((e,t)=>{let r={numThreads:n};if(u)r.wasmBinary=u,r.locateFile=e=>e;else if(l||a)r.locateFile=e=>l??a+e;else if(s&&s.indexOf(`blob:`)!==0)r.locateFile=e=>new URL(e,s).href;else if(d){let e=Xe();e&&(r.locateFile=t=>e+t)}f(r).then(t=>{lt=!1,ct=!0,st=t,e(),d&&URL.revokeObjectURL(d)},e=>{lt=!1,ut=!0,t(e)})})),await Promise.race(m),p)throw Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},E=()=>{if(ct&&st)return st;throw Error(`WebAssembly is not initialized yet.`)}}),gt,_t,D,vt=l(()=>{ht(),gt=(e,t)=>{let n=E(),r=n.lengthBytesUTF8(e)+1,i=n._malloc(r);return n.stringToUTF8(e,i,r),t.push(i),i},_t=(e,t,n,r)=>{if(typeof e==`object`&&e){if(n.has(e))throw Error(`Circular reference in options`);n.add(e)}Object.entries(e).forEach(([e,i])=>{let a=t?t+e:e;if(typeof i==`object`)_t(i,a+`.`,n,r);else if(typeof i==`string`||typeof i==`number`)r(a,i.toString());else if(typeof i==`boolean`)r(a,i?`1`:`0`);else throw Error(`Can't handle extra config type: ${typeof i}`)})},D=e=>{let t=E(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetLastError(r,r+n);let i=Number(t.getValue(r,n===4?`i32`:`i64`)),a=t.getValue(r+n,`*`),o=a?t.UTF8ToString(a):``;throw Error(`${e} ERROR_CODE: ${i}, ERROR_MESSAGE: ${o}`)}finally{t.stackRestore(n)}}}),yt,bt=l(()=>{ht(),vt(),yt=e=>{let t=E(),n=0,r=[],i=e||{};try{if(e?.logSeverityLevel===void 0)i.logSeverityLevel=2;else if(typeof e.logSeverityLevel!=`number`||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw Error(`log severity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)i.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!=`number`||!Number.isInteger(e.logVerbosityLevel))throw Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(i.terminate=!1);let a=0;return e?.tag!==void 0&&(a=gt(e.tag,r)),n=t._OrtCreateRunOptions(i.logSeverityLevel,i.logVerbosityLevel,!!i.terminate,a),n===0&&D(`Can't create run options.`),e?.extra!==void 0&&_t(e.extra,``,/* @__PURE__ */ new WeakSet,(e,i)=>{let a=gt(e,r),o=gt(i,r);t._OrtAddRunConfigEntry(n,a,o)!==0&&D(`Can't set a run config entry: ${e} - ${i}.`)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(e=>t._free(e)),e}}}),xt,St,Ct,wt,Tt,Et,Dt,Ot=l(()=>{ht(),vt(),xt=e=>{switch(e){case`disabled`:return 0;case`basic`:return 1;case`extended`:return 2;case`layout`:return 3;case`all`:return 99;default:throw Error(`unsupported graph optimization level: ${e}`)}},St=e=>{switch(e){case`sequential`:return 0;case`parallel`:return 1;default:throw Error(`unsupported execution mode: ${e}`)}},Ct=e=>{e.extra||={},e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||=`1`,e.executionProviders&&e.executionProviders.some(e=>(typeof e==`string`?e:e.name)===`webgpu`)&&(e.enableMemPattern=!1)},wt=(e,t,n,r)=>{let i=gt(t,r),a=gt(n,r);E()._OrtAddSessionConfigEntry(e,i,a)!==0&&D(`Can't set a session config entry: ${t} - ${n}.`)},Tt=(e,t,n,r)=>{let i=gt(t,r),a=gt(n,r);e.push([i,a])},Et=async(e,t,n)=>{let r=t.executionProviders;for(let i of r){let r=typeof i==`string`?i:i.name,a=[];switch(r){case`webnn`:if(r=`WEBNN`,wt(e,`session.disable_quant_qdq`,`1`,n),wt(e,`session.disable_qdq_constant_folding`,`1`,n),typeof i!=`string`){let t=i?.deviceType;t&&wt(e,`deviceType`,t,n)}break;case`webgpu`:{r=`WebGPU`;let e;if(typeof i!=`string`){let r=i;if(r.device){if(typeof GPUDevice<`u`&&r.device instanceof GPUDevice)e=r.device;else throw Error(`Invalid GPU device set in WebGPU EP options.`)}let{enableGraphCapture:o}=t;if(typeof o==`boolean`&&o&&Tt(a,`enableGraphCapture`,`1`,n),typeof r.preferredLayout==`string`&&Tt(a,`preferredLayout`,r.preferredLayout,n),r.forceCpuNodeNames){let e=Array.isArray(r.forceCpuNodeNames)?r.forceCpuNodeNames:[r.forceCpuNodeNames];Tt(a,`forceCpuNodeNames`,e.join(` -`),n)}r.validationMode&&Tt(a,`validationMode`,r.validationMode,n),typeof r.enableMatmulFp32Accumulation==`boolean`&&Tt(a,`enableMatmulFp32Accumulation`,r.enableMatmulFp32Accumulation?`1`:`0`,n);for(let e of[`storageBufferCacheMode`,`uniformBufferCacheMode`,`queryResolveBufferCacheMode`,`defaultBufferCacheMode`]){let t=r[e];if(t){if(t!==`disabled`&&t!==`lazyRelease`&&t!==`simple`&&t!==`bucket`)throw Error(`${e} must be one of 'disabled', 'lazyRelease', 'simple' or 'bucket': ${t}`);Tt(a,e,t,n)}}}let o=E().webgpuRegisterDevice(e);if(o){let[e,t,r]=o;Tt(a,`deviceId`,e.toString(),n),Tt(a,`webgpuInstance`,t.toString(),n),Tt(a,`webgpuDevice`,r.toString(),n)}}break;case`wasm`:case`cpu`:continue;default:throw Error(`not supported execution provider: ${r}`)}let o=gt(r,n),s=a.length,c=0,l=0;if(s>0){c=E()._malloc(s*E().PTR_SIZE),n.push(c),l=E()._malloc(s*E().PTR_SIZE),n.push(l);for(let e=0;e{let t=E(),n=0,r=[],i=e||{};Ct(i);try{let e=xt(i.graphOptimizationLevel??`all`),a=St(i.executionMode??`sequential`),o=typeof i.logId==`string`?gt(i.logId,r):0,s=i.logSeverityLevel??2;if(!Number.isInteger(s)||s<0||s>4)throw Error(`log severity level is not valid: ${s}`);let c=i.logVerbosityLevel??0;if(!Number.isInteger(c)||c<0||c>4)throw Error(`log verbosity level is not valid: ${c}`);let l=typeof i.optimizedModelFilePath==`string`?gt(i.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(e,!!i.enableCpuMemArena,!!i.enableMemPattern,a,!!i.enableProfiling,0,o,s,c,l),n===0&&D(`Can't create session options.`),i.executionProviders&&await Et(n,i,r),i.enableGraphCapture!==void 0){if(typeof i.enableGraphCapture!=`boolean`)throw Error(`enableGraphCapture must be a boolean value: ${i.enableGraphCapture}`);wt(n,`enableGraphCapture`,i.enableGraphCapture.toString(),r)}if(i.freeDimensionOverrides)for(let[e,a]of Object.entries(i.freeDimensionOverrides)){if(typeof e!=`string`)throw Error(`free dimension override name must be a string: ${e}`);if(typeof a!=`number`||!Number.isInteger(a)||a<0)throw Error(`free dimension override value must be a non-negative integer: ${a}`);let i=gt(e,r);t._OrtAddFreeDimensionOverride(n,i,a)!==0&&D(`Can't set a free dimension override: ${e} - ${a}.`)}return i.extra!==void 0&&_t(i.extra,``,/* @__PURE__ */ new WeakSet,(e,t)=>{wt(n,e,t,r)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&D(`Can't release session options.`),r.forEach(e=>t._free(e)),e}}}),kt,At,jt,Mt,Nt,Pt,Ft,It,Lt=l(()=>{kt=e=>{switch(e){case`int8`:return 3;case`uint8`:return 2;case`bool`:return 9;case`int16`:return 5;case`uint16`:return 4;case`int32`:return 6;case`uint32`:return 12;case`float16`:return 10;case`float32`:return 1;case`float64`:return 11;case`string`:return 8;case`int64`:return 7;case`uint64`:return 13;case`int4`:return 22;case`uint4`:return 21;default:throw Error(`unsupported data type: ${e}`)}},At=e=>{switch(e){case 3:return`int8`;case 2:return`uint8`;case 9:return`bool`;case 5:return`int16`;case 4:return`uint16`;case 6:return`int32`;case 12:return`uint32`;case 10:return`float16`;case 1:return`float32`;case 11:return`float64`;case 8:return`string`;case 7:return`int64`;case 13:return`uint64`;case 22:return`int4`;case 21:return`uint4`;default:throw Error(`unsupported data type: ${e}`)}},jt=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t==`number`?t:t.reduce((e,t)=>e*t,1);return n>0?Math.ceil(r*n):void 0},Mt=e=>{switch(e){case`float16`:return typeof Float16Array<`u`?Float16Array:Uint16Array;case`float32`:return Float32Array;case`uint8`:return Uint8Array;case`int8`:return Int8Array;case`uint16`:return Uint16Array;case`int16`:return Int16Array;case`int32`:return Int32Array;case`bool`:return Uint8Array;case`float64`:return Float64Array;case`uint32`:return Uint32Array;case`int64`:return BigInt64Array;case`uint64`:return BigUint64Array;default:throw Error(`unsupported type: ${e}`)}},Nt=e=>{switch(e){case`verbose`:return 0;case`info`:return 1;case`warning`:return 2;case`error`:return 3;case`fatal`:return 4;default:throw Error(`unsupported logging level: ${e}`)}},Pt=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,Ft=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint64`||e===`int8`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,It=e=>{switch(e){case`none`:return 0;case`cpu`:return 1;case`cpu-pinned`:return 2;case`texture`:return 3;case`gpu-buffer`:return 4;case`ml-tensor`:return 5;default:throw Error(`unsupported data location: ${e}`)}}}),Rt,zt=l(()=>{Be(),Rt=async e=>{if(typeof e==`string`){let t=await fetch(e);if(!t.ok)throw Error(`failed to load external data file: ${e}`);let n=t.headers.get(`Content-Length`),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw Error(`failed to load external data file: ${e}, no response body.`);let n=t.body.getReader(),i;try{i=new ArrayBuffer(r)}catch(e){if(e instanceof RangeError){let e=Math.ceil(r/65536);i=new WebAssembly.Memory({initial:e,maximum:e}).buffer}else throw e}let a=0;for(;;){let{done:e,value:t}=await n.read();if(e)break;let r=t.byteLength;new Uint8Array(i,a,r).set(t),a+=r}return new Uint8Array(i,0,r)}}return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}}),Bt,Vt=l(()=>{Lt(),Bt=(e,t)=>new(Mt(t))(e)}),Ht,Ut,Wt,Gt,Kt,qt,Jt,Yt=l(()=>{Lt(),Ht=[`V`,`I`,`W`,`E`,`F`],Ut=(e,t)=>{console.log(`[${Ht[e]},${(/* @__PURE__ */ new Date()).toISOString()}]${t}`)},Kt=(e,t)=>{Wt=e,Gt=t},qt=(e,t)=>{let n=Nt(e);n>=Nt(Wt)&&Ut(n,typeof t==`function`?t():t)},Jt=(...e)=>{Gt&&qt(...e)}}),Xt,Zt,Qt,$t,en,tn,nn,rn,an,on,sn,cn=l(()=>{Lt(),Yt(),Xt=/* @__PURE__ */ new Map([[`float32`,32],[`float16`,16],[`int32`,32],[`uint32`,32],[`int64`,64],[`uint64`,64],[`int8`,8],[`uint8`,8],[`int4`,4],[`uint4`,4]]),Zt=(e,t)=>{if(t===`int32`)return e;let n=Xt.get(t);if(!n)throw Error(`WebNN backend does not support data type: ${t}`);let r=n/8;if(e.byteLength%r!==0)throw Error(`Invalid Uint8Array length - must be a multiple of ${r}.`);let i=e.byteLength/r,a=new(Mt(t))(e.buffer,e.byteOffset,i);switch(t){case`int64`:case`uint64`:{let e=new Int32Array(i);for(let t=0;t2147483647n||n<-2147483648n)throw Error(`Can not convert int64 data to int32 - value out of range.`);e[t]=Number(n)}return new Uint8Array(e.buffer)}case`int8`:case`uint8`:case`uint32`:{if(t===`uint32`&&a.some(e=>e>2147483647))throw Error(`Can not convert uint32 data to int32 - value out of range.`);let e=Int32Array.from(a,Number);return new Uint8Array(e.buffer)}default:throw Error(`Unsupported data conversion from ${t} to 'int32'`)}},Qt=(e,t)=>{if(t===`int32`)return e;if(e.byteLength%4!=0)throw Error(`Invalid Uint8Array length - must be a multiple of 4 (int32).`);let n=e.byteLength/4,r=new Int32Array(e.buffer,e.byteOffset,n);switch(t){case`int64`:{let e=BigInt64Array.from(r,BigInt);return new Uint8Array(e.buffer)}case`uint64`:{if(r.some(e=>e<0))throw Error(`Can not convert int32 data to uin64 - negative value found.`);let e=BigUint64Array.from(r,BigInt);return new Uint8Array(e.buffer)}case`int8`:{if(r.some(e=>e<-128||e>127))throw Error(`Can not convert int32 data to int8 - value out of range.`);let e=Int8Array.from(r,Number);return new Uint8Array(e.buffer)}case`uint8`:if(r.some(e=>e<0||e>255))throw Error(`Can not convert int32 data to uint8 - value out of range.`);return Uint8Array.from(r,Number);case`uint32`:{if(r.some(e=>e<0))throw Error(`Can not convert int32 data to uint32 - negative value found.`);let e=Uint32Array.from(r,Number);return new Uint8Array(e.buffer)}default:throw Error(`Unsupported data conversion from 'int32' to ${t}`)}},$t=1,en=()=>$t++,tn=/* @__PURE__ */ new Map([[`int8`,`int32`],[`uint8`,`int32`],[`uint32`,`int32`],[`int64`,`int32`]]),nn=(e,t)=>{let n=Xt.get(e);if(!n)throw Error(`WebNN backend does not support data type: ${e}`);return t.length>0?Math.ceil(t.reduce((e,t)=>e*t)*n/8):0},rn=class{constructor(e){this.isDataConverted=!1;let{sessionId:t,context:n,tensor:r,dataType:i,shape:a,fallbackDataType:o}=e;this.sessionId=t,this.mlContext=n,this.mlTensor=r,this.dataType=i,this.tensorShape=a,this.fallbackDataType=o}get tensor(){return this.mlTensor}get type(){return this.dataType}get fallbackType(){return this.fallbackDataType}get shape(){return this.tensorShape}get byteLength(){return nn(this.dataType,this.tensorShape)}destroy(){Jt(`verbose`,()=>`[WebNN] TensorWrapper.destroy`),this.mlTensor.destroy()}write(e){this.mlContext.writeTensor(this.mlTensor,e)}async read(e){if(this.fallbackDataType){let t=await this.mlContext.readTensor(this.mlTensor),n=Qt(new Uint8Array(t),this.dataType);if(e){(e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)).set(n);return}return new Uint8Array(n).buffer}return e?this.mlContext.readTensor(this.mlTensor,e):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(e,t,n){return this.mlContext===e&&this.dataType===t&&this.tensorShape.length===n.length&&this.tensorShape.every((e,t)=>e===n[t])}setIsDataConverted(e){this.isDataConverted=e}},an=class{constructor(e,t){this.tensorManager=e,this.wrapper=t}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(e,t,n,r){let i=this.tensorManager.getMLContext(e),a=this.tensorManager.getMLOpSupportLimits(e),o;if(!a?.input.dataTypes.includes(t)){if(o=tn.get(t),!o||!a?.input.dataTypes.includes(o))throw Error(`WebNN backend does not support data type: ${t}`);Jt(`verbose`,()=>`[WebNN] TensorIdTracker.ensureTensor: fallback dataType from ${t} to ${o}`)}if(this.wrapper){if(this.wrapper.canReuseTensor(i,t,n))return this.wrapper.tensor;if(r){if(this.wrapper.byteLength!==nn(t,n))throw Error(`Unable to copy data to tensor with different size.`);this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let s=typeof MLTensorUsage>`u`?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(e,t,n,s,!0,!0,o),r&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(e){let t=e;if(this.wrapper){if(this.wrapper.fallbackType){if(this.wrapper.fallbackType===`int32`)t=Zt(e,this.wrapper.type),this.wrapper.setIsDataConverted(!0);else throw Error(`Unsupported fallback data type: ${this.wrapper.fallbackType}`)}if(e.byteLength===this.wrapper.byteLength){this.wrapper.write(t);return}Jt(`verbose`,()=>`Data size does not match tensor size. Releasing tensor.`),this.releaseTensor()}this.activeUpload?this.activeUpload.set(t):this.activeUpload=new Uint8Array(t)}async download(e){if(this.activeUpload){let t=this.wrapper?.isDataConverted?Qt(this.activeUpload,this.wrapper?.type):this.activeUpload;if(e){e instanceof ArrayBuffer?new Uint8Array(e).set(t):new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(t);return}return t.buffer}if(!this.wrapper)throw Error(`Tensor has not been created.`);return e?this.wrapper.read(e):this.wrapper.read()}},on=class{constructor(e){this.backend=e,this.tensorTrackersById=/* @__PURE__ */ new Map,this.freeTensors=[],this.externalTensors=/* @__PURE__ */ new Set}getMLContext(e){let t=this.backend.getMLContext(e);if(!t)throw Error(`MLContext not found for session.`);return t}getMLOpSupportLimits(e){return this.backend.getMLOpSupportLimits(e)}reserveTensorId(){let e=en();return this.tensorTrackersById.set(e,new an(this)),e}releaseTensorId(e){let t=this.tensorTrackersById.get(e);t&&(this.tensorTrackersById.delete(e),t.tensorWrapper&&this.releaseTensor(t.tensorWrapper))}async ensureTensor(e,t,n,r,i){Jt(`verbose`,()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${t}, dataType: ${n}, shape: ${r}, copyOld: ${i}}`);let a=this.tensorTrackersById.get(t);if(!a)throw Error(`Tensor not found.`);return a.ensureTensor(e,n,r,i)}upload(e,t){let n=this.tensorTrackersById.get(e);if(!n)throw Error(`Tensor not found.`);n.upload(t)}async download(e,t){Jt(`verbose`,()=>`[WebNN] TensorManager.download {tensorId: ${e}, dstBuffer: ${t?.byteLength}}`);let n=this.tensorTrackersById.get(e);if(!n)throw Error(`Tensor not found.`);return n.download(t)}releaseTensorsForSession(e){for(let t of this.freeTensors)t.sessionId===e&&t.destroy();this.freeTensors=this.freeTensors.filter(t=>t.sessionId!==e)}registerTensor(e,t,n,r){let i=this.getMLContext(e),a=en(),o=new rn({sessionId:e,context:i,tensor:t,dataType:n,shape:r});return this.tensorTrackersById.set(a,new an(this,o)),this.externalTensors.add(o),a}async getCachedTensor(e,t,n,r,i,a,o){let s=this.getMLContext(e);for(let[r,i]of this.freeTensors.entries())if(i.canReuseTensor(s,t,n)){Jt(`verbose`,()=>`[WebNN] Reusing tensor {dataType: ${t}, ${o?`fallbackDataType: ${o},`:``} shape: ${n}`);let i=this.freeTensors.splice(r,1)[0];return i.sessionId=e,i}Jt(`verbose`,()=>`[WebNN] MLContext.createTensor {dataType: ${t}, ${o?`fallbackDataType: ${o},`:``} shape: ${n}}`);let c=await s.createTensor({dataType:o??t,shape:n,dimensions:n,usage:r,writable:i,readable:a});return new rn({sessionId:e,context:s,tensor:c,dataType:t,shape:n,fallbackDataType:o})}releaseTensor(e){this.externalTensors.has(e)&&this.externalTensors.delete(e),this.freeTensors.push(e)}},sn=(...e)=>new on(...e)}),ln={};u(ln,{WebNNBackend:()=>fn});var un,dn,fn,pn=l(()=>{Lt(),ht(),Vt(),cn(),Yt(),un=/* @__PURE__ */ new Map([[1,`float32`],[10,`float16`],[6,`int32`],[12,`uint32`],[7,`int64`],[13,`uint64`],[22,`int4`],[21,`uint4`],[3,`int8`],[2,`uint8`],[9,`uint8`]]),dn=(e,t)=>{if(e===t)return!0;if(e===void 0||t===void 0)return!1;let n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((n,i)=>n===r[i]&&e[n]===t[n])},fn=class{constructor(e){this.tensorManager=sn(this),this.mlContextBySessionId=/* @__PURE__ */ new Map,this.sessionIdsByMLContext=/* @__PURE__ */ new Map,this.mlContextCache=[],this.sessionGraphInputs=/* @__PURE__ */ new Map,this.sessionGraphOutputs=/* @__PURE__ */ new Map,this.temporaryGraphInputs=[],this.temporaryGraphOutputs=[],this.temporarySessionTensorIds=/* @__PURE__ */ new Map,this.mlOpSupportLimitsBySessionId=/* @__PURE__ */ new Map,Kt(e.logLevel,!!e.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw Error(`No active session`);return this.activeSessionId}onRunStart(e){Jt(`verbose`,()=>`[WebNN] onRunStart {sessionId: ${e}}`),this.activeSessionId=e}onRunEnd(e){Jt(`verbose`,()=>`[WebNN] onRunEnd {sessionId: ${e}}`);let t=this.temporarySessionTensorIds.get(e);if(t){for(let e of t)Jt(`verbose`,()=>`[WebNN] releasing temporary tensor {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e);this.temporarySessionTensorIds.delete(e),this.activeSessionId=void 0}}async createMLContext(e){if(e instanceof GPUDevice){let t=this.mlContextCache.findIndex(t=>t.gpuDevice===e);if(t!==-1)return this.mlContextCache[t].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({gpuDevice:e,mlContext:t}),t}}if(e===void 0){let e=this.mlContextCache.findIndex(e=>e.options===void 0&&e.gpuDevice===void 0);if(e!==-1)return this.mlContextCache[e].mlContext;{let e=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:e}),e}}let t=this.mlContextCache.findIndex(t=>dn(t.options,e));if(t!==-1)return this.mlContextCache[t].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({options:e,mlContext:t}),t}}registerMLContext(e,t){this.mlContextBySessionId.set(e,t);let n=this.sessionIdsByMLContext.get(t);n||(n=/* @__PURE__ */ new Set,this.sessionIdsByMLContext.set(t,n)),n.add(e),this.mlOpSupportLimitsBySessionId.has(e)||this.mlOpSupportLimitsBySessionId.set(e,t.opSupportLimits()),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(e,this.temporaryGraphInputs),this.temporaryGraphInputs=[]),this.temporaryGraphOutputs.length>0&&(this.sessionGraphOutputs.set(e,this.temporaryGraphOutputs),this.temporaryGraphOutputs=[])}onReleaseSession(e){this.sessionGraphInputs.delete(e),this.sessionGraphOutputs.delete(e);let t=this.mlContextBySessionId.get(e);if(!t)return;this.tensorManager.releaseTensorsForSession(e),this.mlContextBySessionId.delete(e),this.mlOpSupportLimitsBySessionId.delete(e);let n=this.sessionIdsByMLContext.get(t);if(n.delete(e),n.size===0){this.sessionIdsByMLContext.delete(t);let e=this.mlContextCache.findIndex(e=>e.mlContext===t);e!==-1&&this.mlContextCache.splice(e,1)}}getMLContext(e){return this.mlContextBySessionId.get(e)}getMLOpSupportLimits(e){return this.mlOpSupportLimitsBySessionId.get(e)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(e){Jt(`verbose`,()=>`[WebNN] releaseTensorId {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e)}async ensureTensor(e,t,n,r,i){let a=un.get(n);if(!a)throw Error(`Unsupported ONNX data type: ${n}`);return this.tensorManager.ensureTensor(e??this.currentSessionId,t,a,r,i)}async createTemporaryTensor(e,t,n){Jt(`verbose`,()=>`[WebNN] createTemporaryTensor {onnxDataType: ${t}, shape: ${n}}`);let r=un.get(t);if(!r)throw Error(`Unsupported ONNX data type: ${t}`);let i=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(e,i,r,n,!1);let a=this.temporarySessionTensorIds.get(e);return a?a.push(i):this.temporarySessionTensorIds.set(e,[i]),i}uploadTensor(e,t){if(!E().shouldTransferToMLTensor)throw Error(`Trying to upload to a MLTensor while shouldTransferToMLTensor is false`);Jt(`verbose`,()=>`[WebNN] uploadTensor {tensorId: ${e}, data: ${t.byteLength}}`),this.tensorManager.upload(e,t)}async downloadTensor(e,t){return this.tensorManager.download(e,t)}createMLTensorDownloader(e,t){return async()=>{let n=await this.tensorManager.download(e);return Bt(n,t)}}registerMLTensor(e,t,n,r){let i=un.get(n);if(!i)throw Error(`Unsupported ONNX data type: ${n}`);let a=this.tensorManager.registerTensor(e,t,i,r);return Jt(`verbose`,()=>`[WebNN] registerMLTensor {tensor: ${t}, dataType: ${i}, dimensions: ${r}} -> {tensorId: ${a}}`),a}registerGraphInput(e){this.temporaryGraphInputs.push(e)}registerGraphOutput(e){this.temporaryGraphOutputs.push(e)}isGraphInput(e,t){let n=this.sessionGraphInputs.get(e);return n?n.includes(t):!1}isGraphOutput(e,t){let n=this.sessionGraphOutputs.get(e);return n?n.includes(t):!1}isGraphInputOutputTypeSupported(e,t,n=!0){let r=un.get(kt(t)),i=this.mlOpSupportLimitsBySessionId.get(e);return typeof r>`u`?!1:n?!!i?.input.dataTypes.includes(r):!!i?.output.dataTypes.includes(r)}flush(){}}}),mn,hn,gn,_n,vn,yn,bn,xn,Sn,Cn,wn,Tn,En,Dn=l(()=>{ze(),bt(),Ot(),Lt(),ht(),vt(),zt(),mn=(e,t)=>{E()._OrtInit(e,t)!==0&&D(`Can't initialize onnxruntime.`)},hn=async e=>{mn(e.wasm.numThreads,Nt(e.logLevel))},gn=async(e,t)=>{E().asyncInit?.();let n=e.webgpu.adapter;if(t===`webgpu`){if(typeof navigator>`u`||!navigator.gpu)throw Error(`WebGPU is not supported in current environment`);if(n){if(typeof n.limits!=`object`||typeof n.features!=`object`||typeof n.requestDevice!=`function`)throw Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let t=e.webgpu.powerPreference;if(t!==void 0&&t!==`low-power`&&t!==`high-performance`)throw Error(`Invalid powerPreference setting: "${t}"`);let r=e.webgpu.forceFallbackAdapter;if(r!==void 0&&typeof r!=`boolean`)throw Error(`Invalid forceFallbackAdapter setting: "${r}"`);if(n=await navigator.gpu.requestAdapter({powerPreference:t,forceFallbackAdapter:r}),!n)throw Error(`Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.`)}}if(t===`webnn`&&(typeof navigator>`u`||!navigator.ml))throw Error(`WebNN is not supported in current environment`);if(t===`webgpu`&&E().webgpuInit(t=>{e.webgpu.device=t}),t===`webnn`){let t=new(pn(),f(ln)).WebNNBackend(e);E().webnnInit([t,()=>t.reserveTensorId(),e=>t.releaseTensorId(e),async(e,n,r,i,a)=>t.ensureTensor(e,n,r,i,a),(e,n)=>{t.uploadTensor(e,n)},async(e,n)=>t.downloadTensor(e,n),(e,n)=>t.registerMLContext(e,n),!!e.trace])}},_n=/* @__PURE__ */ new Map,vn=e=>{let t=E(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetInputOutputCount(e,r,r+n)!==0&&D(`Can't get session input/output count.`);let i=n===4?`i32`:`i64`;return[Number(t.getValue(r,i)),Number(t.getValue(r+n,i))]}finally{t.stackRestore(n)}},yn=(e,t)=>{let n=E(),r=n.stackSave(),i=0;try{let r=n.PTR_SIZE,a=n.stackAlloc(2*r);n._OrtGetInputOutputMetadata(e,t,a,a+r)!==0&&D(`Can't get session input/output metadata.`);let o=Number(n.getValue(a,`*`));i=Number(n.getValue(a+r,`*`));let s=n.HEAP32[i/4];if(s===0)return[o,0];let c=n.HEAPU32[i/4+1],l=[];for(let e=0;e{let t=E(),n=t._malloc(e.byteLength);if(n===0)throw Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},xn=async(e,t)=>{let n,r,i=E();Array.isArray(e)?[n,r]=e:e.buffer===i.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=bn(e);let a=0,o=0,s=0,c=[],l=[],u=[];try{if([o,c]=await Dt(t),t?.externalData&&i.mountExternalData){let e=[];for(let n of t.externalData){let t=typeof n==`string`?n:n.path,r=typeof n==`string`?n:n.data;e.push(Rt(r).then(e=>{i.mountExternalData(t,e)}))}await Promise.all(e)}for(let e of t?.executionProviders??[])if((typeof e==`string`?e:e.name)===`webnn`){if(i.shouldTransferToMLTensor=!1,typeof e!=`string`){let t=e,n=t?.context,r=t?.gpuDevice,a=t?.deviceType,o=t?.powerPreference;i.currentContext=n||(r?await i.webnnCreateMLContext(r):await i.webnnCreateMLContext({deviceType:a,powerPreference:o}))}else i.currentContext=await i.webnnCreateMLContext();break}a=await i._OrtCreateSession(n,r,o),i.webgpuOnCreateSession?.(a),a===0&&D(`Can't create a session.`),i.jsepOnCreateSession?.(),i.currentContext&&(i.webnnRegisterMLContext(a,i.currentContext),i.currentContext=void 0,i.shouldTransferToMLTensor=!0);let[e,d]=vn(a),f=!!t?.enableGraphCapture,p=[],m=[],h=[],g=[],_=[];for(let t=0;te===`gpu-buffer`||e===`ml-tensor`||e===`ml-tensor-cpu-output`)&&(s=i._OrtCreateBinding(a),s===0&&D(`Can't create IO binding.`),v={handle:s,outputPreferredLocations:_,outputPreferredLocationsEncoded:_.map(e=>e===`ml-tensor-cpu-output`?`ml-tensor`:e).map(e=>It(e))}),_n.set(a,[a,l,u,v,f,!1]),[a,p,m,h,g]}catch(e){throw l.forEach(e=>i._OrtFree(e)),u.forEach(e=>i._OrtFree(e)),s!==0&&i._OrtReleaseBinding(s)!==0&&D(`Can't release IO binding.`),a!==0&&i._OrtReleaseSession(a)!==0&&D(`Can't release session.`),e}finally{i._free(n),o!==0&&i._OrtReleaseSessionOptions(o)!==0&&D(`Can't release session options.`),c.forEach(e=>i._free(e)),i.unmountExternalData?.()}},Sn=e=>{let t=E(),n=_n.get(e);if(!n)throw Error(`cannot release session. invalid session id: ${e}`);let[r,i,a,o,s]=n;o&&(s&&t._OrtClearBoundOutputs(o.handle)!==0&&D(`Can't clear bound outputs.`),t._OrtReleaseBinding(o.handle)!==0&&D(`Can't release IO binding.`)),t.jsepOnReleaseSession?.(e),t.webnnOnReleaseSession?.(e),t.webgpuOnReleaseSession?.(e),i.forEach(e=>t._OrtFree(e)),a.forEach(e=>t._OrtFree(e)),t._OrtReleaseSession(r)!==0&&D(`Can't release session.`),_n.delete(e)},Cn=async(e,t,n,r,i,a,o=!1)=>{if(!e){t.push(0);return}let s=E(),c=s.PTR_SIZE,l=e[0],u=e[1],d=e[3],f=d,p,m;if(l===`string`&&(d===`gpu-buffer`||d===`ml-tensor`))throw Error(`String tensor is not supported on GPU.`);if(o&&d!==`gpu-buffer`)throw Error(`External buffer must be provided for input/output index ${a} when enableGraphCapture is true.`);if(d===`gpu-buffer`){let t=e[2].gpuBuffer;m=jt(kt(l),u);{let e=s.webgpuRegisterBuffer;if(!e)throw Error(`Tensor location "gpu-buffer" is not supported without using WebGPU.`);p=e(t,r)}}else if(d===`ml-tensor`){let t=e[2].mlTensor;m=jt(kt(l),u);let n=s.webnnRegisterMLTensor;if(!n)throw Error(`Tensor location "ml-tensor" is not supported without using WebNN.`);p=n(r,t,kt(l),u)}else{let t=e[2];if(Array.isArray(t)){m=c*t.length,p=s._malloc(m),n.push(p);for(let e=0;es.setValue(g+t*c,e,c===4?`i32`:`i64`));let e=s._OrtCreateTensor(kt(l),p,m,g,u.length,It(f));e===0&&D(`Can't create tensor for input/output. session=${r}, index=${a}.`),t.push(e)}finally{s.stackRestore(h)}},wn=async(e,t,n,r,i,a)=>{let o=E(),s=o.PTR_SIZE,c=_n.get(e);if(!c)throw Error(`cannot run inference. invalid session id: ${e}`);let l=c[0],u=c[1],d=c[2],f=c[3],p=c[4],m=c[5],h=t.length,g=r.length,_=0,v=[],y=[],b=[],x=[],S=[],C=o.stackSave(),ee=o.stackAlloc(h*s),w=o.stackAlloc(h*s),te=o.stackAlloc(g*s),ne=o.stackAlloc(g*s);try{[_,v]=yt(a),De(`wasm prepareInputOutputTensor`);for(let r=0;re*t,1);u=At(a);let _=f?.outputPreferredLocations[r[t]];if(u===`string`){if(_===`gpu-buffer`||_===`ml-tensor`)throw Error(`String tensor is not supported on GPU.`);let e=[];for(let t=0;t0){let t=o.webgpuGetBuffer;if(!t)throw Error(`preferredLocation "gpu-buffer" is not supported without using WebGPU.`);let r=t(d),i=jt(a,g);if(i===void 0||!Pt(u))throw Error(`Unsupported data type: ${u}`);l=!0;{o.webgpuRegisterBuffer(r,e,d);let t=o.webgpuCreateDownloader(r,i,e);C.push([u,h,{gpuBuffer:r,download:async()=>{let e=await t();return new(Mt(u))(e)},dispose:()=>{o._OrtReleaseTensor(n)!==0&&D(`Can't release tensor.`)}},`gpu-buffer`])}}else if(_===`ml-tensor`&&g>0){let t=o.webnnEnsureTensor,r=o.webnnIsGraphInputOutputTypeSupported;if(!t||!r)throw Error(`preferredLocation "ml-tensor" is not supported without using WebNN.`);if(jt(a,g)===void 0||!Ft(u))throw Error(`Unsupported data type: ${u}`);if(!r(e,u,!1))throw Error(`preferredLocation "ml-tensor" for ${u} output is not supported by current WebNN Context.`);let i=await t(e,d,a,h,!1);l=!0,C.push([u,h,{mlTensor:i,download:o.webnnCreateMLTensorDownloader(d,u),dispose:()=>{o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n)}},`ml-tensor`])}else if(_===`ml-tensor-cpu-output`&&g>0){let e=o.webnnCreateMLTensorDownloader(d,u)(),t=C.length;l=!0,re.push((async()=>{let r=[t,await e];return o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n),r})()),C.push([u,h,[],`cpu`])}else{let e=new(Mt(u))(g);new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(o.HEAPU8.subarray(d,d+e.byteLength)),C.push([u,h,e,`cpu`])}}finally{o.stackRestore(a),u===`string`&&d&&o._free(d),l||o._OrtReleaseTensor(n)}}f&&!p&&(o._OrtClearBoundOutputs(f.handle)!==0&&D(`Can't clear bound outputs.`),_n.set(e,[l,u,d,f,p,!1]));for(let[e,t]of await Promise.all(re))C[e][2]=t;return Oe(`wasm ProcessOutputTensor`),C}finally{o.webnnOnRunEnd?.(l),o.stackRestore(C),n.forEach(e=>{e&&e[3]===`gpu-buffer`&&o.webgpuUnregisterBuffer(e[2].gpuBuffer)}),i.forEach(e=>{e&&e[3]===`gpu-buffer`&&o.webgpuUnregisterBuffer(e[2].gpuBuffer)}),y.forEach(e=>o._OrtReleaseTensor(e)),b.forEach(e=>o._OrtReleaseTensor(e)),x.forEach(e=>o._free(e)),_!==0&&o._OrtReleaseRunOptions(_),v.forEach(e=>o._free(e))}},Tn=e=>{let t=E(),n=_n.get(e);if(!n)throw Error(`invalid session id`);let r=n[0],i=t._OrtEndProfiling(r);i===0&&D(`Can't get an profile file name.`),t._OrtFree(i)},En=e=>{let t=[];for(let n of e){let e=n[2];!Array.isArray(e)&&`buffer`in e&&t.push(e.buffer)}return t}}),On,kn,An,jn,Mn,Nn,Pn,Fn,In,Ln,Rn,zn,Bn,Vn,Hn,Un,Wn,Gn,Kn=l(()=>{ze(),Dn(),ht(),ot(),On=()=>!!w.wasm.proxy&&typeof document<`u`,An=!1,jn=!1,Mn=!1,Fn=/* @__PURE__ */ new Map,In=(e,t)=>{let n=Fn.get(e);n?n.push(t):Fn.set(e,[t])},Ln=()=>{if(An||!jn||Mn||!kn)throw Error(`worker not ready`)},Rn=e=>{switch(e.data.type){case`init-wasm`:An=!1,e.data.err?(Mn=!0,Pn[1](e.data.err)):(jn=!0,Pn[0]()),Nn&&=(URL.revokeObjectURL(Nn),void 0);break;case`init-ep`:case`copy-from`:case`create`:case`release`:case`run`:case`end-profiling`:{let t=Fn.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}}},zn=async()=>{if(!jn){if(An)throw Error(`multiple calls to 'initWasm()' detected.`);if(Mn)throw Error(`previous call to 'initWasm()' failed.`);if(An=!0,On())return new Promise((e,t)=>{kn?.terminate(),rt().then(([n,r])=>{try{kn=r,kn.onerror=e=>t(e),kn.onmessage=Rn,Pn=[e,t];let i={type:`init-wasm`,in:w};if(!i.in.wasm.wasmPaths&&n){let e=Xe();e&&(i.in.wasm.wasmPaths=e)}kn.postMessage(i),Nn=n}catch(e){t(e)}},t)});try{await mt(w.wasm),await hn(w),jn=!0}catch(e){throw Mn=!0,e}finally{An=!1}}},Bn=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`init-ep`,[t,n]);let r={type:`init-ep`,in:{epName:e,env:w}};kn.postMessage(r)});await gn(w,e)},Vn=async e=>On()?(Ln(),new Promise((t,n)=>{In(`copy-from`,[t,n]);let r={type:`copy-from`,in:{buffer:e}};kn.postMessage(r,[e.buffer])})):bn(e),Hn=async(e,t)=>{if(On()){if(t?.preferredOutputLocation)throw Error(`session option "preferredOutputLocation" is not supported for proxy.`);return Ln(),new Promise((n,r)=>{In(`create`,[n,r]);let i={type:`create`,in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),kn.postMessage(i,a)})}return xn(e,t)},Un=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`release`,[t,n]);let r={type:`release`,in:e};kn.postMessage(r)});Sn(e)},Wn=async(e,t,n,r,i,a)=>{if(On()){if(n.some(e=>e[3]!==`cpu`))throw Error(`input tensor on GPU is not supported for proxy.`);if(i.some(e=>e))throw Error(`pre-allocated output tensor is not supported for proxy.`);return Ln(),new Promise((i,o)=>{In(`run`,[i,o]);let s=n,c={type:`run`,in:{sessionId:e,inputIndices:t,inputs:s,outputIndices:r,options:a}};kn.postMessage(c,En(s))})}return wn(e,t,n,r,i,a)},Gn=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`end-profiling`,[t,n]);let r={type:`end-profiling`,in:e};kn.postMessage(r)});Tn(e)}}),qn,Jn,Yn,Xn=l(()=>{ze(),Kn(),Lt(),Be(),zt(),qn=(e,t)=>{switch(e.location){case`cpu`:return[e.type,e.dims,e.data,`cpu`];case`gpu-buffer`:return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},`gpu-buffer`];case`ml-tensor`:return[e.type,e.dims,{mlTensor:e.mlTensor},`ml-tensor`];default:throw Error(`invalid data location: ${e.location} for ${t()}`)}},Jn=e=>{switch(e[3]){case`cpu`:return new xe(e[0],e[2],e[1]);case`gpu-buffer`:{let t=e[0];if(!Pt(t))throw Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:i}=e[2];return xe.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:i})}case`ml-tensor`:{let t=e[0];if(!Ft(t))throw Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:i}=e[2];return xe.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:i})}default:throw Error(`invalid data location: ${e[3]}`)}},Yn=class{async fetchModelAndCopyToWasmMemory(e){return Vn(await Rt(e))}async loadModel(e,t){Te();let n;n=typeof e==`string`?await this.fetchModelAndCopyToWasmMemory(e):e,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await Hn(n,t),Ee()}async dispose(){return Un(this.sessionId)}async run(e,t,n){Te();let r=[],i=[];Object.entries(e).forEach(e=>{let t=e[0],n=e[1],a=this.inputNames.indexOf(t);if(a===-1)throw Error(`invalid input '${t}'`);r.push(n),i.push(a)});let a=[],o=[];Object.entries(t).forEach(e=>{let t=e[0],n=e[1],r=this.outputNames.indexOf(t);if(r===-1)throw Error(`invalid output '${t}'`);a.push(n),o.push(r)});let s=r.map((e,t)=>qn(e,()=>`input "${this.inputNames[i[t]]}"`)),c=a.map((e,t)=>e?qn(e,()=>`output "${this.outputNames[o[t]]}"`):null),l=await Wn(this.sessionId,i,s,o,c,n),u={};for(let e=0;e$n,initializeFlags:()=>Qn,wasmBackend:()=>er});var Qn,$n,er,tr=l(()=>{ze(),Kn(),Xn(),Qn=()=>{(typeof w.wasm.initTimeout!=`number`||w.wasm.initTimeout<0)&&(w.wasm.initTimeout=0);let e=w.wasm.simd;if(typeof e!=`boolean`&&e!==void 0&&e!==`fixed`&&e!==`relaxed`&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${e}". Reset it to \`false\` and ignore SIMD feature checking.`),w.wasm.simd=!1),typeof w.wasm.proxy!=`boolean`&&(w.wasm.proxy=!1),typeof w.wasm.trace!=`boolean`&&(w.wasm.trace=!1),typeof w.wasm.numThreads!=`number`||!Number.isInteger(w.wasm.numThreads)||w.wasm.numThreads<=0){if(typeof self<`u`&&!self.crossOriginIsolated)w.wasm.numThreads=1;else{let e=typeof navigator>`u`?c(`node:os`).cpus().length:navigator.hardwareConcurrency;w.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}}},$n=class{async init(e){Qn(),await zn(),await Bn(e)}async createInferenceSessionHandler(e,t){let n=new Yn;return await n.loadModel(e,t),n}},er=new $n});ze(),ze(),ze();var nr=`1.31.0-dev.20260914-8d85527a0`,rr=Re;{let e=(tr(),f(Zn)).wasmBackend;h(`webgpu`,e,5),h(`webnn`,e,5),h(`cpu`,e,10),h(`wasm`,e,10)}Object.defineProperty(w.versions,"web",{value:nr,enumerable:!0});let ir=`warning`;Object.defineProperty({wasm:{},webgl:{},webgpu:{},versions:{common:`1.30.0`},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);ir=e}},get logLevel(){return ir}},"logLevel",{enumerable:!0});const ar=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t===void 0||t.format===void 0?`RGB`:t.format,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat===void 0||t.tensorFormat===void 0?`RGB`:t.tensorFormat,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,sr(o,s)}throw Error(`Can not access image data`)}else if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(sr(e.data,s))}});else throw Error(`Input data provided is not supported - aborted tensor creation`);if(o!==void 0)return sr(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},lr=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new yr({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ur=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yr({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},dr=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yr({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},fr=(e,t,n)=>new yr({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]}),pr=/* @__PURE__ */ new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),mr=/* @__PURE__ */ new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]);let hr=!1;const gr=()=>{if(!hr){hr=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=n!==void 0&&n.from;e&&(pr.set(`int64`,BigInt64Array),mr.set(BigInt64Array,`int64`)),t&&(pr.set(`uint64`,BigUint64Array),mr.set(BigUint64Array,`uint64`)),r?(pr.set(`float16`,n),mr.set(n,`float16`)):pr.set(`float16`,Uint16Array)}},_r=e=>{let t=1;for(let n=0;n{switch(e.location){case`cpu`:return new yr(e.type,e.data,t);case`cpu-pinned`:return new yr({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new yr({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new yr({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new yr({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}};var yr=class{constructor(e,t,n){gr();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=pr.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`){if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=pr.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray){if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`)}else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=mr.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=_r(i);if(this.cpuData&&a!==this.cpuData.length&&(r!==`uint4`&&r!==`int4`||Math.ceil(a/2)!==this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return cr(e,t)}static fromTexture(e,t){return lr(e,t)}static fromGpuBuffer(e,t){return ur(e,t)}static fromMLTensor(e,t){return dr(e,t)}static fromPinnedBuffer(e,t,n){return fr(e,t,n)}toDataURL(e){return ar(this,e)}toImageData(e){return or(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return vr(this,e)}};const br=yr;var xr=Object.defineProperty,Sr=(e,t)=>{for(var n in t)xr(e,n,{get:t[n],enumerable:!0})},Cr={},wr={},Tr={},Er=`4.3.0`,Dr=typeof self<`u`,Or=!Qr(Cr),kr=!Qr(wr),Ar=Dr&&`caches`in self,jr=globalThis.Deno!==void 0;globalThis.Bun;var Mr=jr&&Ar&&!Or,Nr=typeof process<`u`,Pr=Nr&&process?.release?.name===`node`&&!Mr,Fr=typeof window<`u`&&window.document!==void 0,Ir=Dr&&[`DedicatedWorkerGlobalScope`,`ServiceWorkerGlobalScope`,`SharedWorkerGlobalScope`].includes(self.constructor?.name),Lr=Fr||Ir||Mr,Rr=Pr||typeof navigator<`u`&&`gpu`in navigator,zr=typeof navigator<`u`&&`ml`in navigator,Br=typeof crypto<`u`&&typeof crypto.getRandomValues==`function`,Vr=typeof chrome<`u`&&chrome.runtime!==void 0&&typeof chrome.runtime.id==`string`,Hr=typeof ServiceWorkerGlobalScope<`u`&&Dr&&self instanceof ServiceWorkerGlobalScope,Ur=(()=>{if(typeof navigator>`u`)return!1;let e=navigator.userAgent;if(!((navigator.vendor||``).indexOf(`Apple`)>-1&&!e.match(/CriOS|FxiOS|EdgiOS|OPiOS|mercury|brave/i)&&!e.includes(`Chrome`)&&!e.includes(`Android`)))return!1;let t=e.match(/Version\/(\d+)/);return t?parseInt(t[1],10)<26:!1})(),O=Object.freeze({IS_BROWSER_ENV:Fr,IS_WEBWORKER_ENV:Ir,IS_WEB_ENV:Lr,IS_SERVICE_WORKER_ENV:Hr,IS_DENO_WEB_RUNTIME:Mr,IS_WEB_CACHE_AVAILABLE:Ar,IS_WEBGPU_AVAILABLE:Rr,IS_WEBNN_AVAILABLE:zr,IS_SAFARI_BELOW_26:Ur,IS_PROCESS_AVAILABLE:Nr,IS_NODE_ENV:Pr,IS_FS_AVAILABLE:Or,IS_PATH_AVAILABLE:kr,IS_CRYPTO_AVAILABLE:Br,IS_CHROME_AVAILABLE:Vr}),Wr=Or&&kr,Gr=`./`;if(Wr){let e=import.meta.url;e?Gr=wr.dirname(wr.dirname(Tr.fileURLToPath(e))):typeof __dirname<`u`&&(Gr=wr.dirname(__dirname))}var Kr=Wr?wr.join(Gr,`/.cache/`):null,qr=`/models/`,Jr=Wr?wr.join(Gr,qr):qr,Yr=typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):void 0,Xr=Object.freeze({DEBUG:10,INFO:20,WARNING:30,ERROR:40,NONE:50}),Zr=Xr.WARNING,k={version:Er,backends:{onnx:{}},get logLevel(){return Zr},set logLevel(e){Zr=e,k.backends.onnx?.setLogLevel?.(e)},allowRemoteModels:!0,remoteHost:`https://huggingface.co/`,remotePathTemplate:`{model}/resolve/{revision}/`,allowLocalModels:!(Fr||Ir||Mr),localModelPath:Jr,useFS:Or,useBrowserCache:Ar,useFSCache:Or,cacheDir:Kr,useCustomCache:!1,customCache:null,useWasmCache:Ar||Or,cacheKey:`transformers-cache`,experimental_useCrossOriginStorage:!1,fetch:Yr};function Qr(e){return Object.keys(e).length===0}var $r=class{constructor(){let e=function(...t){return e._call(...t)};return Object.setPrototypeOf(e,new.target.prototype)}_call(...e){throw Error(`Must implement _call method in subclass`)}};function ei(e,t){e&&e(t)}var ti=class extends $r{constructor(e,t){super(),this.callback=e,this.files_loading=t,this.loads=/* @__PURE__ */ new Map}_call(e){if(e.status===`progress`){this.files_loading[e.file]={loaded:e.loaded,total:e.total};let t=Object.values(this.files_loading).reduce((e,t)=>e+t.loaded,0),n=Object.values(this.files_loading).reduce((e,t)=>e+t.total,0),r=n>0?t/n*100:0;this.callback({status:`progress_total`,name:e.name,progress:r,loaded:t,total:n,files:structuredClone(this.files_loading)})}this.callback(e)}};function ni(e){return Number.isInteger(e)||typeof e==`bigint`}function ri(e){return e==null||e===-1}function ii(e){let t=[],n=e;for(;Array.isArray(n);)t.push(n.length),n=n[0];return t}function ai(...e){return Array.prototype.concat.apply([],e)}function oi(...e){return e.reduce((e,t)=>e.flatMap(e=>t.map(t=>[e,t])))}function si(e,t){return Math.abs((e+t)%(2*t)-t)}function ci(e,t){return Object.assign({},...t.map(t=>{if(e[t]!==void 0)return{[t]:e[t]}}))}function li(e,t){let n=0;for(let r of e)r===t&&++n;return n}var A={error(...e){k.logLevel<=Xr.ERROR&&console.error(...e)},warn(...e){k.logLevel<=Xr.WARNING&&console.warn(...e)},info(...e){k.logLevel<=Xr.INFO&&console.log(...e)},debug(...e){k.logLevel<=Xr.DEBUG&&console.log(...e)},log(...e){this.info(...e)}},ui=class{constructor(e){this.trie=this._build_trie(e)}_build_trie(e){let t=/* @__PURE__ */ Object.create(null);for(let n of e){let e=t;for(let t=0;tr&&t.push(e.slice(r,i)),t.push(o),i+=o.length,r=i):++i}return r{try{return new RegExp(e,t)}catch(n){if(!(n instanceof SyntaxError))throw n;let r=/* @__PURE__ */ new Map,i=e.replace(/(\\[pP])\{([^}=]+)\}/g,(t,n,i,a)=>{let o=0;for(let t=a-1;t>=0&&e[t]===`\\`;--t)++o;if(o%2==1)return t;let s=r.get(i);if(s===void 0){try{RegExp(`\\p{${i}}`,`u`),s=i}catch{s=`Script=${i}`}r.set(i,s)}return`${n}{${s}}`});if(i===e)throw n;try{return new RegExp(i,t)}catch{throw n}}},pi=e=>e.replace(/ \./g,`.`).replace(/ \?/g,`?`).replace(/ \!/g,`!`).replace(/ ,/g,`,`).replace(/ \' /g,`'`).replace(/ n't/g,`n't`).replace(/ 'm/g,`'m`).replace(/ 's/g,`'s`).replace(/ 've/g,`'ve`).replace(/ 're/g,`'re`),mi=(e,t=!0)=>{if(e.Regex!==void 0)return fi(Qi(Bi(e.Regex)),`gu`);if(e.String!==void 0){let n=$i(e.String);return new RegExp(t?n:`(${n})`,`gu`)}return console.warn(`Unknown pattern type:`,e),null},hi=`\\p{Alphabetic}\\p{M}\\p{Nd}\\p{Pc}`,gi=`${hi}\\u00B2\\u00B3\\u00B9\\u00BC-\\u00BE`,_i=`[${gi}]`,vi=`[^${gi}]`,yi=`(?:(?|[:=!>])/,ji=/^\\([pPxu])\{([^}]*)\}/,Mi=/^\{(\d+(?:,\d*)?|,\d+)\}/,Ni=/^\[:(\^?)(\p{Alphabetic}+):\]/u,Pi=/^\[:\^:\]/,Fi=/^\[(?:\.[^\]]*\.\]|=[^\]]*=\])/,Ii=/^(?:\\x[0-9A-Fa-f]{2}|\\u[0-9A-Fa-f]{4}|\\c[A-Za-z])/,Li=e=>e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`,Ri=(e,t)=>String.fromCodePoint(e.codePointAt(t)),zi=e=>{if(!/^[0-9A-Fa-f]{1,8}$/.test(e))return null;let t=Number.parseInt(e,16);if(t>127)return null;let n=String.fromCharCode(t);return Li(n)?`[${n.toLowerCase()}${n.toUpperCase()}]`:null},Bi=e=>e.replace(/\[\^\(\\s\|\[([^\]]+)\]\)\]/g,`[^()|\\s$1]`),Vi=`[\\s\\S]`,Hi=256,Ui=()=>({fragment:``,alternatives:[],tail:null,contains_complex_set:!1}),Wi=e=>{throw SyntaxError(`Unsupported range with a set-valued character-class operand at index ${e}`)},Gi=(e,t,n,r=!0)=>{e.tail===`range`&&Wi(n),e.alternatives.push(t),e.tail=`set`,e.contains_complex_set=e.contains_complex_set||r},Ki=(e,t,n=!1,r=-1)=>{if(n&&e.tail===`range`&&Wi(r),e.tail===`range`){e.fragment+=t,e.tail=`complete_range`;return}e.fragment+=t,e.tail=n?`set`:`scalar`,e.contains_complex_set=e.contains_complex_set||n},qi=(e,t,n)=>{let r=ji.exec(e.slice(t));if(r){let[e,i,a]=r;return i===`P`&&a===`Word`?Gi(n,`[^${hi}]`,t):Ki(n,i===`x`?`\\u{${a}}`:i===`p`&&a===`Word`?hi:e,i===`p`||i===`P`,t),t+e.length}let i=Ii.exec(e.slice(t));if(i)return Ki(n,i[0]),t+i[0].length;if(t+1>=e.length)throw SyntaxError(`Unterminated escape in character class at index ${t}`);let a=Ri(e,t+1),o=t+1+a.length,s=Di.get(a);if(s!==void 0)return Ki(n,s),o;let c=Ei.get(a);if(c!==void 0)return Gi(n,c,t),o;let l=Ti.get(a),u,d=!1;return l===void 0?u=/[A-Za-z0-9]/.test(a)||ki.includes(a)||a===`-`?`\\${a}`:a:(u=l,d=a!==`a`&&a!==`e`),Ki(n,u,d,t),o},Ji=e=>e.length===1?e[0]:`(?:(?=(?:${e.join(`|`)}))${Vi})`,Yi=e=>Ji(e.fragment.length===0?e.alternatives:[`[${e.fragment}]`,...e.alternatives]),Xi=e=>{let t=fi(`^(?:${e})$`,`u`),n=``;for(let e=0;e<26;++e){let r=String.fromCharCode(65+e),i=String.fromCharCode(97+e),a=t.test(r);a!==t.test(i)&&(n+=a?i:r)}return n},Zi=(e,t,n,r=!0,i=1)=>{if(i>Hi)throw SyntaxError(`Maximum character-class nesting depth of ${Hi} exceeded at index ${t}`);let a=t+1,o=e[a]===`^`;o&&++a;let s=a,c=[Ui()],l=c[0],u=!1;for(;a1?SyntaxError(`Malformed character-class intersection with an empty operand at index ${a}`):SyntaxError(`Empty character class at index ${t}`);let e=c.some(e=>e.contains_complex_set);if(o&&c.length>1&&u)throw SyntaxError(`Unsupported outer-negated character-class intersection with a nested negated class containing a Unicode property, POSIX class, or shorthand at index ${t}`);let i=Yi(c[0]),d=i;if(c.length>1){let e=``;for(let t=1;t0&&(f?(p+=e,d=`[${p}]`):d=Ji([d,`[${e}]`]))}return{atom:o?f?`[^${p}]`:`(?:(?!${d})${Vi})`:d,end:a+1,negated:o,contains_complex_set:e,contains_nested_negated_complex_set:u}}if(e.startsWith(`&&`,a)){if(l.tail===null)throw SyntaxError(`Malformed character-class intersection with an empty operand at index ${a}`);l=Ui(),c.push(l),a+=2;continue}if(d===`[`){let t=e.slice(a);if(Pi.test(t))throw SyntaxError(`Malformed empty negated POSIX character class at index ${a}`);let r=Ni.exec(t);if(r){let[,e,t]=r,i=Oi.get(t);if(i===void 0)throw SyntaxError(`Unsupported POSIX character class "${t}" at index ${a}`);if(n&&e&&(t===`lower`||t===`upper`))throw SyntaxError(`Unsupported negated POSIX ${t} class inside an inline case-insensitive group`);e?Gi(l,`[^${i}]`,a):Ki(l,i,!0,a),a+=r[0].length;continue}if(Fi.test(t))throw SyntaxError(`Unsupported POSIX collating or equivalence bracket expression at index ${a}`);let o=Zi(e,a,n,!1,i+1);Gi(l,o.atom,a,o.contains_complex_set),u||=o.contains_nested_negated_complex_set||o.negated&&o.contains_complex_set,a=o.end;continue}if(d===`-`){let t=e[a+1]===`]`||e.startsWith(`&&`,a+1);l.tail===`set`&&!t&&Wi(a),l.tail===null||l.tail===`range`||l.tail===`complete_range`||t?Ki(l,`\\-`):(l.fragment+=`-`,l.tail=`range`),++a;continue}Ki(l,d===`^`&&l.fragment.length===0?`\\^`:d),a+=d.length}throw SyntaxError(`${c.length>1?`Unterminated character-class intersection`:`Unterminated character class`} at index ${t}`)},Qi=e=>{let t=``,n=-1,r=!1,i=!1,a=[],o=e=>{n=t.length,t+=e,r=!1};for(let s=0;s=e.length){t+=c;break}let a=Ri(e,s+1);if(s+=1+a.length,a===`G`)continue;let l=Di.get(a);if(l!==void 0){o(l);continue}let u=wi.get(a),d;d=u===void 0?/[A-Za-z0-9]/.test(a)||ki.includes(a)?`\\${a}`:a:u,o(d);continue}switch(c){case`[`:{let t=Zi(e,s,i);o(t.atom),s=t.end;continue}case`]`:o(`\\]`),++s;continue;case`.`:o(`[^\\n]`),++s;continue;case`^`:o(xi),++s;continue;case`$`:o(Si),++s;continue;case`(`:{let n=e.startsWith(`(?i:`,s),o=n?`(?i:`:Ai.exec(e.slice(s))?.[0]??`(`,c=n||o===`(?>`?`(?:`:o;a.push([t.length,i]),n&&(i=!0),t+=c,r=!1,s+=o.length;continue}case`)`:t+=c,[n,i]=a.pop()??[-1,!1],r=!1,++s;continue;case`|`:t+=c,n=-1,r=!1,++s;continue;case`{`:{let i=Mi.exec(e.slice(s));if(!i||n<0){o(`\\{`),++s;continue}let a=i[1].startsWith(`,`)?`0${i[1]}`:i[1];s+=i[0].length;let c=e[s];c===`+`||c===`*`?(t=`${t.slice(0,n)}(?:${t.slice(n)}{${a}})${c}`,++s):t+=`{${a}}`,r=!0;continue}case`}`:o(`\\}`),++s;continue;case`+`:if(r){++s;continue}t+=c,r=!0,++s;continue;case`*`:case`?`:t+=c,r=!0,++s;continue;default:o(i&&Li(c)?`[${c.toLowerCase()}${c.toUpperCase()}]`:c),s+=c.length;continue}}return t},$i=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),ea=(e,t,n)=>{let r=[],i=0;for(;ie>=19968&&e<=40959||e>=13312&&e<=19903||e>=131072&&e<=173791||e>=173824&&e<=177983||e>=177984&&e<=178207||e>=178208&&e<=183983||e>=63744&&e<=64255||e>=194560&&e<=195103,na=e=>Number.isInteger(e)||typeof e==`bigint`,ra=e=>{let t=0;for(let n of e)++t;return t},ia=e=>ca(e.toLowerCase()),aa=(...e)=>Array.prototype.concat.apply([],e),oa=e=>new Map(Object.entries(e)),sa=(e,t)=>{let n=[],r=0;for(let i of e.matchAll(t)){let t=i[0];r0&&n.push(t),r=i.index+t.length}return re.replace(/\p{M}/gu,``),la=(e,t,n=[])=>{if(!e||Array.isArray(e)||typeof e!=`object`)return`${t} must be a valid object`;for(let r of n)if(!(r in e))return`${t} must contain a "${r}" property`;return null},ua=e=>e.match(/\S+/g)||[],da=class{constructor(){let e=function(...t){return e._call(...t)};return Object.setPrototypeOf(e,new.target.prototype)}},fa=class extends da{constructor(e){super(),this.config=e}_call(e){return this.normalize(e)}},pa=class extends fa{tokenize_chinese_chars(e){let t=[];for(let n=0;ne.normalize(`NFKC`)).join(`~`):e.normalize(`NFKC`),e}},ha=class extends fa{constructor(e){super(e),this.normalizers=(e.normalizers??[]).map(e=>Da(e))}normalize(e){return this.normalizers.reduce((e,t)=>t?t.normalize(e):e,e)}},ga=class extends fa{constructor(e){super(e),this.pattern=mi(this.config.pattern??{})}normalize(e){return this.pattern===null?e:e.replaceAll(this.pattern,this.config.content??``)}},_a=class extends fa{constructor(){super(...arguments),this.form=`NFC`}normalize(e){return e=e.normalize(this.form),e}},va=class extends _a{constructor(){super(...arguments),this.form=`NFC`}},ya=class extends _a{constructor(){super(...arguments),this.form=`NFD`}},ba=class extends _a{constructor(){super(...arguments),this.form=`NFKC`}},xa=class extends _a{constructor(){super(...arguments),this.form=`NFKD`}},Sa=class extends fa{normalize(e){return this.config.strip_left&&this.config.strip_right?e=e.trim():(this.config.strip_left&&(e=e.trimStart()),this.config.strip_right&&(e=e.trimEnd())),e}},Ca=class extends fa{normalize(e){return ca(e)}},wa=class extends fa{normalize(e){return e.toLowerCase()}},Ta=class extends fa{normalize(e){return e=this.config.prepend+e,e}};function Ea(e){if(e===null)return null;switch(e.type){case`BertNormalizer`:return new pa(e);case`Precompiled`:return new ma(e);case`Sequence`:return new ha(e);case`Replace`:return new ga(e);case`NFC`:return new va(e);case`NFD`:return new ya(e);case`NFKC`:return new ba(e);case`NFKD`:return new xa(e);case`Strip`:return new Sa(e);case`StripAccents`:return new Ca(e);case`Lowercase`:return new wa(e);case`Prepend`:return new Ta(e);default:throw Error(`Unknown Normalizer type: ${e.type}`)}}var Da=Ea,Oa=class extends da{pre_tokenize(e,t){return(Array.isArray(e)?e.map(e=>this.pre_tokenize_text(e,t)):this.pre_tokenize_text(e,t)).flat()}_call(e,t){return this.pre_tokenize(e,t)}},ka=(()=>{let e=[...Array.from({length:94},(e,t)=>t+33),...Array.from({length:12},(e,t)=>t+161),...Array.from({length:82},(e,t)=>t+174)],t=e.slice(),n=0;for(let r=0;r<256;++r)e.includes(r)||(e.push(r),t.push(256+n),n+=1);let r=t.map(e=>String.fromCharCode(e));return Object.fromEntries(e.map((e,t)=>[e,r[t]]))})(),Aa=(e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[t,e])))(ka),ja=`\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E`,Ma=class extends Oa{constructor(e){super(),this.config=e,this.add_prefix_space=this.config.add_prefix_space??!1,this.trim_offsets=this.config.trim_offsets??!1,this.use_regex=this.config.use_regex??!0,this.pattern=/'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu,this.byte_encoder=ka,this.text_encoder=new TextEncoder}pre_tokenize_text(e,t){return this.add_prefix_space&&!e.startsWith(` `)&&(e=` `+e),(this.use_regex?e.match(this.pattern)||[]:[e]).map(e=>Array.from(this.text_encoder.encode(e),e=>this.byte_encoder[e]).join(``))}},Na=class extends Oa{pre_tokenize_text(e,t){return e.match(/\w+|[^\w\s]+/g)||[]}},Pa=class extends Oa{constructor(e){super(),this.replacement=e.replacement??`▁`,this.str_rep=e.str_rep||this.replacement,this.prepend_scheme=e.prepend_scheme??`always`}pre_tokenize_text(e,t){let{section_index:n=void 0}=t??{},r=e.replaceAll(` `,this.str_rep);return!r.startsWith(this.replacement)&&(this.prepend_scheme===`always`||this.prepend_scheme===`first`&&n===0)&&(r=this.str_rep+r),[r]}},Fa=class extends Oa{constructor(e){super(),this.config=e,this.pattern=mi(this.config.pattern??{},this.config.invert??!0)}pre_tokenize_text(e){return this.pattern===null?[]:this.config.invert?(e.match(this.pattern)||[]).filter(e=>e):this.config.behavior?.toLowerCase()===`removed`?e.split(this.pattern).filter(e=>e):sa(e,this.pattern)}},Ia=class extends Oa{constructor(e){super(),this.config=e,this.pattern=RegExp(`[^${ja}]+|[${ja}]+`,`gu`)}pre_tokenize_text(e){return e.match(this.pattern)||[]}},La=class extends Oa{constructor(e){super(),this.config=e;let t=`[^\\d]+|\\d${this.config.individual_digits?``:`+`}`;this.pattern=new RegExp(t,`gu`)}pre_tokenize_text(e){return e.match(this.pattern)||[]}},Ra=class extends Oa{constructor(){super(),this.pattern=RegExp(`[^\\s${ja}]+|[${ja}]`,`gu`)}pre_tokenize_text(e,t){return e.trim().match(this.pattern)||[]}},za=class extends Oa{constructor(e){super(),this.config=e,this.pattern=mi(this.config.pattern??{}),this.content=this.config.content??``}pre_tokenize_text(e){return this.pattern===null?[e]:[e.replaceAll(this.pattern,this.config.content??``)]}},Ba=class extends Oa{constructor(e){super(),this.tokenizers=(e.pretokenizers??[]).map(e=>Wa(e))}pre_tokenize_text(e,t){return this.tokenizers.reduce((e,n)=>n?n.pre_tokenize(e,t):e,[e])}},Va=class extends Oa{pre_tokenize_text(e){return ua(e)}},Ha=class extends Oa{constructor(e){super(),this.config=e,this._length=e.length}pre_tokenize_text(e){let t=[];for(let n=0;nthis.max_input_chars_per_word){t.push(this.unk_token);continue}let r=!1,i=0,a=[];for(;i0&&(r=this.config.continuing_subword_prefix+r),this.tokens_to_ids.has(r)){n=r;break}--t}if(n===null){r=!0;break}a.push(n),i=t}r?t.push(this.unk_token):t.push(...a)}return t}},qa=class e{constructor(e,t){this.is_leaf=e,this.children=t}static default(){return new e(!1,/* @__PURE__ */ new Map)}},Ja=class{constructor(){this.root=qa.default()}extend(e){for(let t of e)this.push(t)}push(e){let t=this.root;for(let n of e){let e=t.children.get(n);e===void 0&&(e=qa.default(),t.children.set(n,e)),t=e}t.is_leaf=!0}*common_prefix_search(e,t=0){let n=this.root;if(n===void 0)return;let r=``;for(let i=t;i[]),this.end_nodes=Array.from({length:this.len+1},()=>[]);let r=new Ya(this.bos_token_id??0,0,0,0,0),i=new Ya(this.eos_token_id??0,1,this.len,0,0);this.nodes.push(r.clone()),this.nodes.push(i.clone()),this.begin_nodes[this.len].push(i),this.end_nodes[0].push(r)}insert(e,t,n,r){let i=this.nodes.length,a=new Ya(r,i,e,t,n);this.begin_nodes[e].push(a),this.end_nodes[e+t].push(a),this.nodes.push(a)}viterbi(){let e=this.len,t=0;for(;t<=e;){if(this.begin_nodes[t].length==0)return[];for(let e of this.begin_nodes[t]){e.prev=null;let n=0,r=null;for(let i of this.end_nodes[t]){let t=i.backtrace_score+e.score;(r===null||t>n)&&(r=i.clone(),n=t)}if(r!==null)e.prev=r,e.backtrace_score=n;else return[]}++t}let n=[],r=this.begin_nodes[e][0].prev;if(r===null)return[];let i=r.clone();for(;i.prev!==null;)n.push(i.clone()),i=i.clone().prev.clone();return n.reverse(),n}piece(e){return this.chars.slice(e.pos,e.pos+e.length).join(``)}tokens(){return this.viterbi().map(e=>this.piece(e))}token_ids(){return this.viterbi().map(e=>e.token_id)}};function Za(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;r[e,t])),this.bos_token=` `,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=t,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.unk_token=this.vocab[this.unk_token_id],this.min_score=Za(this.scores)[0],this.unk_score=this.min_score-10,this.scores[this.unk_token_id]=this.unk_score,this.trie=new Ja,this.trie.extend(this.vocab),this.fuse_unk=!0}populate_nodes(e){let t=e.chars,n=0;for(;ne>t,t=1/0){this._heap=[],this._comparator=e,this._max_size=t}get size(){return this._heap.length}is_empty(){return this.size===0}peek(){return this._heap[0]}push(...e){return this.extend(e)}extend(e){for(let t of e)if(this.size0&&this._swap(0,t),this._heap.pop(),this._sift_down(),e}replace(e){let t=this.peek();return this._heap[0]=e,this._sift_down(),t}_parent(e){return(e+1>>>1)-1}_left(e){return(e<<1)+1}_right(e){return e+1<<1}_greater(e,t){return this._comparator(this._heap[e],this._heap[t])}_swap(e,t){let n=this._heap[e];this._heap[e]=this._heap[t],this._heap[t]=n}_sift_up(){this._sift_up_from(this.size-1)}_sift_up_from(e){for(;e>0&&this._greater(e,this._parent(e));)this._swap(e,this._parent(e)),e=this._parent(e)}_sift_down(){let e=0;for(;this._left(e)this.capacity&&this.cache.delete(this.cache.keys().next().value)}clear(){this.cache.clear()}},to=class extends Ga{constructor(e){super(e),this.tokens_to_ids=oa(e.vocab),this.unk_token_id=this.tokens_to_ids.get(e.unk_token),this.unk_token=e.unk_token,this.vocab=Array(this.tokens_to_ids.size);for(let[e,t]of this.tokens_to_ids)this.vocab[t]=e;let t=Array.isArray(e.merges[0]);this.merges=t?e.merges:e.merges.map(e=>e.split(` `,2)),this.bpe_ranks=new Map(this.merges.map((e,t)=>[JSON.stringify(e),t])),this.end_of_word_suffix=e.end_of_word_suffix,this.continuing_subword_suffix=e.continuing_subword_suffix??null,this.byte_fallback=this.config.byte_fallback??!1,this.byte_fallback&&(this.text_encoder=new TextEncoder),this.ignore_merges=this.config.ignore_merges??!1,this.max_length_to_cache=256,this.cache_capacity=1e4,this.cache=new eo(this.cache_capacity)}clear_cache(){this.cache.clear()}bpe(e){if(e.length===0)return[];let t=this.cache.get(e);if(t!==void 0)return t;let n=Array.from(e);this.end_of_word_suffix&&(n[n.length-1]+=this.end_of_word_suffix);let r=[];if(n.length>1){let e=new $a((e,t)=>e.score`<0x${e.toString(16).toUpperCase().padStart(2,`0`)}>`);e.every(e=>this.tokens_to_ids.has(e))?t.push(...e):this.unk_token!=null&&t.push(this.unk_token)}else this.unk_token!=null&&t.push(this.unk_token)}return t}},no=class extends Ga{constructor(e,t){super(e);let n=e.vocab;this.tokens_to_ids=oa(t.target_lang?n[t.target_lang]:n),this.bos_token=t.bos_token,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=t.eos_token,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.pad_token=t.pad_token,this.pad_token_id=this.tokens_to_ids.get(this.pad_token),this.unk_token=t.unk_token,this.unk_token_id=this.tokens_to_ids.get(this.unk_token),this.vocab=Array(this.tokens_to_ids.size);for(let[e,t]of this.tokens_to_ids)this.vocab[t]=e}encode(e){return e}};function ro(e,t){switch(e.type){case`WordPiece`:return new Ka(e);case`Unigram`:return new Qa(e,t.eos_token);case`BPE`:return new to(e);default:if(e.vocab)return Array.isArray(e.vocab)?new Qa(e,t.eos_token):Object.hasOwn(e,`continuing_subword_prefix`)&&Object.hasOwn(e,`unk_token`)?Object.hasOwn(e,`merges`)?new to(e):new Ka(e):new no(e,{target_lang:t.target_lang,bos_token:t.bos_token,eos_token:t.eos_token,pad_token:t.pad_token,unk_token:t.unk_token});throw Error(`Unknown TokenizerModel type: ${e?.type}`)}}var io=ro,ao=class extends da{constructor(e){super(),this.config=e}_call(e,...t){return this.post_process(e,...t)}},oo=class extends ao{post_process(e,t=null,n=!0){let r=t===null?this.config.single:this.config.pair,i=[],a=[];for(let o of r)`SpecialToken`in o?n&&(i.push(o.SpecialToken.id),a.push(o.SpecialToken.type_id)):`Sequence`in o&&(o.Sequence.id===`A`?(i=aa(i,e),a=aa(a,Array(e.length).fill(o.Sequence.type_id))):o.Sequence.id===`B`&&(i=aa(i,t),a=aa(a,Array(t.length).fill(o.Sequence.type_id))));return{tokens:i,token_type_ids:a}}},so=class extends ao{post_process(e,t=null){return{tokens:e,tokens_pair:t}}},co=class extends ao{constructor(e){super(e),this.sep=e.sep,this.cls=e.cls}post_process(e,t=null,n=!0){n&&(e=aa([this.cls[0]],e,[this.sep[0]]));let r=Array(e.length).fill(0);if(t){let i=[],a=n?[this.sep[0]]:[];e=aa(e,i,t,a),r=aa(r,Array(t.length+i.length+a.length).fill(1))}return{tokens:e,token_type_ids:r}}},lo=class extends ao{constructor(e){super(e),this.sep=e.sep,this.cls=e.cls}post_process(e,t,n=!0){n&&(e=aa([this.cls[0]],e,[this.sep[0]]));let r=Array(e.length).fill(0);if(t){let i=n?[this.sep[0]]:[],a=n?[this.sep[0]]:[];e=aa(e,i,t,a),r=aa(r,Array(t.length+i.length+a.length).fill(1))}return{tokens:e,token_type_ids:r}}},uo=class extends ao{constructor(e){super(e),this.processors=(e.processors??[]).map(e=>po(e))}post_process(e,t=null,n=!0){let r={tokens:e,tokens_pair:t};for(let e of this.processors)r=e.post_process(r.tokens,r.tokens_pair,n);return r}};function fo(e){if(e===null)return null;switch(e.type){case`TemplateProcessing`:return new oo(e);case`ByteLevel`:return new so(e);case`BertProcessing`:return new co(e);case`RobertaProcessing`:return new lo(e);case`Sequence`:return new uo(e);default:throw Error(`Unknown PostProcessor type: ${e.type}`)}}var po=fo,mo=class extends da{constructor(e){super(),this.config=e,this.added_tokens=[],this.end_of_word_suffix=null,this.trim_offsets=`trim_offsets`in e&&e.trim_offsets}_call(e){return this.decode(e)}decode(e){return this.decode_chain(e).join(``)}},ho=class extends mo{constructor(e){super(e),this.byte_decoder=Aa,this.text_decoder=new TextDecoder(`utf-8`,{fatal:!1,ignoreBOM:!0}),this.end_of_word_suffix=null}convert_tokens_to_string(e){let t=e.join(``),n=new Uint8Array([...t].map(e=>this.byte_decoder[e]));return this.text_decoder.decode(n)}decode_chain(e){let t=[],n=[];for(let r of e)this.added_tokens.find(e=>e.content===r)===void 0?n.push(r):(n.length>0&&(t.push(this.convert_tokens_to_string(n)),n=[]),t.push(r));return n.length>0&&t.push(this.convert_tokens_to_string(n)),t}},go=class extends mo{constructor(e){super(e),this.cleanup=e.cleanup}decode_chain(e){return e.map((e,t)=>{if(t!==0){let t=this.config.prefix;e=t&&e.startsWith(t)?e.replace(t,``):` `+e}return this.cleanup&&(e=pi(e)),e})}},_o=class extends mo{constructor(e){super(e),this.replacement=e.replacement??`▁`}decode_chain(e){let t=[];for(let n=0;nt.replaceAll(this.suffix,n===e.length-1?``:` `))}},yo=class extends mo{constructor(e){super(e),this.pad_token=e.pad_token??``,this.word_delimiter_token=e.word_delimiter_token??``,this.cleanup=e.cleanup}convert_tokens_to_string(e){if(e.length===0)return``;let t=[e[0]];for(let n=1;ne!==this.pad_token).join(``);return this.cleanup&&(n=pi(n).replaceAll(this.word_delimiter_token,` `).trim()),n}decode_chain(e){return[this.convert_tokens_to_string(e)]}},bo=class extends mo{constructor(e){super(e),this.decoders=(e.decoders??[]).map(e=>Eo(e))}decode_chain(e){return this.decoders.reduce((e,t)=>t.decode_chain(e),e)}},xo=class extends mo{constructor(e){super(e),this.pattern=mi(this.config.pattern)}decode_chain(e){let t=this.config.content??``,n=this.pattern;return n===null?e:e.map(e=>e.replaceAll(n,t))}},So=class extends mo{decode_chain(e){return[e.join(``)]}},Co=class extends mo{constructor(e){super(e),this.content=e.content??``,this.start=e.start??0,this.stop=e.stop??0}decode_chain(e){return e.map(e=>{let t=0;for(let n=0;n`)){let t=parseInt(r.slice(3,5),16);isNaN(t)||(e=t)}if(e!==null)n.push(e);else{if(n.length>0){let e=this.text_decoder.decode(Uint8Array.from(n));t.push(e),n=[]}t.push(r)}}if(n.length>0){let e=this.text_decoder.decode(Uint8Array.from(n));t.push(e),n=[]}return t}};function To(e){if(e===null)return null;switch(e.type){case`ByteLevel`:return new ho(e);case`WordPiece`:return new go(e);case`Metaspace`:return new _o(e);case`BPEDecoder`:return new vo(e);case`CTC`:return new yo(e);case`Sequence`:return new bo(e);case`Replace`:return new xo(e);case`Fuse`:return new So(e);case`Strip`:return new Co(e);case`ByteFallback`:return new wo(e);default:throw Error(`Unknown Decoder type: ${e.type}`)}}var Eo=To,Do=class{constructor(e,t){let n=la(e,`Tokenizer`,[`model`,`decoder`,`post_processor`,`pre_tokenizer`,`normalizer`]);if(n)throw Error(n);let r=la(t,`Config`);if(r)throw Error(r);this.tokenizer=e,this.config=t,this.normalizer=Da(this.tokenizer.normalizer),this.pre_tokenizer=Wa(this.tokenizer.pre_tokenizer),this.model=io(this.tokenizer.model,this.config),this.post_processor=po(this.tokenizer.post_processor),this.decoder=Eo(this.tokenizer.decoder),this.special_tokens=[],this.all_special_ids=[],this.added_tokens=[];let i=[],a=[];this.added_tokens_map=/* @__PURE__ */ new Map;for(let e of this.tokenizer.added_tokens){let t=new di(e);if(this.added_tokens.push(t),this.model.tokens_to_ids.set(t.content,t.id),this.model.vocab[t.id]=t.content,t.special&&(this.special_tokens.push(t.content),this.all_special_ids.push(t.id)),this.added_tokens_map.set(t.content,t),t.normalized&&this.normalizer!==null){let e=this.normalizer(t.content);a.push(e),this.added_tokens_map.set(e,t)}else i.push(t.content)}(this.config.additional_special_tokens??[]).forEach(e=>{this.special_tokens.includes(e)||this.special_tokens.push(e)}),this.decoder&&(this.decoder.added_tokens=this.added_tokens,this.decoder.end_of_word_suffix=this.model.end_of_word_suffix),this.splitter_unnormalized=new ui(i),this.splitter_normalized=new ui(a),this.remove_space=this.config.remove_space,this.clean_up_tokenization_spaces=this.config.clean_up_tokenization_spaces??!0,this.do_lowercase_and_remove_accent=this.config.do_lowercase_and_remove_accent??!1}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{tokens:i,token_type_ids:a}=this.tokenize_helper(e,{text_pair:t,add_special_tokens:n}),o=i.map(e=>this.added_tokens_map.get(e)?.id??this.model.tokens_to_ids.get(e)??this.model.unk_token_id),s={ids:o,tokens:i,attention_mask:Array(o.length).fill(1)};return r&&a&&(s.token_type_ids=a),s}decode(e,t={}){if(!Array.isArray(e)||e.length===0||!na(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);let n=e.map(e=>this.model.vocab[Number(e)]??this.model.unk_token);t.skip_special_tokens&&(n=n.filter(e=>!this.special_tokens.includes(e)));let r=this.decoder?this.decoder(n):n.join(` `);return this.decoder&&this.decoder.end_of_word_suffix&&(r=r.replaceAll(this.decoder.end_of_word_suffix,` `),t.skip_special_tokens&&(r=r.trim())),(t.clean_up_tokenization_spaces??this.clean_up_tokenization_spaces)&&(r=pi(r)),r}tokenize(e,{text_pair:t=null,add_special_tokens:n=!1}={}){return this.tokenize_helper(e,{text_pair:t,add_special_tokens:n}).tokens}encode_text(e){if(e===null)return null;let t=this.splitter_unnormalized.split(e);return t.forEach((e,n)=>{let r=this.added_tokens_map.get(e);r&&(r.lstrip&&n>0&&(t[n-1]=t[n-1].trimEnd()),r.rstrip&&n{if(e.length===0)return[];if(this.added_tokens_map.has(e))return[e];if(this.remove_space===!0&&(e=e.trim().split(/\s+/).join(` `)),this.do_lowercase_and_remove_accent&&(e=ia(e)),this.normalizer!==null&&(e=this.normalizer(e)),e.length===0)return[];let n=this.splitter_normalized.split(e);return n.forEach((e,t)=>{let r=this.added_tokens_map.get(e);r&&(r.lstrip&&t>0&&(n[t-1]=n[t-1].trimEnd()),r.rstrip&&t{if(e.length===0)return[];if(this.added_tokens_map.has(e))return[e];let n=this.pre_tokenizer===null?[e]:this.pre_tokenizer(e,{section_index:t});return this.model(n)})})}tokenize_helper(e,{text_pair:t=null,add_special_tokens:n=!0}){let r=this.encode_text(e),i=this.encode_text(t||null);return this.post_processor?this.post_processor(r,i,n):{tokens:aa(r??[],i??[])}}token_to_id(e){return this.model.tokens_to_ids.get(e)}id_to_token(e){return this.model.vocab[e]}get_added_tokens_decoder(){let e=/* @__PURE__ */ new Map;for(let t of this.added_tokens)e.set(t.id,t);return e}get_vocab(e=!0){let t=/* @__PURE__ */ new Map;for(let n=0;nt in e?Oo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ao=(e,t,n)=>(ko(e,typeof t==`symbol`?t:t+``,n),n),j=Object.freeze({Text:`Text`,NumericLiteral:`NumericLiteral`,StringLiteral:`StringLiteral`,Identifier:`Identifier`,Equals:`Equals`,OpenParen:`OpenParen`,CloseParen:`CloseParen`,OpenStatement:`OpenStatement`,CloseStatement:`CloseStatement`,OpenExpression:`OpenExpression`,CloseExpression:`CloseExpression`,OpenSquareBracket:`OpenSquareBracket`,CloseSquareBracket:`CloseSquareBracket`,OpenCurlyBracket:`OpenCurlyBracket`,CloseCurlyBracket:`CloseCurlyBracket`,Comma:`Comma`,Dot:`Dot`,Colon:`Colon`,Pipe:`Pipe`,CallOperator:`CallOperator`,AdditiveBinaryOperator:`AdditiveBinaryOperator`,MultiplicativeBinaryOperator:`MultiplicativeBinaryOperator`,ExponentiationBinaryOperator:`ExponentiationBinaryOperator`,ComparisonBinaryOperator:`ComparisonBinaryOperator`,UnaryOperator:`UnaryOperator`,Comment:`Comment`}),jo=class{constructor(e,t){this.value=e,this.type=t}};function Mo(e){return/\w/.test(e)}function No(e){return/[0-9]/.test(e)}function Po(e){return/\s/.test(e)}var Fo=[[`{%`,j.OpenStatement],[`%}`,j.CloseStatement],[`{{`,j.OpenExpression],[`}}`,j.CloseExpression],[`(`,j.OpenParen],[`)`,j.CloseParen],[`{`,j.OpenCurlyBracket],[`}`,j.CloseCurlyBracket],[`[`,j.OpenSquareBracket],[`]`,j.CloseSquareBracket],[`,`,j.Comma],[`.`,j.Dot],[`:`,j.Colon],[`|`,j.Pipe],[`<=`,j.ComparisonBinaryOperator],[`>=`,j.ComparisonBinaryOperator],[`==`,j.ComparisonBinaryOperator],[`!=`,j.ComparisonBinaryOperator],[`<`,j.ComparisonBinaryOperator],[`>`,j.ComparisonBinaryOperator],[`+`,j.AdditiveBinaryOperator],[`-`,j.AdditiveBinaryOperator],[`~`,j.AdditiveBinaryOperator],[`**`,j.ExponentiationBinaryOperator],[`*`,j.MultiplicativeBinaryOperator],[`//`,j.MultiplicativeBinaryOperator],[`/`,j.MultiplicativeBinaryOperator],[`%`,j.MultiplicativeBinaryOperator],[`=`,j.Equals]],Io=/* @__PURE__ */ new Map([[`n`,` -`],[`t`,` `],[`r`,`\r`],[`b`,`\b`],[`f`,`\f`],[`v`,`\v`],[`'`,`'`],[`"`,`"`],[`\\`,`\\`]]);function Lo(e,t={}){return e.endsWith(` -`)&&(e=e.slice(0,-1)),t.lstrip_blocks&&(e=e.replace(/^[ \t]*({[#%-])/gm,`$1`)),t.trim_blocks&&(e=e.replace(/([#%-]})\n/g,`$1`)),e.replace(/(\s*){%(-?)\s*(?:end)?generation\s*(-?)%}(\s*)/gs,(e,t,n,r,i)=>(n?``:t)+(r?``:i))}function Ro(e,t={}){let n=[],r=Lo(e,t),i=0,a=0,o=e=>{let t=``;for(;e(r[i]);){if(r[i]===`\\`){if(++i,i>=r.length)throw SyntaxError(`Unexpected end of input`);let e=r[i++],n=Io.get(e);if(n===void 0)throw SyntaxError(`Unexpected escaped character: ${e}`);t+=n;continue}if(t+=r[i++],i>=r.length)throw SyntaxError(`Unexpected end of input`)}return t},s=()=>{let e=n.at(-1);e&&e.type===j.Text&&(e.value=e.value.trimEnd(),e.value===``&&n.pop())},c=()=>{for(;i0){n.push(new jo(e,j.Text));continue}}if(r[i]===`{`&&r[i+1]===`#`){i+=2;let e=r[i]===`-`;e&&++i;let t=``;for(;r[i]!==`#`||r[i+1]!==`}`;){if(i+2>=r.length)throw SyntaxError(`Missing end of comment tag`);t+=r[i++]}let a=t.endsWith(`-`);a&&(t=t.slice(0,-1)),e&&s(),n.push(new jo(t,j.Comment)),i+=2,a&&c();continue}if(r.slice(i,i+3)===`{%-`){s(),n.push(new jo(`{%`,j.OpenStatement)),i+=3;continue}if(r.slice(i,i+3)===`{{-`){s(),n.push(new jo(`{{`,j.OpenExpression)),a=0,i+=3;continue}if(o(Po),r.slice(i,i+3)===`-%}`){n.push(new jo(`%}`,j.CloseStatement)),i+=3,c();continue}if(r.slice(i,i+3)===`-}}`){n.push(new jo(`}}`,j.CloseExpression)),i+=3,c();continue}let t=r[i];if(t===`-`||t===`+`){let e=n.at(-1)?.type;if(e===j.Text||e===void 0)throw SyntaxError(`Unexpected character: ${t}`);switch(e){case j.Identifier:case j.NumericLiteral:case j.StringLiteral:case j.CloseParen:case j.CloseSquareBracket:break;default:{++i;let e=o(No);if(e.length>0&&r[i]===`.`&&No(r[i+1])){++i;let t=o(No);e=`${e}.${t}`}n.push(new jo(`${t}${e}`,e.length>0?j.NumericLiteral:j.UnaryOperator));continue}}}for(let[e,t]of Fo)if(!(e===`}}`&&a>0)&&r.slice(i,i+e.length)===e){n.push(new jo(e,t)),t===j.OpenExpression?a=0:t===j.OpenCurlyBracket?++a:t===j.CloseCurlyBracket&&--a,i+=e.length;continue main}if(t===`'`||t===`"`){++i;let e=o(e=>e!==t);n.push(new jo(e,j.StringLiteral)),++i;continue}if(No(t)){let e=o(No);if(n.at(-1)?.type!==j.Dot&&r[i]===`.`&&No(r[i+1])){++i;let t=o(No);e=`${e}.${t}`}n.push(new jo(e,j.NumericLiteral));continue}if(Mo(t)){let e=o(Mo);n.push(new jo(e,j.Identifier));continue}throw SyntaxError(`Unexpected character: ${t}`)}return n}var zo=class{type=`Statement`},Bo=class extends zo{constructor(e){super(),this.body=e}type=`Program`},Vo=class extends zo{constructor(e,t,n){super(),this.test=e,this.body=t,this.alternate=n}type=`If`},Ho=class extends zo{constructor(e,t,n,r){super(),this.loopvar=e,this.iterable=t,this.body=n,this.defaultBlock=r}type=`For`},Uo=class extends zo{type=`Break`},Wo=class extends zo{type=`Continue`},Go=class extends zo{constructor(e,t,n){super(),this.assignee=e,this.value=t,this.body=n}type=`Set`},Ko=class extends zo{constructor(e,t,n){super(),this.name=e,this.args=t,this.body=n}type=`Macro`},qo=class extends zo{constructor(e){super(),this.value=e}type=`Comment`},Jo=class extends zo{type=`Expression`},Yo=class extends Jo{constructor(e,t,n){super(),this.object=e,this.property=t,this.computed=n}type=`MemberExpression`},Xo=class extends Jo{constructor(e,t){super(),this.callee=e,this.args=t}type=`CallExpression`},Zo=class extends Jo{constructor(e){super(),this.value=e}type=`Identifier`},Qo=class extends Jo{constructor(e){super(),this.value=e}type=`Literal`},$o=class extends Qo{type=`IntegerLiteral`},es=class extends Qo{type=`FloatLiteral`},ts=class extends Qo{type=`StringLiteral`},ns=class extends Qo{type=`ArrayLiteral`},rs=class extends Qo{type=`TupleLiteral`},is=class extends Qo{type=`ObjectLiteral`},as=class extends Jo{constructor(e,t,n){super(),this.operator=e,this.left=t,this.right=n}type=`BinaryExpression`},os=class extends Jo{constructor(e,t){super(),this.operand=e,this.filter=t}type=`FilterExpression`},ss=class extends zo{constructor(e,t){super(),this.filter=e,this.body=t}type=`FilterStatement`},cs=class extends Jo{constructor(e,t){super(),this.lhs=e,this.test=t}type=`SelectExpression`},ls=class extends Jo{constructor(e,t,n){super(),this.operand=e,this.negate=t,this.test=n}type=`TestExpression`},us=class extends Jo{constructor(e,t){super(),this.operator=e,this.argument=t}type=`UnaryExpression`},ds=class extends Jo{constructor(e=void 0,t=void 0,n=void 0){super(),this.start=e,this.stop=t,this.step=n}type=`SliceExpression`},fs=class extends Jo{constructor(e,t){super(),this.key=e,this.value=t}type=`KeywordArgumentExpression`},ps=class extends Jo{constructor(e){super(),this.argument=e}type=`SpreadExpression`},ms=class extends Jo{constructor(e){super(),this.argument=e}type=`KeywordSpreadExpression`},hs=class extends zo{constructor(e,t,n){super(),this.call=e,this.callerArgs=t,this.body=n}type=`CallStatement`},gs=class extends Jo{constructor(e,t,n){super(),this.condition=e,this.trueExpr=t,this.falseExpr=n}type=`Ternary`};function _s(e){let t=new Bo([]),n=0;function r(t,r){let i=e[n++];if(!i||i.type!==t)throw Error(`Parser Error: ${r}. ${i.type} !== ${t}.`);return i}function i(e){if(!c(e))throw SyntaxError(`Expected ${e}`);++n}function a(){switch(e[n].type){case j.Comment:return new qo(e[n++].value);case j.Text:return l();case j.OpenStatement:return u();case j.OpenExpression:return d();default:throw SyntaxError(`Unexpected token type: ${e[n].type}`)}}function o(...t){return n+t.length<=e.length&&t.every((t,r)=>t===e[n+r].type)}function s(...t){return e[n]?.type===j.OpenStatement&&e[n+1]?.type===j.Identifier&&t.includes(e[n+1]?.value)}function c(...t){return n+t.length<=e.length&&t.every((t,r)=>e[n+r].type===`Identifier`&&t===e[n+r].value)}function l(){return new ts(r(j.Text,`Expected text token`).value)}function u(){if(r(j.OpenStatement,`Expected opening statement token`),e[n].type!==j.Identifier)throw SyntaxError(`Unknown statement, got ${e[n].type}`);let t=e[n].value,c;switch(t){case`set`:++n,c=f();break;case`if`:++n,c=p(),r(j.OpenStatement,`Expected {% token`),i(`endif`),r(j.CloseStatement,`Expected %} token`);break;case`macro`:++n,c=m(),r(j.OpenStatement,`Expected {% token`),i(`endmacro`),r(j.CloseStatement,`Expected %} token`);break;case`for`:++n,c=g(),r(j.OpenStatement,`Expected {% token`),i(`endfor`),r(j.CloseStatement,`Expected %} token`);break;case`call`:{++n;let e=null;o(j.OpenParen)&&(e=te(`parameters`));let t=ue();if(t.type!==`Identifier`)throw SyntaxError(`Expected identifier following call statement`);let l=te(`call`);r(j.CloseStatement,`Expected closing statement token`);let u=[];for(;!s(`endcall`);)u.push(a());r(j.OpenStatement,`Expected '{%'`),i(`endcall`),r(j.CloseStatement,`Expected closing statement token`),c=new hs(new Xo(t,l),e,u);break}case`break`:++n,r(j.CloseStatement,`Expected closing statement token`),c=new Uo;break;case`continue`:++n,r(j.CloseStatement,`Expected closing statement token`),c=new Wo;break;case`filter`:{++n;let e=ue();e instanceof Zo&&o(j.OpenParen)&&(e=w(e)),r(j.CloseStatement,`Expected closing statement token`);let t=[];for(;!s(`endfilter`);)t.push(a());r(j.OpenStatement,`Expected '{%'`),i(`endfilter`),r(j.CloseStatement,`Expected '%}'`),c=new ss(e,t);break}default:throw SyntaxError(`Unknown statement type: ${t}`)}return c}function d(){r(j.OpenExpression,`Expected opening expression token`);let e=_();return r(j.CloseExpression,`Expected closing expression token`),e}function f(){let e=h(),t=null,c=[];if(o(j.Equals))++n,t=h();else{for(r(j.CloseStatement,`Expected %} token`);!s(`endset`);)c.push(a());r(j.OpenStatement,`Expected {% token`),i(`endset`)}return r(j.CloseStatement,`Expected closing statement token`),new Go(e,t,c)}function p(){let e=_();r(j.CloseStatement,`Expected closing statement token`);let t=[],i=[];for(;!s(`elif`,`else`,`endif`);)t.push(a());if(s(`elif`)){++n,++n;let e=p();i.push(e)}else if(s(`else`))for(++n,++n,r(j.CloseStatement,`Expected closing statement token`);!s(`endif`);)i.push(a());return new Vo(e,t,i)}function m(){let e=ue();if(e.type!==`Identifier`)throw SyntaxError(`Expected identifier following macro statement`);let t=te(`parameters`);r(j.CloseStatement,`Expected closing statement token`);let n=[];for(;!s(`endmacro`);)n.push(a());return new Ko(e,t,n)}function h(e=!1){let t=e?ue:_,r=[t()],i=o(j.Comma);for(;i&&(++n,r.push(t()),o(j.Comma)););return i?new rs(r):r[0]}function g(){let e=h(!0);if(!(e instanceof Zo||e instanceof rs))throw SyntaxError(`Expected identifier/tuple for the loop variable, got ${e.type} instead`);if(!c(`in`))throw SyntaxError("Expected `in` keyword following loop variable");++n;let t=_();r(j.CloseStatement,`Expected closing statement token`);let i=[];for(;!s(`endfor`,`else`);)i.push(a());let o=[];if(s(`else`))for(++n,++n,r(j.CloseStatement,`Expected closing statement token`);!s(`endfor`);)o.push(a());return new Ho(e,t,i,o)}function _(){return v()}function v(){let e=y();if(c(`if`)){++n;let t=y();return c(`else`)?(++n,new gs(t,e,v())):new cs(e,t)}return e}function y(){let t=b();for(;c(`or`);){let r=e[n];++n;let i=b();t=new as(r,t,i)}return t}function b(){let t=x();for(;c(`and`);){let r=e[n];++n;let i=x();t=new as(r,t,i)}return t}function x(){let t;for(;c(`not`);){let r=e[n];++n,t=new us(r,x())}return t??S()}function S(){let t=C();for(;;){let r;if(c(`not`,`in`))r=new jo(`not in`,j.Identifier),n+=2;else if(c(`in`))r=e[n++];else if(o(j.ComparisonBinaryOperator))r=e[n++];else break;let i=C();t=new as(r,t,i)}return t}function C(){let t=ae();for(;o(j.AdditiveBinaryOperator);){let r=e[n];++n;let i=ae();t=new as(r,t,i)}return t}function ee(){let e=ie(ue());return o(j.OpenParen)?w(e):e}function w(e){let t=new Xo(e,te(`call`));return t=ie(t),o(j.OpenParen)&&(t=w(t)),t}function te(e){r(j.OpenParen,`Expected opening parenthesis for arguments list`);let t=ne(e);return r(j.CloseParen,`Expected closing parenthesis for arguments list`),t}function ne(t){let r=[],i=/* @__PURE__ */ new Set,a=!1,s=!1;for(;!o(j.CloseParen);){let c=o(j.ExponentiationBinaryOperator),l=o(j.MultiplicativeBinaryOperator)&&e[n].value===`*`;if(t===`parameters`&&(c||l))throw SyntaxError(`Argument unpacking is not allowed in parameter declarations`);if(c){if(++n,r.push(new ms(_())),o(j.Comma)&&++n,!o(j.CloseParen))throw SyntaxError("Expected closing parenthesis: `**` must be applied to the final argument");break}let u;if(l){if(s)throw SyntaxError("Only one `*` argument unpacking is allowed");s=!0,++n,u=new ps(_())}else{if(u=_(),o(j.Equals)){if(++n,!(u instanceof Zo))throw SyntaxError(t===`parameters`?`Expected identifier for parameter declaration`:`Expected identifier for keyword argument`);let e=_();u=new fs(u,e)}if(t===`parameters`){if(!(u instanceof Zo||u instanceof fs))throw SyntaxError(`Expected identifier for parameter declaration`);let e=u instanceof Zo?u.value:u.key.value;if(i.has(e))throw SyntaxError(`Duplicate parameter name: ${e}`);i.add(e)}if(u instanceof fs)a=!0;else if(a)throw SyntaxError(t===`call`?`Positional arguments must come before keyword arguments`:`Non-default argument follows default argument`);else if(s)throw SyntaxError("Positional arguments must not follow `*` argument unpacking")}r.push(u),o(j.Comma)&&++n}return r}function re(){let e=[],t=!1;for(;!o(j.CloseSquareBracket);)o(j.Colon)?(e.push(void 0),++n,t=!0):(e.push(_()),o(j.Colon)&&(++n,t=!0));if(e.length===0)throw SyntaxError(`Expected at least one argument for member/slice expression`);if(t){if(e.length>3)throw SyntaxError(`Expected 0-3 arguments for slice expression`);return new ds(...e)}return e[0]}function ie(t){for(;o(j.Dot)||o(j.OpenSquareBracket);){let i=e[n];++n;let a,o=i.type===j.OpenSquareBracket;if(o)a=re(),r(j.CloseSquareBracket,`Expected closing square bracket`);else if(a=ue(),a.type!==`Identifier`&&a.type!==`IntegerLiteral`)throw SyntaxError(`Expected identifier or integer following dot operator`);t=new Yo(t,a,o)}return t}function ae(){let t=oe();for(;o(j.MultiplicativeBinaryOperator);){let r=e[n++],i=oe();t=new as(r,t,i)}return t}function oe(){let t=se();for(;o(j.ExponentiationBinaryOperator);){let r=e[n++],i=se();t=new as(r,t,i)}return t}function se(){let e=ce();for(;c(`is`);){++n;let t=c(`not`);t&&++n;let r=ue();if(!(r instanceof Zo))throw SyntaxError(`Expected identifier for the test`);e=new ls(e,t,r)}return e}function ce(){let e=le();for(;o(j.Pipe);){++n;let t=ue();if(!(t instanceof Zo))throw SyntaxError(`Expected identifier for the filter`);o(j.OpenParen)&&(t=w(t)),e=new os(e,t)}return e}function le(){let t=e[n];if(t&&(t.type===j.UnaryOperator||t.type===j.AdditiveBinaryOperator)&&(t.value===`-`||t.value===`+`)){let t=e[n++];return new us(t,le())}return ee()}function ue(){let t=e[n++];switch(t.type){case j.NumericLiteral:{let e=t.value;return e.includes(`.`)?new es(Number(e)):new $o(Number(e))}case j.StringLiteral:{let r=t.value;for(;o(j.StringLiteral);)r+=e[n++].value;return new ts(r)}case j.Identifier:return new Zo(t.value);case j.OpenParen:{let e=h();return r(j.CloseParen,"Expected closing parenthesis, got ${tokens[current].type} instead."),e}case j.OpenSquareBracket:{let e=[];for(;!o(j.CloseSquareBracket);)e.push(_()),o(j.Comma)&&++n;return++n,new ns(e)}case j.OpenCurlyBracket:{let e=/* @__PURE__ */ new Map;for(;!o(j.CloseCurlyBracket);){let t=_();r(j.Colon,`Expected colon between key and value in object literal`);let i=_();e.set(t,i),o(j.Comma)&&++n}return++n,new is(e)}default:throw SyntaxError(`Unexpected token: ${t.type}`)}}for(;n0)for(let i=e;it;i+=n)r.push(i);return r}function ys(e,t,n,r=1){let i=Math.sign(r);i>=0?(t=(t??=0)<0?Math.max(e.length+t,0):Math.min(t,e.length),n=(n??=e.length)<0?Math.max(e.length+n,0):Math.min(n,e.length)):(t=(t??=e.length-1)<0?Math.max(e.length+t,-1):Math.min(t,e.length-1),n=(n??=-1)<-1?Math.max(e.length+n,-1):Math.min(n,e.length-1));let a=[];for(let o=t;i*oe.toUpperCase())}function xs(e){return Ss(/* @__PURE__ */ new Date,e)}function Ss(e,t){let n=new Intl.DateTimeFormat(void 0,{month:`long`}),r=new Intl.DateTimeFormat(void 0,{month:`short`}),i=e=>e<10?`0`+e:e.toString();return t.replace(/%[YmdbBHM%]/g,t=>{switch(t){case`%Y`:return e.getFullYear().toString();case`%m`:return i(e.getMonth()+1);case`%d`:return i(e.getDate());case`%b`:return r.format(e);case`%B`:return n.format(e);case`%H`:return i(e.getHours());case`%M`:return i(e.getMinutes());case`%%`:return`%`;default:return t}})}function Cs(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ws(e,t,n,r){if(r===0)return e;let i=r==null||r<0?1/0:r,a=t.length===0?/* @__PURE__ */ RegExp(`(?=)`,`gu`):new RegExp(Cs(t),`gu`);return e.replaceAll(a,e=>i>0?(--i,n):e)}var Ts=class extends Error{},Es=class extends Error{},Ds=/* @__PURE__ */ new Map,Os=class{type=`RuntimeValue`;value;get builtins(){return Ds}constructor(e=void 0){this.value=e}__bool__(){return new F(!!this.value)}toString(){return String(this.value)}},M=class extends Os{type=`IntegerValue`},N=class extends Os{type=`FloatValue`;toString(){return Object.is(this.value,-0)?`-0.0`:this.value%1==0?this.value.toFixed(1):this.value.toString()}},P=class extends Os{type=`StringValue`;_builtins;get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`upper`,new L(()=>new P(this.value.toUpperCase()))],[`lower`,new L(()=>new P(this.value.toLowerCase()))],[`strip`,new L(()=>new P(this.value.trim()))],[`title`,new L(()=>new P(bs(this.value)))],[`capitalize`,new L(()=>new P(this.value.charAt(0).toUpperCase()+this.value.slice(1)))],[`length`,new M(this.value.length)],[`rstrip`,new L(()=>new P(this.value.trimEnd()))],[`lstrip`,new L(()=>new P(this.value.trimStart()))],[`startswith`,new L(e=>{if(e.length===0)throw Error(`startswith() requires at least one argument`);let t=e[0];if(t instanceof P)return new F(this.value.startsWith(t.value));if(t instanceof I){for(let e of t.value){if(!(e instanceof P))throw Error(`startswith() tuple elements must be strings`);if(this.value.startsWith(e.value))return new F(!0)}return new F(!1)}throw Error(`startswith() argument must be a string or tuple of strings`)})],[`endswith`,new L(e=>{if(e.length===0)throw Error(`endswith() requires at least one argument`);let t=e[0];if(t instanceof P)return new F(this.value.endsWith(t.value));if(t instanceof I){for(let e of t.value){if(!(e instanceof P))throw Error(`endswith() tuple elements must be strings`);if(this.value.endsWith(e.value))return new F(!0)}return new F(!1)}throw Error(`endswith() argument must be a string or tuple of strings`)})],[`split`,new L(e=>{let t=e[0]??new R;if(!(t instanceof P||t instanceof R))throw Error(`sep argument must be a string or null`);let n=e[1]??new M(-1);if(!(n instanceof M))throw Error(`maxsplit argument must be a number`);let r=[];if(t instanceof R){let e=this.value.trimStart();for(let{0:t,index:i}of e.matchAll(/\S+/g)){if(n.value!==-1&&r.length>=n.value&&i!==void 0){r.push(t+e.slice(i+t.length));break}r.push(t)}}else{if(t.value===``)throw Error(`empty separator`);r=this.value.split(t.value),n.value!==-1&&r.length>n.value&&r.push(r.splice(n.value).join(t.value))}return new I(r.map(e=>new P(e)))})],[`replace`,new L(e=>{if(e.length<2)throw Error(`replace() requires at least two arguments`);let t=e[0],n=e[1];if(!(t instanceof P&&n instanceof P))throw Error(`replace() arguments must be strings`);let r;if(r=e.length>2?e[2].type===`KeywordArgumentsValue`?e[2].value.get(`count`)??new R:e[2]:new R,!(r instanceof M||r instanceof R))throw Error(`replace() count argument must be a number or null`);return new P(ws(this.value,t.value,n.value,r.value))})]])}},F=class extends Os{type=`BooleanValue`},ks=/[\x7f-\uffff]/g;function As(e){return e.replace(ks,e=>`\\u`+e.charCodeAt(0).toString(16).padStart(4,`0`))}function js(e,t={},n=0,r=!0){let{indent:i=null,ensureAscii:a=!1,separators:o=null,sortKeys:s=!1}=t,c,l;switch(o?[c,l]=o:i?(c=`,`,l=`: `):(c=`, `,l=`: `),e.type){case`NullValue`:return`null`;case`UndefinedValue`:return r?`null`:`undefined`;case`IntegerValue`:case`FloatValue`:case`BooleanValue`:return JSON.stringify(e.value);case`StringValue`:{let t=JSON.stringify(e.value);return a&&(t=As(t)),t}case`ArrayValue`:case`NamespaceValue`:case`ObjectValue`:{let o=i?` `.repeat(i):``,u=` -`+o.repeat(n),d=u+o;if(e.type===`ArrayValue`){let a=e.value.map(e=>js(e,t,n+1,r));return i?`[${d}${a.join(`${c}${d}`)}${u}]`:`[${a.join(c)}]`}{let o=Array.from(e.value.entries());s&&(o=o.sort(([e],[t])=>e.localeCompare(t)));let f=o.map(([e,o])=>{let s=JSON.stringify(e);a&&(s=As(s));let c=`${s}${l}${js(o,t,n+1,r)}`;return i?`${d}${c}`:c});return i?`{${f.join(c)}${u}}`:`{${f.join(c)}}`}}default:throw Error(`Cannot convert to JSON: ${e.type}`)}}var Ms=class extends Os{type=`ObjectValue`;_builtins;__bool__(){return new F(this.value.size>0)}get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`get`,new L(([e,t])=>{if(!(e instanceof P))throw Error(`Object key must be a string: got ${e.type}`);return this.value.get(e.value)??t??new R})],[`items`,new L(()=>this.items())],[`keys`,new L(()=>this.keys())],[`values`,new L(()=>this.values())],[`dictsort`,new L(e=>{let t=/* @__PURE__ */ new Map,n=e.filter(e=>e instanceof Ns?(t=e.value,!1):!0),r=n.at(0)??t.get(`case_sensitive`)??new F(!1);if(!(r instanceof F))throw Error(`case_sensitive must be a boolean`);let i=n.at(1)??t.get(`by`)??new P(`key`);if(!(i instanceof P))throw Error(`by must be a string`);if(![`key`,`value`].includes(i.value))throw Error(`by must be either 'key' or 'value'`);let a=n.at(2)??t.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);return new I(Array.from(this.value.entries()).map(([e,t])=>new I([new P(e),t])).sort((e,t)=>{let n=i.value===`key`?0:1,o=e.value[n],s=t.value[n],c=Ws(o,s,r.value);return a.value?-c:c}))})]])}items(){return new I(Array.from(this.value.entries()).map(([e,t])=>new I([new P(e),t])))}keys(){return new I(Array.from(this.value.keys()).map(e=>new P(e)))}values(){return new I(Array.from(this.value.values()))}toString(){return js(this,{},0,!1)}},Ns=class extends Ms{type=`KeywordArgumentsValue`},Ps=class extends Os{type=`NamespaceValue`;toString(){return js(this,{},0,!1)}},I=class extends Os{type=`ArrayValue`;_builtins;get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`length`,new M(this.value.length)]])}__bool__(){return new F(this.value.length>0)}toString(){return js(this,{},0,!1)}},Fs=class extends I{type=`TupleValue`},L=class extends Os{type=`FunctionValue`},R=class extends Os{type=`NullValue`},z=class extends Os{type=`UndefinedValue`};function Is(e){let t;if(e instanceof I?t=e.value:e instanceof P&&(t=Array.from(e.value,e=>new P(e))),!t||t.length!==2)throw Error(`namespace expected an object or an iterable of [key, value] pairs`);let[n,r]=t;if(!(n instanceof P))throw Error(`namespace keys must be strings`);return[n,r]}var Ls=class{constructor(e){this.parent=e}variables=/* @__PURE__ */ new Map([[`namespace`,new L(e=>{let t=e.slice(),n;if(t.at(-1)instanceof Ns&&(n=t.pop()),t.length>1)throw Error(`namespace expected at most 1 argument, got ${t.length}`);let r=/* @__PURE__ */ new Map;if(t.length===1){let e=t[0];if(e instanceof Ms)for(let[t,n]of e.value)r.set(t,n);else if(e instanceof I)for(let t of e.value){let[e,n]=Is(t);r.set(e.value,n)}else throw Error(`'${e.type}' object is not iterable`)}if(n)for(let[e,t]of n.value)r.set(e,t);return new Ps(r)})]]);tests=Ls.TESTS;set(e,t){return this.declareVariable(e,Ys(t))}declareVariable(e,t){if(this.variables.has(e))throw SyntaxError(`Variable already declared: ${e}`);return this.variables.set(e,t),t}setVariable(e,t){return this.variables.set(e,t),t}resolve(e){if(this.variables.has(e))return this;if(this.parent)return this.parent.resolve(e);throw Error(`Unknown variable: ${e}`)}lookupVariable(e){try{return this.resolve(e).variables.get(e)??new z}catch{return new z}}},Rs=Ls;Ao(Rs,`TESTS`,/* @__PURE__ */ new Map([[`boolean`,e=>e.type===`BooleanValue`],[`callable`,e=>e instanceof L],[`odd`,e=>{if(!(e instanceof M))throw Error(`cannot odd on ${e.type}`);return e.value%2!=0}],[`even`,e=>{if(!(e instanceof M))throw Error(`cannot even on ${e.type}`);return e.value%2==0}],[`false`,e=>e.type===`BooleanValue`&&!e.value],[`true`,e=>e.type===`BooleanValue`&&e.value],[`none`,e=>e.type===`NullValue`],[`string`,e=>e.type===`StringValue`],[`number`,e=>e instanceof M||e instanceof N],[`integer`,e=>e instanceof M],[`iterable`,e=>e.type===`ArrayValue`||e.type===`StringValue`],[`mapping`,e=>e instanceof Ms],[`sequence`,e=>e instanceof I||e instanceof Ms||e instanceof P],[`lower`,e=>{let t=e.value;return e.type===`StringValue`&&t===t.toLowerCase()}],[`upper`,e=>{let t=e.value;return e.type===`StringValue`&&t===t.toUpperCase()}],[`none`,e=>e.type===`NullValue`],[`defined`,e=>e.type!==`UndefinedValue`],[`undefined`,e=>e.type===`UndefinedValue`],[`equalto`,(e,t)=>e.value===t.value],[`eq`,(e,t)=>e.value===t.value]]));function zs(e){e.set(`false`,!1),e.set(`true`,!0),e.set(`none`,null),e.set(`raise_exception`,e=>{throw Error(e)}),e.set(`range`,vs),e.set(`strftime_now`,xs),e.set(`True`,!0),e.set(`False`,!1),e.set(`None`,null)}function Bs(e){return e instanceof Ms||e instanceof Ps}function Vs(e){return e instanceof M||e instanceof N||e instanceof F}function Hs(e){return e instanceof F?Number(e.value):e.value}function Us(e,t){let n=t.split(`.`),r=e;for(let e of n)if(Bs(r))r=r.value.get(e)??new z;else if(r instanceof I){let t=parseInt(e,10);if(!isNaN(t)&&t>=0&&tr)}if(e.type!==t.type)throw Error(`Cannot compare different types: ${e.type} and ${t.type}`);switch(e.type){case`StringValue`:{let r=e.value,i=t.value;return n||(r=r.toLowerCase(),i=i.toLowerCase()),ri)}default:throw Error(`Cannot compare type: ${e.type}`)}}function Gs(e){if(e.type===`Identifier`)return{name:e.value};let t=e;return{name:t.key.value,defaultValue:t.value}}function Ks(e){return e===`kwargs`||e===`varargs`}function qs(e,t){let n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set,i=e=>{Ks(e)&&n.add(e)},a=e=>{if(e.type===`Identifier`)i(e.value);else if(e.type===`TupleLiteral`)for(let t of e.value)a(t)},o=e=>{i(Gs(e).name)},s=e=>{for(let t of e){let e=Gs(t);e.defaultValue&&l(e.defaultValue)}},c=e=>{e.type===`CallExpression`&&l(e.args)},l=e=>{if(Array.isArray(e)){for(let t of e)l(t);return}if(e instanceof Map){for(let[t,n]of e)l(t),l(n);return}if(e instanceof zo)switch(e.type){case`For`:{let t=e;if(a(t.loopvar),t.iterable.type===`SelectExpression`){let e=t.iterable;l(e.lhs),l(t.body),l(t.defaultBlock),l(e.test);return}l(t.iterable),l(t.body),l(t.defaultBlock);return}case`Set`:{let t=e;a(t.assignee),l(t.value),l(t.body);return}case`Macro`:{let t=e;for(let e of t.args)o(e);s(t.args),l(t.body);return}case`CallStatement`:{let t=e;l(t.call);for(let e of t.callerArgs??[])o(e);s(t.callerArgs??[]),l(t.body);return}case`FilterStatement`:{let t=e;l(t.body),c(t.filter);return}case`Identifier`:{let t=e.value;Ks(t)&&!n.has(t)&&r.add(t);return}case`MemberExpression`:{let t=e;l(t.object),t.computed&&l(t.property);return}case`FilterExpression`:{let t=e;l(t.operand),c(t.filter);return}case`TestExpression`:l(e.operand);return;case`SelectExpression`:{let t=e;l(t.test),l(t.lhs);return}case`KeywordArgumentExpression`:l(e.value);return;default:for(let t of Object.values(e))l(t)}};for(let t of e)o(t);return l(t),r}var Js=class{global;constructor(e){this.global=e??new Rs}run(e){return this.evaluate(e,this.global)}evaluateBinaryExpression(e,t){let n=this.evaluate(e.left,t);switch(e.operator.value){case`and`:return n.__bool__().value?this.evaluate(e.right,t):n;case`or`:return n.__bool__().value?n:this.evaluate(e.right,t)}let r=this.evaluate(e.right,t);switch(e.operator.value){case`==`:return new F(n.value==r.value);case`!=`:return new F(n.value!=r.value)}if(n instanceof z||r instanceof z){if(r instanceof z&&[`in`,`not in`].includes(e.operator.value))return new F(e.operator.value===`not in`);throw Error(`Cannot perform operation ${e.operator.value} on undefined values`)}if(n instanceof R||r instanceof R)throw Error(`Cannot perform operation on null values`);if(e.operator.value===`~`)return new P(n.value.toString()+r.value.toString());if(e.operator.value===`**`&&Vs(n)&&Vs(r)){let e=Hs(n),t=Hs(r);if(e===0&&t<0)throw Error(`0.0 cannot be raised to a negative power`);let i=e**t;if(!Number.isFinite(i))throw Error(`Exponentiation result is not a finite real number`);return n instanceof N||r instanceof N||t<0?new N(i):new M(i)}if((n instanceof M||n instanceof N)&&(r instanceof M||r instanceof N)){let t=n.value,i=r.value;switch(e.operator.value){case`+`:case`-`:case`*`:{let a=e.operator.value===`+`?t+i:e.operator.value===`-`?t-i:t*i;return n instanceof N||r instanceof N?new N(a):new M(a)}case`/`:return new N(t/i);case`//`:{let e=Math.floor(t/i);return n instanceof N||r instanceof N?new N(e):new M(e)}case`%`:{let e=t%i;return n instanceof N||r instanceof N?new N(e):new M(e)}case`<`:return new F(t`:return new F(t>i);case`>=`:return new F(t>=i);case`<=`:return new F(t<=i)}}else if(n instanceof I&&r instanceof I)switch(e.operator.value){case`+`:return new I(n.value.concat(r.value))}else if(r instanceof I){let t=r.value.find(e=>e.value===n.value)!==void 0;switch(e.operator.value){case`in`:return new F(t);case`not in`:return new F(!t)}}if(n instanceof P||r instanceof P)switch(e.operator.value){case`+`:return new P(n.value.toString()+r.value.toString())}if(n instanceof P&&r instanceof P)switch(e.operator.value){case`in`:return new F(r.value.includes(n.value));case`not in`:return new F(!r.value.includes(n.value))}if(n instanceof P&&r instanceof Ms)switch(e.operator.value){case`in`:return new F(r.value.has(n.value));case`not in`:return new F(!r.value.has(n.value))}throw SyntaxError(`Unknown operator "${e.operator.value}" between ${n.type} and ${r.type}`)}evaluateArguments(e,t){let n=[],r=/* @__PURE__ */ new Map,i=(e,t)=>{if(r.has(e))throw Error(`Got multiple values for keyword argument '${e}'`);r.set(e,t)};for(let r of e)if(r.type===`SpreadExpression`){let e=r,i=this.evaluate(e.argument,t);if(!(i instanceof I))throw Error(`Cannot unpack non-iterable type: ${i.type}`);for(let e of i.value)n.push(e)}else r.type!==`KeywordArgumentExpression`&&r.type!==`KeywordSpreadExpression`&&n.push(this.evaluate(r,t));for(let n of e)if(n.type===`KeywordArgumentExpression`){let e=n;i(e.key.value,this.evaluate(e.value,t))}else if(n.type===`KeywordSpreadExpression`){let e=n,r=this.evaluate(e.argument,t);if(!(r instanceof Ms))throw Error(`Argument after ** must be a mapping, not ${r.type}`);for(let[e,t]of r.value)i(e,t)}return[n,r]}applyFilter(e,t,n){if(t.type===`Identifier`){let r=t;if(r.value===`safe`)return e;if(r.value===`tojson`)return new P(js(e,{}));if(e instanceof I)switch(r.value){case`list`:return e;case`first`:return e.value[0];case`last`:return e.value[e.value.length-1];case`length`:return new M(e.value.length);case`reverse`:return new I(e.value.slice().reverse());case`sort`:return new I(e.value.slice().sort((e,t)=>Ws(e,t,!1)));case`join`:return new P(e.value.map(e=>e.value).join(``));case`string`:return new P(js(e,{},0,!1));case`unique`:{let t=/* @__PURE__ */ new Set,n=[];for(let r of e.value)t.has(r.value)||(t.add(r.value),n.push(r));return new I(n)}default:throw Error(`Unknown ArrayValue filter: ${r.value}`)}else if(e instanceof P)switch(r.value){case`length`:case`upper`:case`lower`:case`title`:case`capitalize`:{let t=e.builtins.get(r.value);if(t instanceof L)return t.value([],n);if(t instanceof M)return t;throw Error(`Unknown StringValue filter: ${r.value}`)}case`trim`:return new P(e.value.trim());case`indent`:return new P(e.value.split(` -`).map((e,t)=>t===0||e.length===0?e:` `+e).join(` -`));case`join`:case`string`:return e;case`int`:{let t=parseInt(e.value,10);return new M(isNaN(t)?0:t)}case`float`:{let t=parseFloat(e.value);return new N(isNaN(t)?0:t)}default:throw Error(`Unknown StringValue filter: ${r.value}`)}else if(e instanceof M||e instanceof N)switch(r.value){case`abs`:return e instanceof M?new M(Math.abs(e.value)):new N(Math.abs(e.value));case`int`:return new M(Math.floor(e.value));case`float`:return new N(e.value);case`string`:return new P(e.toString());default:throw Error(`Unknown NumericValue filter: ${r.value}`)}else if(e instanceof Ms)switch(r.value){case`items`:return new I(Array.from(e.value.entries()).map(([e,t])=>new I([new P(e),t])));case`length`:return new M(e.value.size);default:{let t=e.builtins.get(r.value);if(t)return t instanceof L?t.value([],n):t;throw Error(`Unknown ObjectValue filter: ${r.value}`)}}else if(e instanceof F)switch(r.value){case`bool`:return new F(e.value);case`int`:return new M(+!!e.value);case`float`:return new N(+!!e.value);case`string`:return new P(e.value?`true`:`false`);default:throw Error(`Unknown BooleanValue filter: ${r.value}`)}throw Error(`Cannot apply filter "${r.value}" to type: ${e.type}`)}if(t.type===`CallExpression`){let r=t;if(r.callee.type!==`Identifier`)throw Error(`Unknown filter: ${r.callee.type}`);let i=r.callee.value;if(i===`tojson`){let[,t]=this.evaluateArguments(r.args,n),i=t.get(`indent`)??new R;if(!(i instanceof M||i instanceof R))throw Error(`If set, indent must be a number`);let a=t.get(`ensure_ascii`)??new F(!1);if(!(a instanceof F))throw Error(`If set, ensure_ascii must be a boolean`);let o=t.get(`sort_keys`)??new F(!1);if(!(o instanceof F))throw Error(`If set, sort_keys must be a boolean`);let s=t.get(`separators`)??new R,c=null;if(s instanceof I||s instanceof Fs){if(s.value.length!==2)throw Error(`separators must be a tuple of two strings`);let[e,t]=s.value;if(!(e instanceof P)||!(t instanceof P))throw Error(`separators must be a tuple of two strings`);c=[e.value,t.value]}else if(!(s instanceof R))throw Error(`If set, separators must be a tuple of two strings`);return new P(js(e,{indent:i.value,ensureAscii:a.value,sortKeys:o.value,separators:c}))}if(i===`join`){let t;if(e instanceof P)t=Array.from(e.value);else if(e instanceof I)t=e.value.map(e=>e.value);else throw Error(`Cannot apply filter "${i}" to type: ${e.type}`);let[a,o]=this.evaluateArguments(r.args,n),s=a.at(0)??o.get(`separator`)??new P(``);if(!(s instanceof P))throw Error(`separator must be a string`);return new P(t.join(s.value))}if(i===`int`||i===`float`){let[t,a]=this.evaluateArguments(r.args,n),o=t.at(0)??a.get(`default`)??(i===`int`?new M(0):new N(0));if(e instanceof P){let t=i===`int`?parseInt(e.value,10):parseFloat(e.value);return isNaN(t)?o:i===`int`?new M(t):new N(t)}if(e instanceof M||e instanceof N)return e;if(e instanceof F)return i===`int`?new M(+!!e.value):new N(+!!e.value);throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}if(i==="default"){let[t,i]=this.evaluateArguments(r.args,n),a=t[0]??new P(``),o=t[1]??i.get(`boolean`)??new F(!1);if(!(o instanceof F))throw Error("`default` filter flag must be a boolean");return e instanceof z||o.value&&!e.__bool__().value?a:e}if(e instanceof I){switch(i){case`sort`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);let o=t.at(1)??i.get(`case_sensitive`)??new F(!1);if(!(o instanceof F))throw Error(`case_sensitive must be a boolean`);let s=t.at(2)??i.get(`attribute`)??new R;if(!(s instanceof P||s instanceof M||s instanceof R))throw Error(`attribute must be a string, integer, or null`);let c=e=>s instanceof R?e:Us(e,s instanceof M?String(s.value):s.value);return new I(e.value.slice().sort((e,t)=>{let n=Ws(c(e),c(t),o.value);return a.value?-n:n}))}case`selectattr`:case`rejectattr`:{let t=i===`selectattr`;if(e.value.some(e=>!Bs(e)))throw Error(`\`${i}\` can only be applied to array of objects`);if(r.args.some(e=>e.type!==`StringLiteral`))throw Error(`arguments of \`${i}\` must be strings`);let[a,o,s]=r.args.map(e=>this.evaluate(e,n)),c;if(o){let e=n.tests.get(o.value);if(!e)throw Error(`Unknown test: ${o.value}`);c=e}else c=(...e)=>e[0].__bool__().value;return new I(e.value.filter(e=>{let n=e.value.get(a.value),r=n?c(n,s):!1;return t?r:!r}))}case`map`:{let[,t]=this.evaluateArguments(r.args,n);if(t.has(`attribute`)){let n=t.get(`attribute`);if(!(n instanceof P))throw Error(`attribute must be a string`);let r=t.get(`default`);return new I(e.value.map(e=>{if(!Bs(e))throw Error(`items in map must be an object`);let t=Us(e,n.value);return t instanceof z?r??new z:t}))}throw Error("`map` expressions without `attribute` set are not currently supported.")}}throw Error(`Unknown ArrayValue filter: ${i}`)}if(e instanceof P){switch(i){case`indent`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`width`)??new M(4);if(!(a instanceof M))throw Error(`width must be a number`);let o=t.at(1)??i.get(`first`)??new F(!1),s=t.at(2)??i.get(`blank`)??new F(!1),c=e.value.split(` -`),l=` `.repeat(a.value);return new P(c.map((e,t)=>!o.value&&t===0||!s.value&&e.length===0?e:l+e).join(` -`))}case`replace`:{let t=e.builtins.get(`replace`);if(!(t instanceof L))throw Error(`replace filter not available`);let[i,a]=this.evaluateArguments(r.args,n);return t.value([...i,new Ns(a)],n)}}throw Error(`Unknown StringValue filter: ${i}`)}if(e instanceof Ms){let t=e.builtins.get(i);if(t&&t instanceof L){let[e,i]=this.evaluateArguments(r.args,n);return i.size>0&&e.push(new Ns(i)),t.value(e,n)}throw Error(`Unknown ObjectValue filter: ${i}`)}throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}throw Error(`Unknown filter: ${t.type}`)}evaluateFilterExpression(e,t){let n=this.evaluate(e.operand,t);return this.applyFilter(n,e.filter,t)}evaluateTestExpression(e,t){let n=this.evaluate(e.operand,t),r=t.tests.get(e.test.value);if(!r)throw Error(`Unknown test: ${e.test.value}`);let i=r(n);return new F(e.negate?!i:i)}evaluateSelectExpression(e,t){return this.evaluate(e.test,t).__bool__().value?this.evaluate(e.lhs,t):new z}evaluateUnaryExpression(e,t){let n=this.evaluate(e.argument,t);switch(e.operator.value){case`not`:return new F(!n.value);case`+`:case`-`:{let t=e.operator.value===`-`?-1:1;if(n instanceof M||n instanceof N||n instanceof F){let e=t*(n instanceof F?+!!n.value:n.value);return n instanceof N?new N(e):new M(e)}throw SyntaxError(`Unknown operator "${e.operator.value}" for ${n.type}`)}default:throw SyntaxError(`Unknown operator: ${e.operator.value}`)}}evaluateTernaryExpression(e,t){return this.evaluate(e.condition,t).__bool__().value?this.evaluate(e.trueExpr,t):this.evaluate(e.falseExpr,t)}evalProgram(e,t){return this.evaluateBlock(e.body,t)}evaluateBlock(e,t){let n=``;for(let r of e){let e=this.evaluate(r,t);e.type!==`NullValue`&&e.type!==`UndefinedValue`&&(n+=e.toString())}return new P(n)}evaluateIdentifier(e,t){return t.lookupVariable(e.value)}evaluateCallExpression(e,t){let[n,r]=this.evaluateArguments(e.args,t);r.size>0&&n.push(new Ns(r));let i=this.evaluate(e.callee,t);if(i.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${i.type}`);return i.value(n,t)}evaluateSliceExpression(e,t,n){if(!(e instanceof I||e instanceof P))throw Error(`Slice object must be an array or string`);let r=this.evaluate(t.start,n),i=this.evaluate(t.stop,n),a=this.evaluate(t.step,n);if(!(r instanceof M||r instanceof z))throw Error(`Slice start must be numeric or undefined`);if(!(i instanceof M||i instanceof z))throw Error(`Slice stop must be numeric or undefined`);if(!(a instanceof M||a instanceof z))throw Error(`Slice step must be numeric or undefined`);return e instanceof I?new I(ys(e.value,r.value,i.value,a.value)):new P(ys(Array.from(e.value),r.value,i.value,a.value).join(``))}evaluateMemberExpression(e,t){let n=this.evaluate(e.object,t),r;if(e.computed){if(e.property.type===`SliceExpression`)return this.evaluateSliceExpression(n,e.property,t);r=this.evaluate(e.property,t)}else r=e.property.type===`IntegerLiteral`?new M(e.property.value):new P(e.property.value);let i;if(Bs(n)){if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.value.get(r.value)??(n instanceof Ms?n.builtins.get(r.value):void 0)}else if(n instanceof I||n instanceof P){if(r instanceof M)i=n.value.at(r.value),n instanceof P&&(i=new P(n.value.at(r.value)));else if(r instanceof P)i=n.builtins.get(r.value);else throw Error(`Cannot access property with non-string/non-number: got ${r.type}`)}else{if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.builtins.get(r.value)}return i instanceof Os?i:new z}evaluateSet(e,t){let n=e.value?this.evaluate(e.value,t):this.evaluateBlock(e.body,t);if(e.assignee.type===`Identifier`){let r=e.assignee.value;t.setVariable(r,n)}else if(e.assignee.type===`TupleLiteral`){let r=e.assignee;if(!(n instanceof I))throw Error(`Cannot unpack non-iterable type in set: ${n.type}`);let i=n.value;if(i.length!==r.value.length)throw Error(`Too ${r.value.length>i.length?`few`:`many`} items to unpack in set`);for(let e=0;et.setVariable(e.loopvar.value,c);else if(e.loopvar.type===`TupleLiteral`){let t=e.loopvar;if(c.type!==`ArrayValue`)throw Error(`Cannot unpack non-iterable type: ${c.type}`);let n=c;if(t.value.length!==n.value.length)throw Error(`Too ${t.value.length>n.value.length?`few`:`many`} items to unpack`);l=e=>{for(let r=0;r0?a[t-1]:new z],[`nextitem`,t0)throw Error(`macro ${e} takes no keyword argument '${o.keys().next().value}'`);if(n.has(`varargs`))i.setVariable(`varargs`,new I(a.slice(t.length)));else if(a.length>t.length)throw Error(`macro ${e} takes not more than ${t.length} argument(s)`);for(let[e,t]of s)i.setVariable(e,this.evaluate(t,i))}evaluateMacro(e,t){let n=qs(e.args,e.body);return t.setVariable(e.name.value,new L((t,r)=>{let i=new Rs(r);return this.bindMacroArguments(`'${e.name.value}'`,e.args,n,t,i),this.evaluateBlock(e.body,i)})),new R}evaluateCallStatement(e,t){let n=e.callerArgs??[],r=qs(n,e.body),i=new L(i=>{let a=new Rs(t);return this.bindMacroArguments(`None`,n,r,i,a),this.evaluateBlock(e.body,a)}),[a,o]=this.evaluateArguments(e.call.args,t);a.push(new Ns(o));let s=this.evaluate(e.call.callee,t);if(s.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${s.type}`);let c=new Rs(t);return c.setVariable(`caller`,i),s.value(a,c)}evaluateFilterStatement(e,t){let n=this.evaluateBlock(e.body,t);return this.applyFilter(n,e.filter,t)}evaluate(e,t){if(!e)return new z;switch(e.type){case`Program`:return this.evalProgram(e,t);case`Set`:return this.evaluateSet(e,t);case`If`:return this.evaluateIf(e,t);case`For`:return this.evaluateFor(e,t);case`Macro`:return this.evaluateMacro(e,t);case`CallStatement`:return this.evaluateCallStatement(e,t);case`Break`:throw new Ts;case`Continue`:throw new Es;case`IntegerLiteral`:return new M(e.value);case`FloatLiteral`:return new N(e.value);case`StringLiteral`:return new P(e.value);case`ArrayLiteral`:return new I(e.value.map(e=>this.evaluate(e,t)));case`TupleLiteral`:return new Fs(e.value.map(e=>this.evaluate(e,t)));case`ObjectLiteral`:{let n=/* @__PURE__ */ new Map;for(let[r,i]of e.value){let e=this.evaluate(r,t);if(!(e instanceof P))throw Error(`Object keys must be strings: got ${e.type}`);n.set(e.value,this.evaluate(i,t))}return new Ms(n)}case`Identifier`:return this.evaluateIdentifier(e,t);case`CallExpression`:return this.evaluateCallExpression(e,t);case`MemberExpression`:return this.evaluateMemberExpression(e,t);case`UnaryExpression`:return this.evaluateUnaryExpression(e,t);case`BinaryExpression`:return this.evaluateBinaryExpression(e,t);case`FilterExpression`:return this.evaluateFilterExpression(e,t);case`FilterStatement`:return this.evaluateFilterStatement(e,t);case`TestExpression`:return this.evaluateTestExpression(e,t);case`SelectExpression`:return this.evaluateSelectExpression(e,t);case`Ternary`:return this.evaluateTernaryExpression(e,t);case`Comment`:return new R;default:throw SyntaxError(`Unknown node type: ${e.type}`)}}};function Ys(e){switch(typeof e){case`number`:return Number.isInteger(e)?new M(e):new N(e);case`string`:return new P(e);case`boolean`:return new F(e);case`undefined`:return new z;case`object`:return e===null?new R:Array.isArray(e)?new I(e.map(Ys)):new Ms(new Map(Object.entries(e).map(([e,t])=>[e,Ys(t)])));case`function`:return new L((t,n)=>Ys(e(...t.map(e=>e.value))??null));default:throw Error(`Cannot convert to runtime value: ${e}`)}}var Xs=` -`,Zs=`{%- `,Qs=` -%}`,$s=Object.freeze({CONDITIONAL:0,LOGICAL_OR:1,LOGICAL_AND:2,LOGICAL_NOT:3,COMPARISON:4,ADDITIVE:5,MULTIPLICATIVE:6,EXPONENTIATION:7,TEST:8,FILTER:9,UNARY_SIGN:10,ATOM:11});function ec(e){switch(e.operator.type){case`ExponentiationBinaryOperator`:return $s.EXPONENTIATION;case`MultiplicativeBinaryOperator`:return $s.MULTIPLICATIVE;case`AdditiveBinaryOperator`:return $s.ADDITIVE;case`ComparisonBinaryOperator`:return $s.COMPARISON;case`Identifier`:return e.operator.value===`and`?$s.LOGICAL_AND:e.operator.value===`in`||e.operator.value===`not in`?$s.COMPARISON:$s.LOGICAL_OR}return $s.LOGICAL_OR}function tc(e){switch(e.type){case`SelectExpression`:case`Ternary`:return $s.CONDITIONAL;case`BinaryExpression`:return ec(e);case`UnaryExpression`:return e.operator.value===`not`?$s.LOGICAL_NOT:$s.UNARY_SIGN;case`TestExpression`:return $s.TEST;case`FilterExpression`:return $s.FILTER;default:return $s.ATOM}}function nc(e,t){let n=B(e);return tc(e)sc(e,t,n)).join(Xs)}function oc(e){return e.map(e=>B(e)).join(`, `)}function sc(e,t,n){let r=n.repeat(t);switch(e.type){case`Program`:return ac(e.body,t,n);case`If`:return cc(e,t,n);case`For`:return lc(e,t,n);case`Set`:return uc(e,t,n);case`Macro`:return dc(e,t,n);case`Break`:return r+ic(`break`);case`Continue`:return r+ic(`continue`);case`CallStatement`:return fc(e,t,n);case`FilterStatement`:return pc(e,t,n);case`Comment`:return r+`{# `+e.value+` #}`;default:return r+`{{- `+B(e)+` -}}`}}function cc(e,t,n){let r=n.repeat(t),i=[],a=e;for(;a&&(i.push({test:a.test,body:a.body}),a.alternate.length===1&&a.alternate[0].type===`If`);)a=a.alternate[0];let o=r+ic(`if`,B(i[0].test))+Xs+ac(i[0].body,t+1,n);for(let e=1;e0&&(o+=Xs+r+ic(`else`)+Xs+ac(a.alternate,t+1,n)),o+=Xs+r+ic(`endif`),o}function lc(e,t,n){let r=n.repeat(t),i=``;if(e.iterable.type===`SelectExpression`){let t=e.iterable;i=`${B(t.lhs)} if ${B(t.test)}`}else i=B(e.iterable);let a=r+ic(`for`,B(e.loopvar),`in`,i)+Xs+ac(e.body,t+1,n);return e.defaultBlock.length>0&&(a+=Xs+r+ic(`else`)+Xs+ac(e.defaultBlock,t+1,n)),a+=Xs+r+ic(`endfor`),a}function uc(e,t,n){let r=n.repeat(t),i=B(e.assignee),a=e.value?B(e.value):``,o=r+ic(`set`,`${i}${e.value?` = `+a:``}`);return e.body.length===0?o:o+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endset`)}function dc(e,t,n){let r=n.repeat(t),i=oc(e.args);return r+ic(`macro`,`${e.name.value}(${i})`)+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endmacro`)}function fc(e,t,n){let r=n.repeat(t),i=e.callerArgs&&e.callerArgs.length>0?`(${oc(e.callerArgs)})`:``,a=B(e.call),o=r+ic(`call${i}`,a)+Xs;return o+=ac(e.body,t+1,n)+Xs,o+=r+ic(`endcall`),o}function pc(e,t,n){let r=n.repeat(t),i=r+ic(`filter`,e.filter.type===`Identifier`?e.filter.value:B(e.filter))+Xs;return i+=ac(e.body,t+1,n)+Xs,i+=r+ic(`endfilter`),i}function B(e){switch(e.type){case`SpreadExpression`:return`*${B(e.argument)}`;case`KeywordSpreadExpression`:return`**${B(e.argument)}`;case`Identifier`:return e.value;case`IntegerLiteral`:return`${e.value}`;case`FloatLiteral`:{let t=e.value;return Object.is(t,-0)?`-0.0`:t%1==0?t.toFixed(1):t.toString()}case`StringLiteral`:return JSON.stringify(e.value);case`BinaryExpression`:{let t=e,n=ec(t),r=nc(t.left,n),i=nc(t.right,n+1);return`${r} ${t.operator.value} ${i}`}case`UnaryExpression`:{let t=e,n=t.argument.type===`UnaryExpression`?tc(t):$s.ATOM;return t.operator.value+(t.operator.value===`not`?` `:``)+nc(t.argument,n)}case`CallExpression`:{let t=e,n=oc(t.args);return`${B(t.callee)}(${n})`}case`MemberExpression`:{let t=e,n=nc(t.object,$s.ATOM),r=B(t.property);return!t.computed&&t.property.type!==`Identifier`&&t.property.type!==`IntegerLiteral`&&(r=`(${r})`),t.computed?`${n}[${r}]`:`${n}.${r}`}case`FilterExpression`:{let t=e,n=nc(t.operand,$s.FILTER);return t.filter.type===`CallExpression`?`${n} | ${B(t.filter)}`:`${n} | ${t.filter.value}`}case`SelectExpression`:{let t=e;return`${nc(t.lhs,$s.LOGICAL_OR)} if ${nc(t.test,$s.LOGICAL_OR)}`}case`TestExpression`:{let t=e;return`${nc(t.operand,$s.TEST)} is${t.negate?` not`:``} ${t.test.value}`}case`ArrayLiteral`:case`TupleLiteral`:{let t=oc(e.value),n=e.type===`ArrayLiteral`?`[]`:`()`;return`${n[0]}${t}${n[1]}`}case`ObjectLiteral`:return`{${Array.from(e.value.entries()).map(([e,t])=>`${B(e)}: ${B(t)}`).join(`, `)}}`;case`SliceExpression`:{let t=e;return`${t.start?B(t.start):``}:${t.stop?B(t.stop):``}${t.step?`:${B(t.step)}`:``}`}case`KeywordArgumentExpression`:{let t=e;return`${t.key.value}=${B(t.value)}`}case`Ternary`:{let t=e;return`${nc(t.trueExpr,$s.LOGICAL_OR)} if ${nc(t.condition,$s.LOGICAL_OR)} else ${nc(t.falseExpr,$s.CONDITIONAL)}`}default:throw Error(`Unknown expression type: ${e.type}`)}}var mc=class{parsed;constructor(e){let t=Ro(e,{lstrip_blocks:!0,trim_blocks:!0});this.parsed=_s(t)}render(e){let t=new Rs;if(zs(t),e)for(let[n,r]of Object.entries(e))t.set(n,r);return new Js(t).run(this.parsed).value}format(e){return rc(this.parsed,e?.indent||` `)}},hc={txt:`text/plain`,html:`text/html`,css:`text/css`,js:`text/javascript`,json:`application/json`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`},gc=class e{constructor(e){if(this.filePath=e,this.headers=new Headers,this.exists=Cr.existsSync(e),this.exists){this.status=200,this.statusText=`OK`;let t=Cr.statSync(e);this.headers.set(`content-length`,t.size.toString()),this.updateContentType();let n=Cr.createReadStream(e);this.body=new ReadableStream({start(e){n.on(`data`,t=>e.enqueue(t)),n.on(`end`,()=>e.close()),n.on(`error`,t=>e.error(t))},cancel(){n.destroy()}})}else this.status=404,this.statusText=`Not Found`,this.body=null}updateContentType(){let e=this.filePath.toString().split(`.`).pop().toLowerCase();this.headers.set(`content-type`,hc[e]??`application/octet-stream`)}clone(){let t=new e(this.filePath);return t.exists=this.exists,t.status=this.status,t.statusText=this.statusText,t.headers=new Headers(this.headers),t}async arrayBuffer(){return(await Cr.promises.readFile(this.filePath)).buffer}async blob(){let e=await Cr.promises.readFile(this.filePath);return new Blob([e],{type:this.headers.get(`content-type`)})}async text(){return await Cr.promises.readFile(this.filePath,`utf8`)}async json(){return JSON.parse(await this.text())}},_c=class{constructor(e){this._mt=/* @__PURE__ */ new Uint32Array(624),this._idx=625,this._gauss_next=null,this._random_fn=this.random.bind(this),this.seed(e)}seed(e){if(e==null){if(O.IS_CRYPTO_AVAILABLE){let t=/* @__PURE__ */ new Uint32Array(1);crypto.getRandomValues(t),e=t[0]}else e=Date.now()>>>0}let t=this._mt,n=(e,t)=>Math.imul(e,t)>>>0,r=[];for(let t=e||0;t>0;t=Math.floor(t/4294967296))r.push(t&4294967295);r.length||r.push(0),t[0]=19650218;for(let e=1;e<624;++e)t[e]=n(1812433253,t[e-1]^t[e-1]>>>30)+e>>>0;let i=1,a=0;for(let e=Math.max(624,r.length);e>0;--e,++i,++a)i>=624&&(t[0]=t[623],i=1),a>=r.length&&(a=0),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1664525))+r[a]+a>>>0;for(let e=623;e>0;--e,++i)i>=624&&(t[0]=t[623],i=1),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1566083941))-i>>>0;t[0]=2147483648,this._idx=624,this._gauss_next=null}_int32(){let e=this._mt;if(this._idx>=624){for(let t=0;t<624;++t){let n=e[t]&2147483648|e[(t+1)%624]&2147483647;e[t]=(e[(t+397)%624]^n>>>1^(n&1?2567483615:0))>>>0}this._idx=0}let t=e[this._idx++];return t^=t>>>11,t^=t<<7&2636928640,t^=t<<15&4022730752,t^=t>>>18,t>>>0}random(){return((this._int32()>>>5)*67108864+(this._int32()>>>6))/9007199254740992}gauss(e=0,t=1){let n=this._gauss_next;if(this._gauss_next=null,n===null){let e=this.random()*2*Math.PI,t=Math.sqrt(-2*Math.log(1-this.random()));n=Math.cos(e)*t,this._gauss_next=Math.sin(e)*t}return e+n*t}shuffle(e){for(let t=e.length-1;t>0;--t){let n=32-Math.clz32(t+1),r=this._int32()>>>32-n;for(;r>t;)r=this._int32()>>>32-n;let i=e[t];e[t]=e[r],e[r]=i}}choices(e,t){return e[vc(this._random_fn,t)]}};function vc(e,t){let n=0;for(let e=0;evc(bc.random,e),Sc=new _c,Cc=class{constructor(e){this.path=e}async match(e){let t=new gc(wr.join(this.path,e));if(t.exists)return t}async put(e,t,n=void 0){let r=wr.join(this.path,e),i=r+`.tmp.${O.IS_PROCESS_AVAILABLE?process.pid:Date.now()}.${Sc._int32().toString(36)}`;try{let e=t.headers.get(`Content-Length`),a=parseInt(e??`0`),o=0;await Cr.promises.mkdir(wr.dirname(r),{recursive:!0});let s=Cr.createWriteStream(i),c=t.body.getReader();for(;;){let{done:e,value:t}=await c.read();if(e)break;await new Promise((e,n)=>{s.write(t,t=>{if(t){n(t);return}e()})}),o+=t.length;let r=a?o/a*100:0;n?.({progress:r,loaded:o,total:a})}await new Promise((e,t)=>{s.close(n=>n?t(n):e())}),await Cr.promises.rename(i,r)}catch(e){try{await Cr.promises.unlink(i)}catch{}throw e}}async delete(e){let t=wr.join(this.path,e);try{return await Cr.promises.unlink(t),!0}catch{return!1}}},wc={400:`Bad request error occurred while trying to load file`,401:`Unauthorized access to file`,403:`Forbidden access to file`,404:`Could not locate file`,408:`Request timeout error occurred while trying to load file`,500:`Internal server error error occurred while trying to load file`,502:`Bad gateway error occurred while trying to load file`,503:`Service unavailable error occurred while trying to load file`,504:`Gateway timeout error occurred while trying to load file`},Tc=100,Ec=/^(\b[\w\-.]+\b\/)?\b[\w\-.]{1,96}\b$/;function Dc(...e){return e=e.map((t,n)=>(n&&(t=t.replace(/* @__PURE__ */ RegExp(`^/`),``)),n!==e.length-1&&(t=t.replace(/* @__PURE__ */ RegExp(`/$`),``)),t)),e.join(`/`)}function Oc(e,t=null,n=null){let r;try{r=new URL(e)}catch{return!1}return!(t&&!t.includes(r.protocol)||n&&!n.includes(r.hostname))}function kc(e){return!(!Ec.test(e)||e.includes(`..`)||e.includes(`--`)||e.endsWith(`.git`)||e.endsWith(`.ipynb`))}function Ac(e,t={},...n){return JSON.stringify([e,t.revision??`main`,t.cache_dir??null,t.local_files_only??!1,...n])}var jc=class extends Error{constructor(e,{status:t=null}={}){super(e),this.name=`ModelFileNotFoundError`,this.status=t}},Mc=/* @__PURE__ */ new Set([401,403,404]);function Nc(e,t,n){if(!n)return null;let r=`${wc[e]??`Error (${e}) occurred while trying to load file`}: "${t}".`;throw Mc.has(e)?new jc(r,{status:e}):Error(r)}async function Pc(e,t,n){let r=e.headers.get(`Content-Length`),i=r?parseInt(r,10):n??0;r===null&&!n&&A.warn(`Unable to determine content-length from response headers. Will expand buffer when needed.`);let a=new Uint8Array(i),o=0,s=e.body.getReader();async function c(){let{done:e,value:n}=await s.read();if(e)return;let r=o+n.length;if(r>i){i=r;let e=new Uint8Array(i);e.set(a),a=e}return a.set(n,o),o=r,t({progress:o/i*100,loaded:o,total:i}),c()}return await c(),a}function Fc(e){return Oc(e,[`blob:`])}function Ic(e,{allowUnresolved:t=!1}={}){let n;if(typeof location<`u`&&location.href)n=location.href;else if(import.meta.url)n=import.meta.url;else return e;try{return new URL(e,n).href}catch(n){if(!t)throw n;return e}}var Lc=`SHA-256`,Rc=`experimental_transformers-hash-cache`,zc=e=>({algorithm:Lc,value:e}),Bc=class{#e=null;_getHashCache=()=>(this.#e??=caches.open(Rc),this.#e);static isAvailable=()=>typeof navigator<`u`&&`crossOriginStorage`in navigator;match=async e=>{let t=await this._getFileHash(e);if(t)try{let e=await(await navigator.crossOriginStorage.requestFileHandle(zc(t))).getFile();return new Response(e,{headers:{"Content-Length":String(e.size)}})}catch{return}};put=async(e,t)=>{let n=await this._getFileHash(e);if(n){let e=await t.blob();await this._storeBlobInCOS(e,n)}else this._processAndStore(e,t.body)};_storeBlobInCOS=async(e,t)=>{let n=await(await navigator.crossOriginStorage.requestFileHandle(zc(t),{create:!0,origins:`*`})).createWritable();await n.write(e),await n.close()};_processAndStore=async(e,t)=>{try{let n=[];for await(let e of t)n.push(e);let r=new Blob(n),i=await this._getBlobHash(r);await this._storeBlobInCOS(r,i);try{await(await this._getHashCache()).put(e,new Response(i))}catch{}}catch{}};delete=async e=>{try{return await(await this._getHashCache()).delete(e)}catch{return!1}};_getFileHash=async e=>{try{let t=await this._getHashCache(),n=await t.match(e);if(n)return n.text();let r=await this._getLfsFileHash(e);return r?(await t.put(e,new Response(r)),r):null}catch{return null}};_getLfsFileHash=async e=>{if(!e.includes(`/resolve/`))return null;let t=e.replace(`/resolve/`,`/raw/`);try{let e=(await fetch(t).then(e=>e.text())).match(/^oid sha256:([0-9a-f]+)$/m);return e?e[1]:null}catch{return null}};_getBlobHash=async e=>{let t=await e.arrayBuffer(),n=await crypto.subtle.digest(Lc,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}};async function Vc(e=null){let t=null;if(k.useCustomCache){if(!k.customCache)throw Error("`env.useCustomCache=true`, but `env.customCache` is not defined.");if(!k.customCache.match||!k.customCache.put)throw Error("`env.customCache` must be an object which implements the `match` and `put` functions of the Web Cache API. For more information, see https://developer.mozilla.org/en-US/docs/Web/API/Cache");t=k.customCache}if(!t&&k.experimental_useCrossOriginStorage&&Bc.isAvailable()&&(t=new Bc),!t&&k.useBrowserCache){if(typeof caches>`u`)throw Error(`Browser cache is not available in this environment.`);try{t=await caches.open(k.cacheKey)}catch(e){A.warn(`An error occurred while opening the browser cache:`,e)}}if(!t&&k.useFSCache){if(!O.IS_FS_AVAILABLE)throw Error(`File System Cache is not available in this environment.`);t=new Cc(e??k.cacheDir)}return t}async function Hc(e,...t){for(let n of t)try{let t=await e.match(n);if(t)return t}catch{continue}}var Uc=new class{#e;#t;constructor(e){this.#e=e,this.#t=/* @__PURE__ */ new Map}get(e){if(!this.#t.has(e))return;let t=this.#t.get(e);return this.#t.delete(e),this.#t.set(e,t),t}put(e,t){this.#t.has(e)&&this.#t.delete(e),this.#t.set(e,t),this.#t.size>this.#e&&this.#t.delete(this.#t.keys().next().value)}delete(e){return this.#t.delete(e)}clear(){this.#t.clear()}}(100);function Wc(e,t){let n=Uc.get(e);if(n!==void 0)return n;let r=t().then(e=>e,t=>(Uc.delete(e),Promise.reject(t)));return Uc.put(e,r),r}async function Gc(e){if(!Oc(e,[`http:`,`https:`]))return null;let t=Yc(e);return t.set(`Range`,`bytes=0-0`),k.fetch(e,{method:`GET`,headers:t,cache:`no-store`})}function Kc(e,t,n={}){return Wc(Ac(e,n,t),()=>qc(e,t,n))}async function qc(e,t,n){let r=await Vc(n?.cache_dir),{localPath:i,remoteURL:a,proposedCacheKey:o,validModelId:s}=Xc(e,t,n,r),c=await Zc(r,i,o);if(c!==void 0&&typeof c!=`string`){let e=c.headers.get(`content-length`),t=c.headers.get(`content-type`);return{exists:!0,size:e?parseInt(e,10):void 0,contentType:t||void 0,fromCache:!0}}if(k.allowLocalModels&&!Oc(i,[`http:`,`https:`]))try{let e=await Jc(i);if(typeof e!=`string`&&e.status!==404){let t=e.headers.get(`content-length`),n=e.headers.get(`content-type`);return{exists:!0,size:t?parseInt(t,10):void 0,contentType:n||void 0,fromCache:!1}}}catch{}if(k.allowRemoteModels&&!n.local_files_only&&s){let e=await Gc(a);if(e&&e.status>=200&&e.status<300){let t,n=e.headers.get(`content-type`);if(e.status===206){let n=e.headers.get(`content-range`);if(n){let e=n.match(/bytes \d+-\d+\/(\d+)/);e&&(t=parseInt(e[1],10))}}else if(e.status===200)try{await e.body?.cancel()}catch{}if(t===void 0){let n=e.headers.get(`content-length`);t=n?parseInt(n,10):void 0}return{exists:!0,size:t,contentType:n||void 0,fromCache:!1}}e&&e.status!==404&&e.status!==416&&Nc(e.status,a,!0)}return{exists:!1,fromCache:!1}}async function Jc(e){return k.useFS&&!Oc(e,[`http:`,`https:`,`blob:`])?new gc(e instanceof URL?e.protocol===`file:`?e.pathname:e.toString():e):k.fetch(e,{headers:Yc(e)})}function Yc(e){let t=typeof process<`u`&&process?.release?.name===`node`,n=new Headers;if(t){let t=!!{}.TESTING_REMOTELY,r=k.version;if(n.set(`User-Agent`,`transformers.js/${r}; is_ci/${t};`),Oc(e,[`http:`,`https:`],[`huggingface.co`,`hf.co`])){let e={}.HF_TOKEN??{}.HF_ACCESS_TOKEN;e&&n.set(`Authorization`,`Bearer ${e}`)}}return n}function Xc(e,t,n={},r=null){let i=n.revision??`main`,a=Dc(e,t),o=kc(e),s=o?Dc(k.localModelPath,a):a,c=Dc(k.remoteHost,k.remotePathTemplate.replaceAll(`{model}`,e).replaceAll(`{revision}`,encodeURIComponent(i)),t);return{requestURL:a,localPath:s,remoteURL:c,proposedCacheKey:r instanceof Cc?i===`main`?a:Dc(e,i,t):c,validModelId:o}}async function Zc(e,t,n){if(e)return await Hc(e,t,n)}async function Qc(e,t,n,r,i,a,o={}){if(await n.match(r)===void 0&&!(typeof Cache<`u`&&n instanceof Cache&&!Oc(Ic(r,{allowUnresolved:!0}),[`http:`,`https:`]))){if(!a){let a=o.progress_callback?n=>ei(o.progress_callback,{status:`progress`,name:e,file:t,...n}):void 0;await n.put(r,i,a)}else if(typeof i!=`string`){let e=new Headers(i.headers);e.set(`content-length`,a.byteLength.toString()),await n.put(r,new Response(a,{headers:e})).catch(e=>{A.warn(`Unable to add response to browser cache: ${e}.`)})}}}async function $c(e,t,n=!0,r={},i=!1,a=null){let{requestURL:o,localPath:s,remoteURL:c,proposedCacheKey:l,validModelId:u}=Xc(e,t,r,a),d,f=!1,p;p=await Zc(a,s,l);let m=p!==void 0;if(m)d=l;else{if(k.allowLocalModels){if(!Oc(o,[`http:`,`https:`]))try{p=await Jc(s),d=s}catch(e){A.warn(`Unable to load from local path "${s}": "${e}"`)}else if(r.local_files_only)throw Error(`\`local_files_only=true\`, but attempted to load a remote file from: ${o}.`);else if(!k.allowRemoteModels)throw Error(`\`env.allowRemoteModels=false\`, but attempted to load a remote file from: ${o}.`)}if(p===void 0||typeof p!=`string`&&p.status===404){if(r.local_files_only||!k.allowRemoteModels){if(n)throw new jc(`\`local_files_only=true\` or \`env.allowRemoteModels=false\` and file was not found locally at "${s}".`);return null}if(!u)throw new jc(`Local file missing at "${s}" and download aborted due to invalid model ID "${e}".`);if(p=await Jc(c),p.status!==200)return Nc(p.status,c,n);d=l}f=a&&typeof Response<`u`&&p instanceof Response&&p.status===200}ei(r.progress_callback,{status:`download`,name:e,file:t});let h;if(!(O.IS_NODE_ENV&&i)){let n;if(typeof p!=`string`){if(!r.progress_callback)n=new Uint8Array(await p.arrayBuffer());else if(m&&typeof navigator<`u`&&/firefox/i.test(navigator.userAgent))n=new Uint8Array(await p.arrayBuffer()),ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n.length,total:n.length});else{let i,a=p.headers.get(`content-length`);if(a)i=parseInt(a,10);else try{let n=await Kc(e,t,r);n.size&&(i=n.size)}catch{}n=await Pc(p,n=>{ei(r.progress_callback,{status:`progress`,name:e,file:t,...n})},i)}}h=n}if(f&&d&&typeof p!=`string`&&await Qc(e,t,a,d,p,h,r),O.IS_NODE_ENV&&i&&r.progress_callback&&typeof p!=`string`){let n=parseInt(p.headers.get(`content-length`),10)||0;ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n,total:n})}if(ei(r.progress_callback,{status:`done`,name:e,file:t}),h){if(!O.IS_NODE_ENV&&i)throw Error(`Cannot return path in a browser environment.`);return h}if(p instanceof gc)return p.filePath;let g=await a?.match(d);if(g instanceof gc)return g.filePath;if(g instanceof Response)return new Uint8Array(await g.arrayBuffer());if(typeof g==`string`)return g;throw Error(`Unable to get model file path or buffer.`)}var el=/* @__PURE__ */ new Map;async function tl(e,t,n=!0,r={},i=!1){if(!k.allowLocalModels){if(r.local_files_only)throw Error("Invalid configuration detected: local models are disabled (`env.allowLocalModels=false`) but you have requested to only use local models (`local_files_only=true`).");if(!k.allowRemoteModels)throw Error("Invalid configuration detected: both local and remote models are disabled. Fix by setting `env.allowLocalModels` or `env.allowRemoteModels` to `true`.")}let a=Ac(e,r,t,n,i),{progress_callback:o}=r,s=o instanceof ti?o.loads:el,c=s.get(a);return c||(ei(o,{status:`initiate`,name:e,file:t}),c=Vc(r.cache_dir).then(a=>$c(e,t,n,r,i,a)),s===el&&(c=c.finally(()=>el.delete(a))),s.set(a,c)),await c}async function nl(e,t,n=!0,r={}){let i=await tl(e,t,n,r,!1);return i===null?null:new TextDecoder(`utf-8`).decode(i)}async function rl(e,t,n=!0,r={}){let i=await nl(e,t,n,r);return i===null?{}:JSON.parse(i)}function il(e,[t,n,r],[i,a],o=`bilinear`,s=!1){let c=a/r,l=i/n,u=new e.constructor(i*a*t),d=n*r,f=i*a;for(let o=0;o=0;--e)i[e]=a,r[e]=t[n[e]],a*=r[e];let a=n.map((e,t)=>i[n.indexOf(t)]),o=new e.constructor(e.length);for(let n=0;n=0;--e)r+=i%t[e]*a[e],i=Math.floor(i/t[e]);o[r]=e[n]}return[o,r]}function ol(e){let t=ll(e)[0],n=e.map(e=>Math.exp(e-t)),r=n.reduce((e,t)=>e+t,0);return n.map(e=>e/r)}function sl(e){let t=ll(e)[0],n=0;for(let r=0;re-t-r)}function cl(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;rt&&(t=e[r],n=r);return[t,n]}function ul(e){return e>0&&!(e&e-1)}var dl=class{constructor(e){if(this.size=e|0,this.size<=1||!ul(this.size))throw Error(`FFT size must be a power of two larger than 1`);this._csize=e<<1,this.table=new Float64Array(this.size*2);for(let e=0;ee;e<<=1)++t;this._width=t%2==0?t-1:t,this._bitrev=new Int32Array(1<>>t&3)<>>1);for(let t=0;t>>1]=e[t];return n}toComplexArray(e,t){let n=t||this.createComplexArray();for(let t=0;t>>1],n[t+1]=0;return n}transform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,1)}realTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._realTransform4(e,t,1)}inverseTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,-1);for(let t=0;t>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>2;for(o=0;o>>1,i>>>1)}else for(o=0,s=0;o>>1,i>>>1,n)}let l=this.table;for(i>>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>1,s=t>>>1,c=s>>>1;for(o=0;o>>1;for(let t=2;t>1;++t){let n=(t+1-e)**2/2,r=Math.sqrt(s**2+c**2)**n,o=n*Math.atan2(c,s),l=2*t;i[l]=r*Math.cos(o),i[l+1]=r*Math.sin(o),a[l]=i[l],a[l+1]=-i[l+1]}this._slicedChirpBuffer=i.subarray(t,n),this._f=new dl(r>>1),this._f.transform(this._chirpBuffer,a)}_transform(e,t,n){let r=this._buffer1,i=this._buffer2,a=this._outBuffer1,o=this._outBuffer2,s=this._chirpBuffer,c=this._slicedChirpBuffer,l=this._a;if(n)for(let e=0;e>1];r[e]=i*c[e],r[n]=i*c[n]}else for(let e=0;e=e.length&&(i=2*(e.length-1)-i),r[a++]=e[i]}r.sort(),n[t]=r[i]}return n}function hl(e,t){let n=10**t;return Math.round(e*n)/n}function gl(e){let t=Math.round(e);return Math.abs(e)%1==.5?t%2==0?t:t-1:t}function _l(e){let t=e.length,n=e[0].length,r=[t+1,n+1],i=Array.from({length:r[0]},()=>Array(r[1]).fill(1/0));i[0][0]=0;let a=Array.from({length:r[0]},()=>Array(r[1]).fill(-1));for(let t=1;t0||s>0;)switch(c.push(o-1),l.push(s-1),a[o][s]){case 0:--o,--s;break;case 1:--o;break;case 2:--s;break;default:throw Error(`Internal error in dynamic time warping. Unexpected trace[${o}, ${s}]. Please file a bug report.`)}return c.reverse(),l.reverse(),[c,l]}var vl=/* @__PURE__ */ (function(){let e=null;return function(t){if(!e){e=/* @__PURE__ */ new Float32Array(65536);let t=/* @__PURE__ */ new ArrayBuffer(4),n=new Uint32Array(t),r=new Float32Array(t);for(let t=0;t>10,s=t&1023;if(o===31)i=a|2139095040|s<<13;else if(o===0){if(s===0)i=a;else{let e=113;for(;!(s&1024);)s<<=1,--e;s&=-1025,i=a|e<<23|s<<13}}else i=a|o+112<<23|s<<13;n[0]=i,e[t]=r[0]}}let n=t.length,r=e,i=new Float32Array(n);for(let e=0;e[`webgpu`,`cuda`,`dml`,`webnn-gpu`].includes(e))}if(El.includes(e))return[Cl[e]??e];throw Error(`Unsupported device: "${e}". Should be one of: ${El.join(`, `)}.`)}var Ml=Promise.resolve(),Nl=null;async function Pl(){if(Nl)return Nl;if(!(k.useWasmCache&&typeof zl?.wasm?.wasmPaths==`object`&&zl?.wasm?.wasmPaths?.wasm&&zl?.wasm?.wasmPaths?.mjs)){if(O.IS_DENO_WEB_RUNTIME)throw Error(`env.useWasmCache=false is not supported in Deno's web runtime. Remove the useWasmCache override.`);return Nl=Promise.resolve(),Nl}return Nl=(async()=>{let e=zl.wasm.wasmPaths,t=!1;await Promise.all([e.wasm&&!Fc(e.wasm)?(async()=>{try{let n=await xl(Ic(e.wasm));n&&(zl.wasm.wasmBinary=n,t=!0)}catch(e){A.warn(`Failed to pre-load WASM binary:`,e)}})():Promise.resolve(),e.mjs&&!Fc(e.mjs)?(async()=>{try{let t=await Sl(Ic(e.mjs));t&&(zl.wasm.wasmPaths.mjs=t)}catch(e){A.warn(`Failed to pre-load WASM factory:`,e)}})():Promise.resolve()]),t||(zl.wasm.wasmPaths.mjs=e.mjs)})(),Nl}async function Fl(e,t,n){await Pl();let r=wl(k.logLevel??Xr.WARNING),i=()=>Al.create(e,{logSeverityLevel:r,...t}),a=await(O.IS_WEB_ENV?Ml=Ml.then(i):i());return a.config=n,a}var Il=Promise.resolve();async function Ll(e,t){let n=()=>e.run(t);return O.IS_WEB_ENV?Il=Il.then(n):n()}function Rl(e){return e instanceof Ol.Tensor}var zl=Ol?.env;function Bl(){return zl?.wasm?.proxy}if(zl){let e=function(e){zl.logLevel=Tl[wl(e)]};if(zl.wasm){if(!(typeof ServiceWorkerGlobalScope<`u`&&self instanceof ServiceWorkerGlobalScope)&&zl.versions?.web&&!zl.wasm.wasmPaths){let e=`https://cdn.jsdelivr.net/npm/onnxruntime-web@${zl.versions.web}/dist/`,t=`.asyncify`;O.IS_SAFARI_BELOW_26&&!O.IS_WEBGPU_AVAILABLE&&(t=``),zl.wasm.wasmPaths={mjs:`${e}ort-wasm-simd-threaded${t}.mjs`,wasm:`${e}ort-wasm-simd-threaded${t}.wasm`}}zl.wasm.proxy=!1}zl.webgpu&&(zl.webgpu.powerPreference=`high-performance`),e(k.logLevel??Xr.WARNING),k.backends.onnx={...zl,setLogLevel:e}}var Vl=async(e,t,n)=>{let r=await Fl(new Uint8Array(e),t);return(async e=>{let t=Bl(),i=Object.fromEntries(Object.entries(e).map(([e,n])=>[e,(t?n.clone():n).ort_tensor])),a=await Ll(r,i);return Array.isArray(n)?n.map(e=>new V(a[e])):new V(a[n])})},Hl=class{static session_options={};static get nearest_interpolate_4d(){return this._nearest_interpolate_4d||=Vl([8,10,18,0,58,129,1,10,41,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,18,10,4,109,111,100,101,34,7,110,101,97,114,101,115,116,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,21],this.session_options,`y`),this._nearest_interpolate_4d}static get bilinear_interpolate_4d(){return this._bilinear_interpolate_4d||=Vl([8,9,18,0,58,128,1,10,40,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,17,10,4,109,111,100,101,34,6,108,105,110,101,97,114,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bilinear_interpolate_4d}static get bicubic_interpolate_4d(){return this._bicubic_interpolate_4d||=Vl([8,9,18,0,58,127,10,39,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,16,10,4,109,111,100,101,34,5,99,117,98,105,99,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bicubic_interpolate_4d}static get matmul(){return this._matmul||=Vl([8,9,18,0,58,55,10,17,10,1,97,10,1,98,18,1,99,34,6,77,97,116,77,117,108,18,1,114,90,9,10,1,97,18,4,10,2,8,1,90,9,10,1,98,18,4,10,2,8,1,98,9,10,1,99,18,4,10,2,8,1,66,2,16,20],this.session_options,`c`),this._matmul}static get stft(){return this._stft||=Vl([8,7,18,0,58,148,1,10,38,10,1,115,10,1,106,10,1,119,10,1,108,18,1,111,34,4,83,84,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,115,90,26,10,1,115,18,21,10,19,8,1,18,15,10,3,18,1,98,10,3,18,1,115,10,3,18,1,99,90,11,10,1,106,18,6,10,4,8,7,18,0,90,16,10,1,119,18,11,10,9,8,1,18,5,10,3,18,1,119,90,11,10,1,108,18,6,10,4,8,7,18,0,98,31,10,1,111,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,102,10,3,18,1,100,10,3,18,1,99,66,2,16,17],this.session_options,`o`),this._stft}static get rfft(){return this._rfft||=Vl([8,9,58,93,10,33,10,1,120,10,0,10,1,97,18,1,121,34,3,68,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,100,90,19,10,1,120,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,1,90,11,10,1,97,18,6,10,4,8,7,18,0,98,19,10,1,121,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,2,66,2,16,20],this.session_options,`y`),this._rfft}static get top_k(){return this._top_k||=Vl([8,10,18,0,58,73,10,18,10,1,120,10,1,107,18,1,118,18,1,105,34,4,84,111,112,75,18,1,116,90,9,10,1,120,18,4,10,2,8,1,90,15,10,1,107,18,10,10,8,8,7,18,4,10,2,8,1,98,9,10,1,118,18,4,10,2,8,1,98,9,10,1,105,18,4,10,2,8,7,66,2,16,21],this.session_options,[`v`,`i`]),this._top_k}static get slice(){return this._slice||=Vl([8,7,18,0,58,96,10,25,10,1,120,10,1,115,10,1,101,10,1,97,10,1,116,18,1,121,34,5,83,108,105,99,101,18,1,114,90,9,10,1,120,18,4,10,2,8,1,90,9,10,1,115,18,4,10,2,8,7,90,9,10,1,101,18,4,10,2,8,7,90,9,10,1,97,18,4,10,2,8,7,90,9,10,1,116,18,4,10,2,8,7,98,9,10,1,121,18,4,10,2,8,1,66,2,16,13],this.session_options,`y`),this._slice}},Ul=Object.freeze({auto:`auto`,gpu:`gpu`,cpu:`cpu`,wasm:`wasm`,webgpu:`webgpu`,cuda:`cuda`,dml:`dml`,coreml:`coreml`,webnn:`webnn`,"webnn-npu":`webnn-npu`,"webnn-gpu":`webnn-gpu`,"webnn-cpu":`webnn-cpu`}),Wl=O.IS_NODE_ENV?`cpu`:`wasm`;function Gl(e,t,{warn:n}={}){return e?typeof e==`string`?e:e.hasOwnProperty(t)?e[t]:(n&&n(`device not specified for "${t}". Using the default device (${Wl}).`),Wl):Wl}var Kl=/* @__PURE__ */ (function(){let e;return async function(){if(e===void 0){if(!O.IS_WEBGPU_AVAILABLE)e=!1;else try{e=(await navigator.gpu.requestAdapter()).features.has(`shader-f16`)}catch{e=!1}}return e}})(),ql=Object.freeze({auto:`auto`,fp32:`fp32`,fp16:`fp16`,q8:`q8`,int8:`int8`,uint8:`uint8`,q4:`q4`,bnb4:`bnb4`,q4f16:`q4f16`,q2:`q2`,q2f16:`q2f16`,q1:`q1`,q1f16:`q1f16`}),Jl=ql.fp32,Yl=Object.freeze({[Ul.wasm]:ql.q8}),Xl=Object.freeze({[ql.fp32]:``,[ql.fp16]:`_fp16`,[ql.int8]:`_int8`,[ql.uint8]:`_uint8`,[ql.q8]:`_quantized`,[ql.q4]:`_q4`,[ql.q2]:`_q2`,[ql.q1]:`_q1`,[ql.q4f16]:`_q4f16`,[ql.q2f16]:`_q2f16`,[ql.q1f16]:`_q1f16`,[ql.bnb4]:`_bnb4`});function Zl(e,t,n,{configDtype:r=null,warn:i}={}){let a,o=!1;e&&typeof e!=`string`?e.hasOwnProperty(t)?a=e[t]:(a=null,o=!0):a=e;let s;if(a===ql.auto){if(r){let e=typeof r==`string`?r:r?.[t];if(e&&e!==ql.auto&&ql.hasOwnProperty(e))return e}s=Yl[n]??Jl}else s=a&&ql.hasOwnProperty(a)?a:Yl[n]??Jl;return o&&i&&i(`dtype not specified for "${t}". Using the default dtype (${s}) for this device (${n}).`),s}var Ql=Object.freeze({float32:Float32Array,float16:typeof Float16Array<`u`?Float16Array:Uint16Array,float64:Float64Array,string:Array,int8:Int8Array,uint8:Uint8Array,int16:Int16Array,uint16:Uint16Array,int32:Int32Array,uint32:Uint32Array,int64:BigInt64Array,uint64:BigUint64Array,bool:Uint8Array,uint4:Uint8Array,int4:Int8Array}),V=class e{get dims(){return this.ort_tensor.dims}set dims(e){this.ort_tensor.dims=e}get type(){return this.ort_tensor.type}get data(){return this.ort_tensor.data}get size(){return this.ort_tensor.size}get location(){return this.ort_tensor.location}ort_tensor;constructor(...e){return this.ort_tensor=Rl(e[0])?e[0]:new br(e[0],e[1],e[2]),new Proxy(this,{get:(e,t)=>{if(typeof t==`string`){let n=Number(t);if(Number.isInteger(n))return e._getitem(n)}return e[t]},set:(e,t,n)=>e[t]=n})}dispose(){this.ort_tensor.dispose()}*[Symbol.iterator](){let[e,...t]=this.dims;if(t.length>0){let n=t.reduce((e,t)=>e*t);for(let r=0;r0){let e=r.reduce((e,t)=>e*t);return this._subarray(t,e,r)}return new e(this.type,[this.data[t]],r)}_subarray(t,n,r){let i=t*n,a=(t+1)*n,o=`subarray`in this.data?this.data.subarray(i,a):this.data.slice(i,a);return new e(this.type,o,r)}item(){let e=this.data;if(e.length!==1)throw Error(`a Tensor with ${e.length} elements cannot be converted to Scalar`);return e[0]}tolist(){return $l(this.data,this.dims)}sigmoid(){return this.clone().sigmoid_()}sigmoid_(){let e=this.data;for(let t=0;t0||r>0&&n<0?r+n:r}return this}clone(){return new e(this.type,this.data.slice(),this.dims.slice())}slice(...t){let n=[],r=[];for(let e=0;ea)throw Error(`Invalid slice: ${i}`);let o=[Math.max(t,0),Math.min(a,this.dims[e])];r.push(o),n.push(o[1]-o[0])}else throw Error(`Invalid slice: ${i}`)}let i=r.map(([e,t])=>t-e),a=i.reduce((e,t)=>e*t),o=this.data,s=new o.constructor(a),c=this.stride(),l=!0;for(let e=1;e=0;--n){let e=i[n];t+=(a%e+r[n][0])*c[n],a=Math.floor(a/e)}s[e]=o[t]}return new e(this.type,s,n)}permute(...e){return eu(this,e)}transpose(...e){return this.permute(...e)}sum(e=null,t=!1){return this.norm(1,e,t)}norm(t=`fro`,n=null,r=!1){if(t===`fro`)t=2;else if(typeof t==`string`)throw Error(`Unsupported norm: ${t}`);let i=this.data,a=i instanceof BigInt64Array||i instanceof BigUint64Array;if(a&&t!==1)throw Error(`Expected a floating point tensor as input. Got ${this.type}`);let o,s;if(a?(o=(e,t)=>e+t,s=0n):(o=(e,n)=>e+n**t,s=0),n===null){let n=i.reduce(o,s);return t!==1&&(n**=1/t),new e(this.type,[n],[])}let[c,l,u]=fu(o,this,n,r);if(t!==1)for(let e=0;e=0;--r){let e=this.dims[r];if(r!==t){let t=i%e;n+=t*a,a*=this.dims[r]}i=Math.floor(i/e)}r[e]/=i[n]}return this}normalize(e=2,t=1){return this.clone().normalize_(e,t)}stride(){return hu(this.dims)}squeeze(t=null){return new e(this.type,this.data,cu(this.dims,t))}squeeze_(e=null){return this.dims=cu(this.dims,e),this}unsqueeze(t){return new e(this.type,this.data,lu(this.dims,t))}unsqueeze_(e){return this.dims=lu(this.dims,e),this}flatten_(e=0,t=-1){t=(t+this.dims.length)%this.dims.length;let n=this.dims.slice(0,e),r=this.dims.slice(e,t+1),i=this.dims.slice(t+1);return this.dims=[...n,r.reduce((e,t)=>e*t,1),...i],this}flatten(e=0,t=-1){return this.clone().flatten_(e,t)}view(...t){let n=-1;for(let e=0;er===n?e:e*t,1);t[n]=r.length/e}return new e(this.type,r,t)}neg_(){let e=this.data;for(let t=0;tt);return new e(`bool`,n,this.dims)}lt(t){let n=new Uint8Array(this.data.length),r=this.data;for(let e=0;eMath.min(e,t),this,t,n,1/0);return new e(r,i,a)}max(t=null,n=!1){if(t===null){let t=ll(this.data)[0];return new e(this.type,[t],[])}let[r,i,a]=fu((e,t)=>Math.max(e,t),this,t,n,-1/0);return new e(r,i,a)}argmin(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=cl(this.data)[1];return new e(`int64`,[BigInt(r)],[])}argmax(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=ll(this.data)[1];return new e(`int64`,[BigInt(r)],[])}repeat(...t){if(t.lengthe===1)){if(t.length===this.dims.length)return this.clone();let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims);return new e(this.type,this.data.slice(),r)}let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims),i=r.map((e,n)=>e*t[n]),a=i.reduce((e,t)=>e*t,1),o=this.data,s=new o.constructor(a),c=hu(r),l=hu(i);for(let e=0;eBigInt(Math.floor(e)):BigInt;else if(this.type===`float16`&&t==`float32`&&this.data instanceof Uint16Array)return new e(t,vl(this.data),this.dims);return new e(t,Ql[t].from(this.data,n),this.dims)}};function $l(e,t){let n=e.length;if(n!==(t.length===0?1:t.reduce((e,t)=>e*t)))throw Error(`cannot reshape array of size ${n} into shape (${t})`);let r=e;for(let e=t.length-1;e>=0;e--)r=r.reduce((n,r)=>{let i=n[n.length-1];return i.lengthnew V(`int64`,e,[e.length]);async function ou(e,t,n,r,i){return await(await Hl.slice)({x:e,s:au(t),e:au(n),a:au(r),t:au(i??Array(r.length).fill(1))})}function su(e,t){let n=e.data,r=t.data,i=[e.dims[0],e.dims[2]],a=new n.constructor(i[0]*i[1]),[o,s,c]=e.dims,l=0;for(let e=0;ee!==1):typeof t==`number`?e[t]===1&&e.splice(t,1):Array.isArray(t)&&(e=e.filter((e,n)=>e!==1||!t.includes(n))),e}function lu(e,t){return t=uu(t,e.length+1),e=e.slice(),e.splice(t,0,1),e}function uu(e,t,n=null,r=!0){if(e<-t||e>=t){if(r)throw Error(`IndexError: index ${e} is out of bounds for dimension${n===null?``:` `+n} with size ${t}`);return e<-t?0:t}return e<0&&(e=(e%t+t)%t),e}function H(e,t=0){t=uu(t,e[0].dims.length);let n=e[0].dims.slice();n[t]=e.reduce((e,n)=>e+n.dims[t],0);let r=n.reduce((e,t)=>e*t,1),i=new e[0].data.constructor(r),a=e[0].type;if(t===0){let t=0;for(let n of e){let e=n.data;i.set(e,t),t+=e.length}}else{let r=0;for(let a=0;a=0;--i){let e=s[i],l=o%e;i===t&&(l+=r),a+=l*c,c*=n[i],o=Math.floor(o/e)}i[a]=o[e]}r+=s[t]}}return new V(a,i,n)}function du(e,t=0){return H(e.map(e=>e.unsqueeze(t)),t)}function fu(e,t,n,r=!1,i=null){let a=t.data,o=t.dims;n=uu(n,o.length);let s=o.slice();s[n]=1;let c=new a.constructor(a.length/o[n]);i!==null&&c.fill(i);for(let t=0;t=0;--e){let t=o[e];if(e!==n){let n=i%t;r+=n*a,a*=s[e]}i=Math.floor(i/t)}c[r]=e(c[r],a[t],t,r)}return r||s.splice(n,1),[t.type,c,s]}function pu(e,t=null,n=1,r=!1){let i=e.data,a=e.dims;if(t===null){let t=i.reduce((e,t)=>e+t,0)/i.length,r=Math.sqrt(i.reduce((e,n)=>e+(n-t)**2,0)/(i.length-n)),a=new V(e.type,[t],[]);return[new V(e.type,[r],[]),a]}t=uu(t,a.length);let o=mu(e,t,r),s=o.data,[c,l,u]=fu((e,t,n,r)=>e+(t-s[r])**2,e,t,r);for(let e=0;ee+t,0);return new V(e.type,[t/i.length],[])}t=uu(t,r.length);let[a,o,s]=fu((e,t)=>e+t,e,t,n);if(r[t]!==1)for(let e=0;e=0;--n)t[n]=r,r*=e[n];return t}function gu(e,t,n,r){return new V(n,new r(e.reduce((e,t)=>e*t,1)).fill(t),e)}function _u(e,t){let n,r;if(typeof t==`number`)n=`float32`,r=Float32Array;else if(typeof t==`bigint`)n=`int64`,r=BigInt64Array;else if(typeof t==`boolean`)n=`bool`,r=Uint8Array;else throw Error(`Unsupported data type: ${typeof t}`);return gu(e,t,n,r)}function vu(e,t){return _u(e.dims,t)}function yu(e){return gu(e,1n,`int64`,BigInt64Array)}function bu(e){return yu(e.dims)}function xu(e){return gu(e,0n,`int64`,BigInt64Array)}function Su(e){return xu(e.dims)}function Cu(e){let t=e.reduce((e,t)=>e*t,1);return new V(`float32`,Float32Array.from({length:t},()=>bc.gauss()),e)}function wu(e,t){if(e.dims.length!==2)throw Error(`The tensor must have 2 dimensions`);if(e.dims.at(-1)%8!=0)throw Error(`The last dimension of the tensor must be a multiple of 8`);if(![`binary`,`ubinary`].includes(t))throw Error(`The precision must be either 'binary' or 'ubinary'`);let n=t===`binary`,r=n?`int8`:`uint8`,i=n?Int8Array:Uint8Array,a=e.data,o=new i(a.length/8);for(let e=0;e0),r=Math.floor(e/8),i=e%8;o[r]|=t<<7-i,n&&i===0&&(o[r]-=128)}return new V(r,o,[e.dims[0],e.dims[1]/8])}async function Tu(e){if(!e)throw Error(`modelId is required for get_tokenizer_files`);return(await Kc(e,`tokenizer_config.json`,{})).exists?[`tokenizer.json`,`tokenizer_config.json`]:[]}async function Eu(e,t){let n=await Tu(e);return await Promise.all(n.map(n=>rl(e,n,!0,t)))}function Du(e){let t=e.dims;switch(t.length){case 1:return e.tolist();case 2:if(t[0]!==1)throw Error("Unable to decode tensor with `batch size !== 1`. Use `tokenizer.batch_decode(...)` for batched inputs.");return e.tolist()[0];default:throw Error(`Expected tensor to have 1-2 dimensions, got ${t.length}.`)}}var Ou=[`bos_token`,`eos_token`,`unk_token`,`sep_token`,`pad_token`,`cls_token`,`mask_token`];function ku(e,t,n,r){for(let i of Object.keys(e)){let a=t-e[i].length,o=n(i),s=Array(a).fill(o);e[i]=r===`right`?ai(e[i],s):ai(s,e[i])}}function Au(e,t){for(let n of Object.keys(e))e[n].length=t}function ju(e,...t){for(let n of t){if(!Object.hasOwn(e,n))continue;let t=e[n];if(t){if(typeof t==`object`){if(t.__type===`AddedToken`)return t.content;throw Error(`Unknown token: ${t}`)}return t}}return null}function Mu(e){let t=[];for(let n of e.get_added_tokens_decoder().values())n.special&&t.push(n);return t}var U=class extends $r{return_token_type_ids=!1;padding_side=`right`;constructor(e,t){if(super(),this._tokenizerJSON=e,this._tokenizerConfig=t,this._tokenizer=new Do(e,t),this.config=t,this.padding_side=t.padding_side??this.padding_side,this.mask_token=ju(t,`mask_token`),this.mask_token_id=this._tokenizer.token_to_id(this.mask_token),this.pad_token=ju(t,`pad_token`,`eos_token`),this.pad_token_id=this._tokenizer.token_to_id(this.pad_token),this.sep_token=ju(t,`sep_token`),this.sep_token_id=this._tokenizer.token_to_id(this.sep_token),this.unk_token=ju(t,`unk_token`),this.unk_token_id=this._tokenizer.token_to_id(this.unk_token),this.bos_token=ju(t,`bos_token`),this.bos_token_id=this._tokenizer.token_to_id(this.bos_token),this.eos_token=ju(t,`eos_token`),this.eos_token_id=this._tokenizer.token_to_id(this.eos_token),this.chat_template=t.chat_template??null,Array.isArray(this.chat_template)){let e=/* @__PURE__ */ Object.create(null);for(let{name:t,template:n}of this.chat_template){if(typeof t!=`string`||typeof n!=`string`)throw Error(`Chat template must be a list of objects with "name" and "template" properties`);e[t]=n}this.chat_template=e}this._compiled_template_cache=/* @__PURE__ */ new Map;let n=Mu(this._tokenizer);this.all_special_ids=n.map(e=>e.id),this.all_special_tokens=n.map(e=>e.content)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let o=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a});return new this(...o)}get_vocab(){return this._tokenizer.get_vocab()}get model_max_length(){return this._tokenizerConfig.model_max_length??1/0}get add_eos_token(){return this._tokenizerConfig.add_eos_token}get add_bos_token(){return this._tokenizerConfig.add_bos_token}convert_tokens_to_ids(e){return typeof e==`string`?this._tokenizer.token_to_id(e):e.map(e=>this._tokenizer.token_to_id(e))}_call(e,t={}){let{text_pair:n=null,add_special_tokens:r=!0,padding:i=!1,return_token_type_ids:a=null}=t,{truncation:o=null,max_length:s=null}=t,c=t.return_tensor??!0,l=Array.isArray(e),u;if(l){if(e.length===0)throw Error(`text array must be non-empty`);if(n!==null){if(!Array.isArray(n))throw Error(`text_pair must also be an array`);if(e.length!==n.length)throw Error(`text and text_pair must have the same length`);u=e.map((e,t)=>this._encode_plus(e,{text_pair:n[t],add_special_tokens:r,return_token_type_ids:a}))}else u=e.map(e=>this._encode_plus(e,{add_special_tokens:r,return_token_type_ids:a}))}else{if(e==null)throw Error(`text may not be null or undefined`);if(Array.isArray(n))throw Error("When specifying `text_pair`, since `text` is a string, `text_pair` must also be a string (i.e., not an array).");u=[this._encode_plus(e,{text_pair:n,add_special_tokens:r,return_token_type_ids:a})]}if(s===null?s=this.model_max_length:o===null&&(i===!0?(A.warn("`max_length` is ignored when `padding: true` and there is no truncation strategy. To pad to max length, use `padding: 'max_length'`."),s=this.model_max_length):i===!1&&(A.warn("Truncation was not explicitly activated but `max_length` is provided a specific value, please use `truncation: true` to explicitly truncate examples to max length."),o=!0)),i===!0&&(s=Math.min(ll(u.map(e=>e.input_ids.length))[0],s??1/0)),s=Math.min(s,this.model_max_length??1/0),i||o)for(let e=0;es?o&&Au(u[e],s):i&&ku(u[e],s,e=>e===`input_ids`?this.pad_token_id:0,this.padding_side);let d={};if(c){if(!(i&&o)&&u.some(e=>{for(let t of Object.keys(e))if(e[t].length!==u[0][t]?.length)return!0;return!1}))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=true' and 'truncation=true' to have batched tensors with the same length.`);let e=[u.length,u[0].input_ids.length];for(let t of Object.keys(u[0]))d[t]=new V(`int64`,BigInt64Array.from(u.flatMap(e=>e[t]).map(BigInt)),e)}else{for(let e of Object.keys(u[0]))d[e]=u.map(t=>t[e]);if(!l)for(let e of Object.keys(d))d[e]=d[e][0]}return d}_encode_text(e){return e===null?null:this._tokenizer.encode(e).tokens}_encode_plus(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{ids:i,attention_mask:a,token_type_ids:o}=this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r??this.return_token_type_ids});return{input_ids:i,attention_mask:a,...o?{token_type_ids:o}:{}}}tokenize(e,{pair:t=null,add_special_tokens:n=!1}={}){return this._tokenizer.tokenize(e,{text_pair:t,add_special_tokens:n})}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){return this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r}).ids}batch_decode(e,t={}){return e instanceof V&&(e=e.tolist()),e.map(e=>this.decode(e,t))}decode(e,t={}){if(e instanceof V&&(e=Du(e)),!Array.isArray(e)||e.length===0||!ni(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);return this.decode_single(e,t)}decode_single(e,{skip_special_tokens:t=!1,clean_up_tokenization_spaces:n=null}){return this._tokenizer.decode(e,{skip_special_tokens:t,clean_up_tokenization_spaces:n})}get_chat_template({chat_template:e=null,tools:t=null}={}){if(this.chat_template&&typeof this.chat_template==`object`){let n=this.chat_template;if(e!==null&&Object.hasOwn(n,e))e=n[e];else if(e===null){if(t!==null&&`tool_use`in n)e=n.tool_use;else if(`default`in n)e=n.default;else throw Error(`This model has multiple chat templates with no default specified! Please either pass a chat template or the name of the template you wish to use to the 'chat_template' argument. Available template names are ${Object.keys(n).sort()}.`)}}else if(e===null){if(this.chat_template)e=this.chat_template;else throw Error(`Cannot use apply_chat_template() because tokenizer.chat_template is not set and no template argument was passed! For information about writing templates and setting the tokenizer.chat_template attribute, please see the documentation at https://huggingface.co/docs/transformers/main/en/chat_templating`)}return e}apply_chat_template(e,t={}){let{tools:n=null,documents:r=null,chat_template:i=null,add_generation_prompt:a=!1,tokenize:o=!0,padding:s=!1,truncation:c=!1,max_length:l=null,return_tensor:u=!0,return_dict:d=!0,tokenizer_kwargs:f={},...p}=t;if(i=this.get_chat_template({chat_template:i,tools:n}),typeof i!=`string`)throw Error(`chat_template must be a string, but got ${typeof i}`);let m=this._compiled_template_cache.get(i);m===void 0&&(m=new mc(i),this._compiled_template_cache.set(i,m));let h=/* @__PURE__ */ Object.create(null);for(let e of Ou){let t=ju(this.config,e);t&&(h[e]=t)}let g=m.render({messages:e,add_generation_prompt:a,tools:n,documents:r,...h,...p});if(o){let e=this._call(g,{add_special_tokens:!1,padding:s,truncation:c,max_length:l,return_tensor:u,...f});return d?e:e.input_ids}return g}};function Nu(e,t,n,r){if(!(`language_codes`in e)||!Array.isArray(e.language_codes))throw Error("Tokenizer must have `language_codes` attribute set and it should be an array of language ids.");if(!(`languageRegex`in e)||!(e.languageRegex instanceof RegExp))throw Error("Tokenizer must have `languageRegex` attribute set and it should be a regular expression.");if(!(`lang_to_token`in e)||typeof e.lang_to_token!=`function`)throw Error("Tokenizer must have `lang_to_token` attribute set and it should be a function.");let i=r.src_lang,a=r.tgt_lang;if(!e.language_codes.includes(a))throw Error(`Target language code "${a}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);if(i!==void 0){if(!e.language_codes.includes(i))throw Error(`Source language code "${i}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);let t=e._tokenizer.post_processor?.config;if(t&&`single`in t){for(let n of t.single)if(`SpecialToken`in n&&e.languageRegex.test(n.SpecialToken.id)){n.SpecialToken.id=e.lang_to_token(i);break}}}return r.forced_bos_token_id=e._tokenizer.token_to_id(e.lang_to_token(a)),e._call(t,n)}var Pu={};Sr(Pu,{AlbertTokenizer:()=>Fu,AutoTokenizer:()=>W,BartTokenizer:()=>Iu,BertTokenizer:()=>Lu,BlenderbotSmallTokenizer:()=>Ru,BlenderbotTokenizer:()=>zu,BloomTokenizer:()=>Bu,CLIPTokenizer:()=>Hu,CamembertTokenizer:()=>Vu,CodeGenTokenizer:()=>Wu,CodeLlamaTokenizer:()=>Uu,CohereAsrTokenizer:()=>Ku,CohereTokenizer:()=>Gu,ConvBertTokenizer:()=>qu,DebertaTokenizer:()=>Yu,DebertaV2Tokenizer:()=>Ju,DistilBertTokenizer:()=>Xu,ElectraTokenizer:()=>Zu,EsmTokenizer:()=>Qu,FalconTokenizer:()=>$u,GPT2Tokenizer:()=>nd,GPTNeoXTokenizer:()=>td,GemmaTokenizer:()=>ed,HerbertTokenizer:()=>rd,LlamaTokenizer:()=>id,M2M100Tokenizer:()=>ad,MBart50Tokenizer:()=>cd,MBartTokenizer:()=>sd,MPNetTokenizer:()=>dd,MarianTokenizer:()=>od,MgpstrTokenizer:()=>ld,MobileBertTokenizer:()=>ud,NllbTokenizer:()=>fd,NougatTokenizer:()=>pd,PreTrainedTokenizer:()=>U,Qwen2Tokenizer:()=>md,RoFormerTokenizer:()=>gd,RobertaTokenizer:()=>hd,SiglipTokenizer:()=>_d,SpeechT5Tokenizer:()=>vd,SqueezeBertTokenizer:()=>yd,T5Tokenizer:()=>bd,TokenizersBackend:()=>U,VitsTokenizer:()=>Sd,Wav2Vec2CTCTokenizer:()=>Cd,WhisperTokenizer:()=>Ad,XLMRobertaTokenizer:()=>jd,XLMTokenizer:()=>Md});var Fu=class extends U{return_token_type_ids=!0},Iu=class extends U{},Lu=class extends U{return_token_type_ids=!0},Ru=class extends U{},zu=class extends U{},Bu=class extends U{},Vu=class extends U{},Hu=class extends U{},Uu=class extends U{},Wu=class extends U{},Gu=class extends U{},Ku=class extends U{},qu=class extends U{return_token_type_ids=!0},Ju=class extends U{return_token_type_ids=!0},Yu=class extends U{return_token_type_ids=!0},Xu=class extends U{},Zu=class extends U{return_token_type_ids=!0},Qu=class extends U{},$u=class extends U{},ed=class extends U{},td=class extends U{},nd=class extends U{},rd=class extends U{return_token_type_ids=!0},id=class extends U{padding_side=`left`},ad=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^__[a-z]{2,3}__$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e.slice(2,-2)),this.lang_to_token=e=>`__${e}__`}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},od=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^(>>\w+<<)\s*/g,this.supported_language_codes=Array.from(this.get_vocab().keys()).filter(e=>this.languageRegex.test(e)),A.warn('WARNING: `MarianTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}_encode_text(e){if(e===null)return null;let[t,...n]=e.trim().split(this.languageRegex);if(n.length===0)return super._encode_text(t);if(n.length===2){let[e,t]=n;return this.supported_language_codes.includes(e)||A.warn(`Unsupported language code "${e}" detected, which may lead to unexpected behavior. Should be one of: ${JSON.stringify(this.supported_language_codes)}`),ai([e],super._encode_text(t))}}},sd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{2}_[A-Z]{2}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},cd=class extends sd{},ld=class extends U{},ud=class extends U{return_token_type_ids=!0},dd=class extends U{},fd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{3}_[A-Z][a-z]{3}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},pd=class extends U{},md=class extends U{},hd=class extends U{},gd=class extends U{return_token_type_ids=!0},_d=class extends U{},vd=class extends U{},yd=class extends U{return_token_type_ids=!0},bd=class extends U{},xd=class extends mo{decode_chain(e){let t=``;for(let n=1;n[t,e]),[`burmese`,`my`],[`valencian`,`ca`],[`flemish`,`nl`],[`haitian`,`ht`],[`letzeburgesch`,`lb`],[`pushto`,`ps`],[`panjabi`,`pa`],[`moldavian`,`ro`],[`moldovan`,`ro`],[`sinhalese`,`si`],[`castilian`,`es`]]);function Dd(e){e=e.toLowerCase();let t=Ed.get(e);if(t===void 0){let n=e.match(/^<\|([a-z]{2})\|>$/);if(n&&(e=n[1]),Td.has(e))t=e;else{let t=e.length===2?Td.keys():Td.values();throw Error(`Language "${e}" is not supported. Must be one of: ${JSON.stringify(Array.from(t))}`)}}return t}var Od=/* @__PURE__ */ RegExp(`^[\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E]+$`,`gu`),kd=.1,Ad=class extends U{get timestamp_begin(){return this._tokenizer.token_to_id(`<|notimestamps|>`)+1}_decode_asr(e,{return_timestamps:t=!1,return_language:n=!1,time_precision:r=null,force_full_sequences:i=!0}={}){if(r===null)throw Error(`Must specify time_precision`);let a=null,o=t===`word`;function s(){return{language:a,timestamp:[null,null],text:``}}let c=[],l=s(),u=0,d=this.timestamp_begin,f=d+1500,p=[],m=[],h=!1,g=null,_=new Set(this.all_special_ids);for(let n of e){let e=n.tokens,i=o?n.token_timestamps:null,v=null,y=d;if(`stride`in n){let[t,i,a]=n.stride;if(u-=i,g=t-a,i&&(y=i/r+d),a)for(let t=e.length-1;t>=0;--t){let n=Number(e[t]);if(n>=d){if(v!==null&&(n-d)*r=d&&g<=f){let e=hl((g-d)*r+u,2);if(v!==null&&g>=v)h=!0;else if(h||p.length>0&&g0&&l.timestamp[1]!==null))for(let e of l.words)e.timestamp[1]>l.timestamp[1]&&l.timestamp[1]>=e.timestamp[0]&&(e.timestamp[1]=l.timestamp[1]);c.push(l),p=[],b=[],m=[],x=[],l=s()}}else if(b.push(g),o){let e=hl(i[n]+u,2),t;if(n+10?(p.push(b),o&&m.push(x)):p.every(e=>e.length===0)&&(l=s(),p=[],b=[],m=[],x=[])}if(p.length>0){if(i&&t)throw Error(`Whisper did not predict an ending timestamp, which can happen if audio is cut off in the middle of a word. Also make sure WhisperTimeStampLogitsProcessor was used during generation.`);let[e,n]=this.findLongestCommonSequence(p,m),r=this.decode(e);l.text=r,o&&(l.words=this.collateWordTimestamps(e,n,a)),c.push(l)}let v=/* @__PURE__ */ Object.create(null),y=c.map(e=>e.text).join(``);if(t||n){for(let e=0;e0,o=a?[]:null,s=a?t[0]:null;for(let c=1;ce===g[n]&&s[i+n][0]-kd<=t[c][m+n][0]).length:p.filter((e,t)=>e===g[t]).length;let v=e/1e4,y=_/e+v;_>1&&y>u&&(u=y,d=[i,o,m,h])}let[p,m,h,g]=d,_=Math.floor((m+p)/2),v=Math.floor((g+h)/2);if(a&&u===0&&r>0){let e=s[r-1][0],n=t[c].findIndex(t=>t[0]>=e);v=n===-1?l.length:n}i.push(...n.slice(0,_)),n=l.slice(v),r=n.length,a&&(o.push(...s.slice(0,_)),s=t[c].slice(v))}return i.push(...n),a?(o.push(...s),[i,o]):[i,[]]}collateWordTimestamps(e,t,n){let[r,i,a]=this.combineTokensIntoWords(e,n),o=[];for(let e=0;e=r){let e=((t-r)*n).toFixed(2);i.push(`<|${e}|>`),i.push([])}else i[i.length-1].push(t);return i=i.map(e=>typeof e==`string`?e:super.decode(e,t)),i.join(``)}splitTokensOnUnicode(e){let t=this.decode(e,{decode_with_timestamps:!0}),n=[],r=[],i=[],a=[],o=[],s=0;for(let c=0;c=this._tokenizer.token_to_id(`<|endoftext|>`),d=s.startsWith(` `),f=s.trim(),p=Od.test(f);if(u||d||p||i.length===0)i.push(s),a.push(c),o.push(l);else{let e=i.length-1;i[e]+=s,a[e].push(...c),o[e].push(...l)}}return[i,a,o]}mergePunctuations(e,t,n,r,i){let a=structuredClone(e),o=structuredClone(t),s=structuredClone(n),c=a.length-2,l=a.length-1;for(;c>=0;)a[c].startsWith(` `)&&r.includes(a[c].trim())?(a[l]=a[c]+a[l],o[l]=ai(o[c],o[l]),s[l]=ai(s[c],s[l]),a[c]=``,o[c]=[],s[c]=[]):l=c,--c;for(c=0,l=1;le),o.filter(e=>e.length>0),s.filter(e=>e.length>0)]}},jd=class extends U{},Md=class extends U{return_token_type_ids=!0;constructor(e,t){super(e,t),A.warn('WARNING: `XLMTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}},W=class{static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let[o,s]=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a}),c=s.tokenizer_class?.replace(/Fast$/,``)??`PreTrainedTokenizer`,l=Pu[c];return l||=(A.warn(`Unknown tokenizer class "${c}", attempting to construct from base class.`),U),new l(o,s)}},Nd=`https://github.com/huggingface/transformers.js/issues/new/choose`,Pd=`preprocessor_config.json`,Fd=`preprocessor_config.json`,Id=`processor_config.json`,Ld=`chat_template.jinja`,G=class extends $r{static classes=[`image_processor_class`,`tokenizer_class`,`feature_extractor_class`];static uses_processor_config=!1;static uses_chat_template_file=!1;constructor(e,t,n){super(),this.config=e,this.components=t,this.chat_template=n}get image_processor(){return this.components.image_processor}get tokenizer(){return this.components.tokenizer}get feature_extractor(){return this.components.feature_extractor}apply_chat_template(e,t={}){if(!this.tokenizer)throw Error(`Unable to apply chat template without a tokenizer.`);return this.tokenizer.apply_chat_template(e,{tokenize:!1,chat_template:this.chat_template??void 0,...t})}batch_decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.batch_decode(...e)}decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.decode(...e)}async _call(e,...t){for(let n of[this.image_processor,this.feature_extractor,this.tokenizer])if(n)return n(e,...t);throw Error(`No image processor, feature extractor, or tokenizer found.`)}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([this.uses_processor_config?rl(e,Id,!0,t):{},Promise.all(this.classes.filter(e=>e in this).map(async n=>{let r=await this[n].from_pretrained(e,t);return[n.replace(/_class$/,``),r]})).then(Object.fromEntries),this.uses_chat_template_file?nl(e,Ld,!0,t):null]);return new this(n,r,i)}};Sr({},{ChatterboxProcessor:()=>Mf,CohereAsrProcessor:()=>Pf,Florence2Processor:()=>Sm,Gemma3Processor:()=>Cm,Gemma3nProcessor:()=>wm,Gemma4Processor:()=>Tm,Glm46VProcessor:()=>Dm,GraniteSpeechProcessor:()=>Om,GroundingDinoProcessor:()=>Am,Idefics3Processor:()=>Pm,JinaCLIPProcessor:()=>Im,Lfm2VlProcessor:()=>Lm,LlavaProcessor:()=>Rm,MgpstrProcessor:()=>Bm,MoonshineProcessor:()=>Vm,OwlViTProcessor:()=>Hm,PaliGemmaProcessor:()=>Gm,Phi3VProcessor:()=>Jm,PixtralProcessor:()=>Ym,Processor:()=>G,PyAnnoteProcessor:()=>Xm,Qwen2VLProcessor:()=>Em,Qwen2_5_VLProcessor:()=>Zm,Qwen3VLProcessor:()=>Qm,Sam2Processor:()=>eh,Sam2VideoProcessor:()=>th,SamProcessor:()=>$m,SmolVLMProcessor:()=>Pm,SpeechT5Processor:()=>nh,UltravoxProcessor:()=>rh,VLChatProcessor:()=>Fm,VoxtralProcessor:()=>ch,VoxtralRealtimeProcessor:()=>mh,Wav2Vec2Processor:()=>hh,Wav2Vec2ProcessorWithLM:()=>gh,WhisperProcessor:()=>_h});var Rd=class extends $r{constructor(e){super(),this.config=e}static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t);return new this(n)}};function zd(e,t){if(!(e instanceof Float32Array||e instanceof Float64Array))throw Error(`${t} expects input to be a Float32Array or a Float64Array, but got ${e?.constructor?.name??typeof e} instead. If using the feature extractor directly, remember to use \`load_audio(url, sampling_rate)\` to obtain the raw audio data of the file/url.`)}var Bd={};Sr(Bd,{ASTFeatureExtractor:()=>df,ChatterboxFeatureExtractor:()=>pf,ClapFeatureExtractor:()=>mf,CohereAsrFeatureExtractor:()=>_f,DacFeatureExtractor:()=>vf,EncodecFeatureExtractor:()=>ff,FeatureExtractor:()=>Rd,Gemma3nAudioFeatureExtractor:()=>yf,Gemma4AudioFeatureExtractor:()=>bf,GraniteSpeechFeatureExtractor:()=>xf,MoonshineFeatureExtractor:()=>Sf,ParakeetFeatureExtractor:()=>gf,PyAnnoteFeatureExtractor:()=>Cf,SeamlessM4TFeatureExtractor:()=>wf,SnacFeatureExtractor:()=>Tf,SpeechT5FeatureExtractor:()=>Ef,VoxtralRealtimeFeatureExtractor:()=>kf,Wav2Vec2FeatureExtractor:()=>Df,WeSpeakerFeatureExtractor:()=>Of,WhisperFeatureExtractor:()=>Af});var Vd={fromWeb:()=>{}};async function Hd(e,t){if(O.IS_BROWSER_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save a file from a Web Worker.`);let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e,r.click(),r.remove(),URL.revokeObjectURL(n)}else if(O.IS_FS_AVAILABLE){let n=t.stream();Vd.fromWeb(n),Cr.createWriteStream(e),await void 0}else throw Error(`Unable to save because filesystem is disabled in this environment.`)}async function Ud(e,t){if(typeof AudioContext>`u`)throw Error("Unable to load audio from path/URL since `AudioContext` is not available in your environment. Instead, audio data should be passed directly to the pipeline/processor. For more information and some example code, see https://huggingface.co/docs/transformers.js/guides/node-audio-processing.");let n=await(await Jc(e)).arrayBuffer(),r=new AudioContext({sampleRate:t});t===void 0&&A.warn(`No sampling rate provided, using default of ${r.sampleRate}Hz.`);let i=await r.decodeAudioData(n),a;if(i.numberOfChannels===2){let e=Math.sqrt(2),t=i.getChannelData(0),n=i.getChannelData(1);a=new Float32Array(t.length);for(let r=0;r2595*Math.log10(1+e/700),kaldi:e=>1127*Math.log(1+e/700),slaney:(e,t=1e3,n=15,r=27/Math.log(6.4))=>e>=t?n+Math.log(e/t)*r:3*e/200};function Yd(e,t=`htk`){let n=Jd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}var Xd={htk:e=>700*(10**(e/2595)-1),kaldi:e=>700*(Math.exp(e/1127)-1),slaney:(e,t=1e3,n=15,r=Math.log(6.4)/27)=>e>=n?t*Math.exp(r*(e-n)):200*e/3};function Zd(e,t=`htk`){let n=Xd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}function Qd(e,t){let n=Float64Array.from({length:t.length-1},(e,n)=>t[n+1]-t[n]),r=Array.from({length:e.length},()=>Array(t.length));for(let n=0;nArray(e.length));for(let t=0;te+r*n)}function ef(e,t,n,r,i,a=null,o=`htk`,s=!1){if(a!==null&&a!==`slaney`)throw Error(`norm must be one of null or "slaney"`);if(e<2)throw Error(`Require num_frequency_bins: ${e} >= 2`);if(n>r)throw Error(`Require min_frequency: ${n} <= max_frequency: ${r}`);let c=$d(Yd(n,o),Yd(r,o),t+2),l=Zd(c,o),u;if(s){let t=i/((e-1)*2);u=Yd(Float64Array.from({length:e},(e,n)=>n*t),o),l=c}else u=$d(0,Math.floor(i/2),e);let d=Qd(u,l);if(a!==null&&a===`slaney`)for(let n=0;ni)throw Error(`frame_length (${n}) may not be larger than fft_length (${i})`);if(w!==n)throw Error(`Length of the window (${w}) must equal frame_length (${n})`);if(r<=0)throw Error(`hop_length must be greater than zero`);if(a===null&&d!==null)throw Error("You have provided `mel_filters` but `power` is `None`. Mel spectrogram computation is not yet supported for complex-valued spectrogram. Specify `power` to fix this issue.");if(!u)throw Error("`preemphasis_htk_flavor=false` is not currently supported.");if(o){let t=Math.floor(n/2);switch(s){case`reflect`:e=tf(e,t,t);break;case`constant`:{let n=new e.constructor(e.length+2*t);n.set(e,t),e=n;break}case`semicausal`:{let n=new e.constructor(e.length+t);n.set(e,t),e=n;break}default:throw Error(`pad_mode="${s}" not implemented yet.`)}}let te=Math.floor(1+Math.floor((e.length-n)/r));y!==null&&tete?x&&(ie=b):ie=re=b);let ae=new pl(i),oe=new Float64Array(i),se=new Float64Array(ae.outputBufferSize),ce=new Float32Array(ne*ie);for(let i=0;i=1;--e)oe[e]-=l*oe[e-1];oe[0]*=1-l}for(let e=0;ee**.85);break;default:throw Error(`Unknown window type ${t}.`)}if(n&&(o=o.subarray(0,e)),r===null||e===r)return o;if(e>r)throw Error(`Length of the window (${e}) may not be larger than frame_length (${r})`);let s=new Float64Array(r),c=i?Math.floor((r-e)/2):0;return s.set(o,c),s}function cf(e,t){let n=e.reduce((e,t)=>e+t.length,0),r=/* @__PURE__ */ new ArrayBuffer(44),i=new DataView(r);return lf(i,0,`RIFF`),i.setUint32(4,36+n*4,!0),lf(i,8,`WAVE`),lf(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,3,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*4,!0),i.setUint16(32,4,!0),i.setUint16(34,32,!0),lf(i,36,`data`),i.setUint32(40,n*4,!0),new Blob([r,...e.map(e=>e.buffer instanceof ArrayBuffer?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e.slice())],{type:`audio/wav`})}function lf(e,t,n){for(let r=0;re+t.length,0),t=new Float32Array(e),n=0;for(let e of this.audio)t.set(e,n),n+=e.length;return t}return this.audio}toBlob(){let e=this.audio;return e instanceof Float32Array&&(e=[e]),cf(e,this.sampling_rate)}async save(e){return Hd(e,this.toBlob())}},df=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hann`,{periodic:!1}),this.mean=this.config.mean,this.std=this.config.std}async _extract_fbank_features(e,t){return of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e){zd(e,`ASTFeatureExtractor`);let t=await this._extract_fbank_features(e,this.config.max_length);if(this.config.do_normalize){let e=this.std*2,n=t.data;for(let t=0;t0){if(n===`rand_trunc`){let n=Math.floor(bc.random()*(a+1));e=e.subarray(n,n+t),i=await this._extract_fbank_features(e,this.mel_filters_slaney,this.config.nb_max_samples)}else throw Error(`Truncation strategy "${n}" not implemented`)}else{if(a<0){let n=new Float64Array(t);if(n.set(e),r===`repeat`)for(let r=e.length;r=1;--n)e[n]-=t*e[n-1];return await of(e,this.window,this.window.length,this.config.hop_length,{fft_length:this.config.n_fft,power:2,mel_filters:this.config.mel_filters,log_mel:`log`,mel_floor:-1/0,pad_mode:`constant`,center:!0,transpose:!0,mel_offset:2**-24})}async _call(e){zd(e,`ParakeetFeatureExtractor`);let t=await this._extract_fbank_features(e),n=Math.floor((e.length+Math.floor(this.config.n_fft/2)*2-this.config.n_fft)/this.config.hop_length),r=t.data;r.fill(0,n*t.dims[1]);let[i,a]=t.dims,o=new Float64Array(a),s=new Float64Array(a);for(let e=0;e1?n-1:1;for(let e=0;e=l){s.push(e.slice(c,l));break}let t=Math.max(c,c+a-o),n=Math.min(c+a,l),i;i=n<=t?c+a:this._find_split_point_energy(e,t,n,r),i=Math.max(c+1,Math.min(i,l)),s.push(e.slice(c,i)),c=i}return s}_find_split_point_energy(e,t,n,r){let i=n-t;if(i<=r)return Math.floor((t+n)/2);let a=1/0,o=t,s=i-r;for(let n=0;n<=s;n+=r){let i=0;for(let a=0;at&&(e=e.slice(0,t)),r&&e.length%i!==0){let t=i-e.length%i,n=new Float64Array(e.length+t);n.set(e),this.config.padding_value!==0&&n.fill(this.config.padding_value,e.length),e=n}let a=await this._extract_fbank_features(e,this.config.max_length),o=_u([1,a.dims[0]],!0);return{input_features:a.unsqueeze_(0),input_features_mask:o}}},bf=class extends yf{async _extract_fbank_features(e,t){let{frame_length:n,hop_length:r,fft_length:i}=this.config,a=Math.floor(n/2),o=Math.floor((e.length+a-(n+1))/r)+1;return of(e,this.window,n,r,{fft_length:i,center:!0,pad_mode:`semicausal`,onesided:!0,preemphasis:this.config.preemphasis,preemphasis_htk_flavor:this.config.preemphasis_htk_flavor,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:this.config.mel_floor,mel_floor_mode:`add`,remove_dc_offset:!1,transpose:!0,max_num_frames:o})}async _call(e,t={}){zd(e,`Gemma4AudioFeatureExtractor`);let n=e.length,r=await super._call(e,t),{input_features:i}=r,[,a,o]=i.dims,{frame_length:s,hop_length:c}=this.config,l=Math.floor(s/2),u=s+1,d=new Uint8Array(n+l+(t.pad_to_multiple_of??128));d.fill(1,l,l+n);let f=new Uint8Array(a);for(let e=0;e({id:e,start:t*n,end:r*n,confidence:i/(r-t)})))}return r}},wf=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`povey`,{periodic:!1})}async _extract_fbank_features(e,t){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e,{padding:t=!0,pad_to_multiple_of:n=2,do_normalize_per_mel_bins:r=!0,return_attention_mask:i=!0}={}){zd(e,`SeamlessM4TFeatureExtractor`);let a=await this._extract_fbank_features(e,this.config.max_length);if(r){let[e,t]=a.dims,n=a.data;for(let r=0;r0){let n=new Float32Array(t*(e+s));n.set(r),n.fill(this.config.padding_value,r.length);let c=e+s;a=new V(a.type,n,[c,t]),i&&(o=new V(`int64`,new BigInt64Array(c),[1,c]),o.data.fill(1n,0,e))}}let[s,c]=a.dims,l=this.config.stride;if(s%l!==0)throw Error(`The number of frames (${s}) must be a multiple of the stride (${l}).`);let u=a.view(1,Math.floor(s/l),c*l),d={input_features:u};if(i){let e=u.dims[1],t=new BigInt64Array(e);if(o){let e=o.data;for(let n=1,r=0;ne+t,0)/e.length,n=e.reduce((e,n)=>e+(n-t)**2,0)/e.length;return e.map(e=>(e-t)/Math.sqrt(n+1e-7))}async _call(e){zd(e,`Wav2Vec2FeatureExtractor`),e instanceof Float64Array&&(e=new Float32Array(e));let t=e;this.config.do_normalize&&(t=this._zero_mean_unit_var_norm(t));let n=[1,t.length];return{input_values:new V(`float32`,t,n),attention_mask:new V(`int64`,new BigInt64Array(t.length).fill(1n),n)}}},Of=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hamming`,{periodic:!1}),this.min_num_frames=this.config.min_num_frames}async _extract_fbank_features(e){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,transpose:!0,min_num_frames:this.min_num_frames})}async _call(e){zd(e,`WeSpeakerFeatureExtractor`);let t=(await this._extract_fbank_features(e)).unsqueeze_(0);if(this.config.fbank_centering_span===null){let e=t.mean(1).data,n=t.data,[r,i,a]=t.dims;for(let t=0;tr?(e.length>this.config.n_samples&&A.warn("Attempting to extract features for audio longer than 30 seconds. If using a pipeline to extract transcript from a long audio clip, remember to specify `chunk_length_s` and/or `stride_length_s`."),n=e.slice(0,r)):(n=new Float32Array(r),n.set(e)),{input_features:(await this._extract_fbank_features(n)).unsqueeze_(0)}}},jf=class{static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t),r=n.feature_extractor_type,i=Bd[r];if(!i)throw Error(`Unknown feature_extractor_type: '${r}'. Please report this at ${Nd}.`);return new i(n)}},Mf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;async _call(e,t=null){let n=this.tokenizer(e),r=t?await this.feature_extractor(t):{};return{...n,...r}}},Nf=/* @__PURE__ */ new Set([`ja`,`zh`]),Pf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;get_decoder_prompt_ids(e=`en`){let t=[`▁`,`<|startofcontext|>`,`<|startoftranscript|>`,`<|emo:undefined|>`,`<|${e}|>`,`<|${e}|>`,`<|pnc|>`,`<|noitn|>`,`<|notimestamp|>`,`<|nodiarize|>`];return this.tokenizer.convert_tokens_to_ids(t)}static join_chunks(e,t=`en`){let n=e.filter(e=>e&&e.trim());if(n.length===0)return``;let r=Nf.has(t)?``:` `;return[n[0].trimEnd(),...n.slice(1).map(e=>e.trim())].join(r)}async _call(e){return await this.feature_extractor(e)}},Ff={},If,Lf,Rf;if(O.IS_WEB_ENV)If=(e,t)=>{if(!self.OffscreenCanvas)throw Error(`OffscreenCanvas not supported by this environment.`);return new self.OffscreenCanvas(e,t)},Rf=self.createImageBitmap,Lf=self.ImageData;else if(Ff)Rf=async e=>{let t=(await e.metadata()).channels,{data:n,info:r}=await e.rotate().raw().toBuffer({resolveWithObject:!0}),i=new Vf(new Uint8ClampedArray(n),r.width,r.height,r.channels);return t!==void 0&&t!==r.channels&&i.convert(t),i};else throw Error(`Unable to load image processing library.`);var zf={0:`nearest`,1:`lanczos`,2:`bilinear`,3:`bicubic`,4:`box`,5:`hamming`},Bf=/* @__PURE__ */ new Map([[`png`,`image/png`],[`jpg`,`image/jpeg`],[`jpeg`,`image/jpeg`],[`gif`,`image/gif`]]),Vf=class e{constructor(e,t,n,r){this.data=e,this.width=t,this.height=n,this.channels=r}get size(){return[this.width,this.height]}static async read(t){if(t instanceof e)return t;if(typeof t==`string`||t instanceof URL)return await this.fromURL(t);if(t instanceof Blob)return await this.fromBlob(t);if(typeof HTMLCanvasElement<`u`&&t instanceof HTMLCanvasElement||typeof OffscreenCanvas<`u`&&t instanceof OffscreenCanvas)return this.fromCanvas(t);throw Error(`Unsupported input type: ${typeof t}`)}static fromCanvas(t){if(!O.IS_WEB_ENV)throw Error(`fromCanvas() is only supported in browser environments.`);let n=t.getContext(`2d`).getImageData(0,0,t.width,t.height).data;return new e(n,t.width,t.height,4)}static async fromURL(e){let t=await Jc(e);if(t.status!==200)throw Error(`Unable to read image from "${e}" (${t.status} ${t.statusText})`);let n=await t.blob();return this.fromBlob(n)}static async fromBlob(e){if(O.IS_WEB_ENV){let t=await Rf(e),n=If(t.width,t.height).getContext(`2d`);return n.drawImage(t,0,0),new this(n.getImageData(0,0,t.width,t.height).data,t.width,t.height,4)}{let t=Ff(await e.arrayBuffer());return await Rf(t)}}static fromTensor(t,n=`CHW`){if(t.dims.length!==3)throw Error(`Tensor should have 3 dimensions, but has ${t.dims.length} dimensions.`);if(n===`CHW`)t=t.permute(1,2,0);else if(n!==`HWC`)throw Error(`Unsupported channel format: ${n}`);if(!(t.data instanceof Uint8ClampedArray||t.data instanceof Uint8Array))throw Error(`Unsupported tensor type: ${t.type}`);switch(t.dims[2]){case 1:case 2:case 3:case 4:return new e(t.data,t.dims[1],t.dims[0],t.dims[2]);default:throw Error(`Unsupported number of channels: ${t.dims[2]}`)}}grayscale(){if(this.channels===1)return this;let e=new Uint8ClampedArray(this.width*this.height*1);switch(this.channels){case 3:case 4:for(let t=0,n=0;t=0?c=r:u=-r,i>=0?l=i:d=-i,s.drawImage(o,c,l,t,n,u,d,t,n),new e(s.getImageData(0,0,t,n).data,t,n,4).convert(a)}{let e=this.toSharp();if(r>=0&&i>=0)e=e.extract({left:Math.floor(r),top:Math.floor(i),width:t,height:n});else if(r<=0&&i<=0){let a=Math.floor(-i),o=Math.floor(-r);e=e.extend({top:a,left:o,right:t-this.width-o,bottom:n-this.height-a})}else{let a=[0,0],o=0;i<0?(a[0]=Math.floor(-i),a[1]=n-this.height-a[0]):o=Math.floor(i);let s=[0,0],c=0;r<0?(s[0]=Math.floor(-r),s[1]=t-this.width-s[0]):c=Math.floor(r),e=e.extend({top:a[0],bottom:a[1],left:s[0],right:s[1]}).extract({left:c,top:o,width:t,height:n})}return await Rf(e)}}async toBlob(e=`image/png`,t=1){if(!O.IS_WEB_ENV)throw Error(`toBlob() is only supported in browser environments.`);return await this.toCanvas().convertToBlob({type:e,quality:t})}toTensor(e=`CHW`){let t=new V(`uint8`,new Uint8Array(this.data),[this.height,this.width,this.channels]);if(e!==`HWC`){if(e===`CHW`)t=t.permute(2,0,1);else throw Error(`Unsupported channel format: ${e}`)}return t}toCanvas(){if(!O.IS_WEB_ENV)throw Error(`toCanvas() is only supported in browser environments.`);let e=this.clone().rgba(),t=If(e.width,e.height),n=new Lf(e.data,e.width,e.height);return t.getContext(`2d`).putImageData(n,0,0),t}split(){let{data:t,width:n,height:r,channels:i}=this,a=t.constructor,o=t.length/i,s=Array.from({length:i},()=>new a(o));for(let e=0;enew e(t,n,r,1))}_update(e,t,n,r=null){return this.data=e,this.width=t,this.height=n,r!==null&&(this.channels=r),this}clone(){return new e(this.data.slice(),this.width,this.height,this.channels)}convert(e){if(this.channels===e)return this;switch(e){case 1:this.grayscale();break;case 3:this.rgb();break;case 4:this.rgba();break;default:throw Error(`Conversion failed due to unsupported number of channels: ${this.channels}`)}return this}async save(e){if(O.IS_WEB_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save an image from a Web Worker.`);let t=e.split(`.`).pop().toLowerCase(),n=Bf.get(t)??`image/png`;return Hd(e,await this.toBlob(n))}if(O.IS_FS_AVAILABLE)await this.toSharp().toFile(e);else throw Error(`Unable to save the image because filesystem is disabled in this environment.`)}toSharp(){if(O.IS_WEB_ENV)throw Error(`toSharp() is only supported in server-side environments.`);return Ff(this.data,{raw:{width:this.width,height:this.height,channels:this.channels}})}};Vf.read.bind(Vf);function Hf(e,t,n=0,r=null){let i=e/t,a=gl(i)*t;return r!==null&&a>r&&(a=Math.floor(i)*t),at&&i.push(e)}else{let e=ll(n.data)[1];if(e===c-1||(a=ol(n.data),a[e]e*o[(t+1)%2])),u.boxes.push(n),u.classes.push(t),u.scores.push(a[t])}}l.push(u)}return l}function Kf(e,t=null){let n=e.logits,r=n.dims[0];if(t!==null&&t.length!==r)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let i=[];for(let e=0;el[n]&&(l[n]=t[n],u[n]=e)}let d=Array(a.dims[0]);for(let e=0;ee!==void 0);i.push({segmentation:c,labels:f})}return i}function qf(e,t,n,r){let i=[],a=[],o=[];for(let s=0;sn&&(i.push(l),a.push(d),o.push(u))}return[i,a,o]}function Jf(e,t,n,r=.5,i=.8){let a=[],o=0,s=0,c=t[n].data;for(let t=0;t=r&&++s;let l=o>0&&s>0;return l&&=o/s>i,[l,a]}function Yf(e,t,n,r,i,a=null,o=null){let[s,c]=o??e[0].dims,l=new V(`int32`,new Int32Array(s*c),[s,c]),u=[];if(o!==null)for(let t=0;tf[e]&&(d[e]=n,f[e]=i[e])}let p=0,m=l.data;for(let a=0;a200)throw Error(`absolute aspect ratio must be smaller than 200, got ${Math.max(e,t)/Math.min(e,t)}`);let o=Math.round(e/n)*n,s=Math.round(t/n)*n;if(a*o*s>i){let r=Math.sqrt(a*e*t/i);o=Math.max(n,Math.floor(e/r/n)*n),s=Math.max(n,Math.floor(t/r/n)*n)}else if(a*o*si?c=Math.floor(i*s/r):i>r&&(s=Math.floor(r*c/i)),await e.resize(c,s,{resample:n}))}async crop_margin(e,t=200){let n=e.clone().grayscale(),r=cl(n.data)[0],i=ll(n.data)[0]-r;if(i===0)return e;let a=t/255,o=n.width,s=n.height,c=0,l=0,u=n.data;for(let e=0;ethis.preprocess(e)));return{pixel_values:du(n.map(e=>e.pixel_values),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}static async from_pretrained(e,t={}){let n=await rl(e,Fd,!0,t);return new this(n)}},$f={};Sr($f,{BeitFeatureExtractor:()=>ep,BitImageProcessor:()=>tp,CHMv2ImageProcessor:()=>rp,CLIPFeatureExtractor:()=>ap,CLIPImageProcessor:()=>ip,ChineseCLIPFeatureExtractor:()=>np,ConvNextFeatureExtractor:()=>sp,ConvNextImageProcessor:()=>op,DINOv3ViTImageProcessor:()=>fp,DPTFeatureExtractor:()=>gp,DPTImageProcessor:()=>hp,DeiTFeatureExtractor:()=>lp,DeiTImageProcessor:()=>cp,DetrFeatureExtractor:()=>dp,DetrImageProcessor:()=>up,DonutFeatureExtractor:()=>mp,DonutImageProcessor:()=>pp,EfficientNetImageProcessor:()=>_p,GLPNFeatureExtractor:()=>wp,Gemma3ImageProcessor:()=>vp,Gemma4ImageProcessor:()=>xp,Glm46VImageProcessor:()=>Cp,GroundingDinoImageProcessor:()=>Tp,Idefics3ImageProcessor:()=>Ep,ImageFeatureExtractor:()=>K,ImageProcessor:()=>K,JinaCLIPImageProcessor:()=>Op,Lfm2VlImageProcessor:()=>Pp,LlavaOnevisionImageProcessor:()=>Fp,Mask2FormerImageProcessor:()=>Rp,MaskFormerFeatureExtractor:()=>Lp,MaskFormerImageProcessor:()=>Ip,MobileNetV1FeatureExtractor:()=>Bp,MobileNetV1ImageProcessor:()=>zp,MobileNetV2FeatureExtractor:()=>Hp,MobileNetV2ImageProcessor:()=>Vp,MobileNetV3FeatureExtractor:()=>Wp,MobileNetV3ImageProcessor:()=>Up,MobileNetV4FeatureExtractor:()=>Kp,MobileNetV4ImageProcessor:()=>Gp,MobileViTFeatureExtractor:()=>Jp,MobileViTImageProcessor:()=>qp,NougatImageProcessor:()=>Yp,OwlViTFeatureExtractor:()=>Zp,OwlViTImageProcessor:()=>Xp,Owlv2ImageProcessor:()=>Qp,Phi3VImageProcessor:()=>im,PixtralImageProcessor:()=>am,PvtImageProcessor:()=>om,Qwen2VLImageProcessor:()=>Sp,RTDetrImageProcessor:()=>sm,Sam2ImageProcessor:()=>cm,Sam3ImageProcessor:()=>cm,SamImageProcessor:()=>cm,SapiensFeatureExtractor:()=>um,SapiensImageProcessor:()=>lm,SegformerFeatureExtractor:()=>fm,SegformerImageProcessor:()=>dm,SiglipImageProcessor:()=>pm,SmolVLMImageProcessor:()=>Ep,Swin2SRImageProcessor:()=>mm,VLMImageProcessor:()=>Dp,ViTFeatureExtractor:()=>gm,ViTImageProcessor:()=>hm,VitMatteImageProcessor:()=>_m,VitPoseImageProcessor:()=>vm,YolosFeatureExtractor:()=>bm,YolosImageProcessor:()=>ym});var ep=class extends K{},tp=class extends K{},np=class extends K{},rp=class extends K{},ip=class extends K{},ap=class extends ip{},op=class extends K{constructor(e){super(e),this.crop_pct=this.config.crop_pct??224/256}async resize(e){let t=this.size?.shortest_edge;if(t===void 0)throw Error(`Size dictionary must contain 'shortest_edge' key.`);if(t<384){let n=Math.floor(t/this.crop_pct),[r,i]=this.get_resize_output_image_size(e,{shortest_edge:n});e=await e.resize(r,i,{resample:this.resample}),e=await e.center_crop(t,t)}else e=await e.resize(t,t,{resample:this.resample});return e}},sp=class extends op{},cp=class extends K{},lp=class extends cp{},up=class extends K{async _call(e){let t=await super._call(e),n=_u([t.pixel_values.dims[0],64,64],1n);return{...t,pixel_mask:n}}post_process_object_detection(...e){return Gf(...e)}post_process_panoptic_segmentation(...e){return Zf(...e)}post_process_instance_segmentation(...e){return Qf(...e)}},dp=class extends up{},fp=class extends K{},pp=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t,s=this.image_mean;Array.isArray(this.image_mean)||(s=Array(o).fill(s));let c=this.image_std;Array.isArray(c)||(c=Array(o).fill(s));let l=s.map((e,t)=>-e/c[t]);return super.pad_image(e,t,n,{center:!0,constant_values:l,...r})}},mp=class extends pp{},hp=class extends K{},gp=class extends hp{},_p=class extends K{constructor(e){super(e),this.include_top=this.config.include_top??!0,this.include_top&&(this.image_std=this.image_std.map(e=>e*e))}},vp=class extends K{};function yp(e,t,n,r,i){let a=r*n**2,o=Math.sqrt(a/(e*t)),s=i*n,c=Math.floor(o*e/s)*s,l=Math.floor(o*t/s)*s;if(c===0&&l===0)throw Error(`Attempting to resize to a 0 x 0 image. Resized height should be divisible by \`pooling_kernel_size * patch_size\`=${s}.`);let u=Math.floor(r/i**2)*s;return c===0?(c=s,l=Math.min(Math.floor(t/e)*s,u)):l===0&&(l=s,c=Math.min(Math.floor(e/t)*s,u)),[c,l]}function bp(e,t,n,r,i,a,o){let s=Math.floor(t/i),c=Math.floor(n/i),l=s*c,u=i*i*r,d=new Float32Array(a*u),f=0;for(let t=0;ta),0));let l=a.dims[0]/o,u=a.dims[1],d=Math.floor(a.dims[2]/c),f=Math.floor(a.dims[3]/c);return{pixel_values:a.view(l,o,u,Math.floor(d/s),s,c,Math.floor(f/s),s,c).permute(0,3,6,4,7,2,1,5,8).view(l*d*f,u*o*c*c),image_grid_thw:new V(`int64`,[l,d,f],[1,3]),original_sizes:r,reshaped_input_sizes:i}}},Cp=class extends Sp{get_resize_output_image_size(e,t){let n=this.patch_size*this.merge_size,r=this.config.temporal_patch_size??2;return Xf(e.height,e.width,n,this.min_pixels,this.max_pixels,r)}},wp=class extends K{},Tp=class extends K{async _call(e){let t=await super._call(e),n=t.pixel_values.dims,r=yu([n[0],n[2],n[3]]);return{...t,pixel_mask:r}}},Ep=class extends K{constructor(e){super(e),this.do_image_splitting=e.do_image_splitting??!0,this.max_image_size=e.max_image_size}get_resize_for_vision_encoder(e,t){let[n,r]=e.dims.slice(-2),i=r/n;return r>=n?(r=Math.ceil(r/t)*t,n=Math.floor(r/i),n=Math.ceil(n/t)*t):(n=Math.ceil(n/t)*t,r=Math.floor(n*i),r=Math.ceil(r/t)*t),{height:n,width:r}}async _call(e,{do_image_splitting:t=null,return_row_col_info:n=!1}={}){let r;if(!Array.isArray(e))r=[[e]];else{if(e.length===0||!e[0])throw Error(`No images provided.`);r=Array.isArray(e[0])?e:[e]}let i=[],a=[],o=[],s=[],c=[];for(let e of r){let n=await Promise.all(e.map(e=>this.preprocess(e)));s.push(...n.map(e=>e.original_size)),c.push(...n.map(e=>e.reshaped_input_size)),n.forEach(e=>e.pixel_values.unsqueeze_(0));let{longest_edge:r}=this.max_image_size,l;if(t??this.do_image_splitting){let e=Array(n.length),t=Array(n.length);l=await Promise.all(n.map(async(n,i)=>{let a=this.get_resize_for_vision_encoder(n.pixel_values,r),o=await nu(n.pixel_values,{size:[a.height,a.width]}),{frames:s,num_splits_h:c,num_splits_w:l}=await this.split_image(o,this.max_image_size);return e[i]=c,t[i]=l,H(s,0)})),a.push(e),o.push(t)}else{let e=[r,r];l=await Promise.all(n.map(t=>nu(t.pixel_values,{size:e}))),a.push(Array(n.length).fill(0)),o.push(Array(n.length).fill(0))}i.push(H(l,0))}let l=i.length,[u,d,f,p]=i[0].dims,m,h;if(l===1)m=i[0].unsqueeze_(0),h=_u([l,u,f,p],!0);else{let e=Math.max(...i.map(e=>e.dims.at(0)));h=_u([l,e,f,p],!0);let t=h.data,n=e*f*p;for(let r=0;rn||o>r){s=Math.ceil(a/n),c=Math.ceil(o/r);let t=Math.ceil(a/s),l=Math.ceil(o/c);for(let n=0;ne*this.rescale_factor)}pad_image(e,t,n,r){return super.pad_image(e,t,n,{constant_values:this.constant_values,center:!0,...r})}},Op=class extends K{constructor(e){let{resize_mode:t,fill_color:n,interpolation:r,size:i,...a}=e,o=t===`squash`?{width:i,height:i}:t===`shortest`?{shortest_edge:i}:{longest_edge:i},s=r===`bicubic`?3:2;super({...a,size:o,resample:s,do_center_crop:!0,crop_size:i,do_normalize:!0})}};function kp(e,t){return Math.round(e/t)*t}function Ap(e,t,n,r,i){let a=1/0,o=[1,1],s=n*r;for(let n of t){let t=Math.abs(e-n[0]/n[1]);t.5*i*i*n[0]*n[1]&&(o=n)}return o}function jp(e,t){let n=[],r=/* @__PURE__ */ new Set;for(let i=e;i<=t;++i)for(let a=1;a<=i;++a)for(let o=1;o<=i;++o){let i=a*o;if(i>=e&&i<=t){let e=a<<16|o;r.has(e)||(r.add(e),n.push([a,o]))}}return n.sort((e,t)=>e[0]*e[1]-t[0]*t[1])}function Mp(e,t){let[n,r,i,a]=e.dims,o=Math.floor(i/t),s=Math.floor(a/t),c=t*t*r,l=e.data,u=new Float32Array(n*o*s*c),d=i*a;for(let e=0;ethis.max_image_tokens*(this.encoder_patch_size*this.downsample_factor)**2*this.max_pixels_tolerance}_get_grid_layout(e,t){let n=jp(this.min_tiles,this.max_tiles),[r,i]=Ap(t/e,n,t,e,this.tile_size);return{grid_width:r,grid_height:i,target_width:this.tile_size*r,target_height:this.tile_size*i}}async _call(e,{return_row_col_info:t=null}={}){let n;n=Array.isArray(e)?Array.isArray(e[0])?e:[e]:[[e]];let r=[],i=[],a=[],o=[],s=[],c=[];for(let e of n){let t=await Promise.all(e.map(e=>this.preprocess(e,{do_pad:!1})));for(let{pixel_values:e}of t){let[,t,n]=e.dims,l=e.unsqueeze_(0),u=this.encoder_patch_size*this.downsample_factor,d=u**2,[f,p]=Xf(Math.max(u,t),Math.max(u,n),u,this.min_image_tokens*d,this.max_image_tokens*d).map(e=>Math.max(u,e)),m,h=1,g=1,_=this._is_image_too_large(t,n),v=this.do_image_splitting&&(this.min_tiles!==1||this.max_tiles!==1);if(_&&v){let{grid_width:e,grid_height:r,target_width:i,target_height:a}=this._get_grid_layout(t,n);h=r,g=e;let o=await nu(l,{size:[a,i]});m=[];for(let t=0;t(e-this.image_mean[t])/this.image_std[t]);return super.pad_image(e,t,{width:s,height:o},{center:!0,constant_values:c,...r})}async _call(e,{num_crops:t=null}={}){if(this._num_crops=t??=this.config.num_crops,t<4||rm(t)%1!=0)throw Error(`num_crops must be a square number >= 4`);Array.isArray(e)||(e=[e]);let n=e.length,r=await Promise.all(e.map(e=>this.preprocess(e))),i=r.map(e=>e.original_size),a=r.map(e=>e.reshaped_input_size),o=[];for(let{pixel_values:e}of r){e.unsqueeze_(0);let[n,r]=e.dims.slice(-2),i=await nu(e,{size:[$p,$p],mode:`bicubic`});if(t>0){let a=[],s=rm(t),c=nm(r/s),l=nm(n/s);for(let t=0;te.map(e=>$p*tm(e/$p)));return{pixel_values:s,original_sizes:i,reshaped_input_sizes:a,image_sizes:new V(`int64`,c.flat(),[n,2]),num_img_tokens:c.map(([e,t])=>this.calc_num_image_tokens_from_image_size(t,e))}}},am=class extends K{get_resize_output_image_size(e,t){let{longest_edge:n}=t;if(n===void 0)throw Error(`size must contain 'longest_edge'`);let[r,i]=e.size,a=Math.max(r,i)/n,o=r,s=i;a>1&&(o=Math.floor(r/a),s=Math.floor(i/a));let{patch_size:c,spatial_merge_size:l}=this.config;if(!l)throw Error(`config must contain 'spatial_merge_size'`);let u=c*l,d=Math.floor((o-1)/u)+1,f=Math.floor((s-1)/u)+1;return[d*u,f*u]}},om=class extends K{},sm=class extends K{post_process_object_detection(...e){return Gf(...e)}},cm=class extends K{reshape_input_points(e,t,n,r=!1){e=structuredClone(e);let i=ii(e);if(i.length===3)r||(i=[1,...i]),e=[e];else if(i.length!==4)throw Error("The input_points must be a 4D tensor of shape `batch_size`, `point_batch_size`, `nb_points_per_image`, `2`.");for(let r=0;re!==t.dims[n]))throw Error(`The first ${n.length} dimensions of 'input_points' and 'input_labels' must be the same.`);return new V(`int64`,e.flat(1/0).map(BigInt),n)}async _call(e,{input_points:t=null,input_labels:n=null,input_boxes:r=null}={}){let i=await super._call(e);if(t&&(i.input_points=this.reshape_input_points(t,i.original_sizes,i.reshaped_input_sizes)),n){if(!i.input_points)throw Error("`input_points` must be provided if `input_labels` are provided.");i.input_labels=this.add_input_labels(n,i.input_points)}return r&&(i.input_boxes=this.reshape_input_points(r,i.original_sizes,i.reshaped_input_sizes,!0)),i}async post_process_masks(e,t,n,{mask_threshold:r=0,binarize:i=!0,pad_size:a=null}={}){let o=[];a=a??this.pad_size??this.size;let s=[a.height,a.width];for(let a=0;ar&&(t[n]=1);u=new V(`bool`,t,u.dims)}o.push(u)}return o}generate_crop_boxes(e,t,{crop_n_layers:n=0,overlap_ratio:r=512/1500,points_per_crop:i=32,crop_n_points_downscale_factor:a=1}={}){}},lm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},um=class extends lm{},dm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},fm=class extends dm{},pm=class extends K{},mm=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t;return super.pad_image(e,t,{width:a+(n-a%n)%n,height:i+(n-i%n)%n},{mode:`symmetric`,center:!1,constant_values:-1,...r})}},hm=class extends K{},gm=class extends hm{},_m=class extends K{async _call(e,t){Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let n=await Promise.all(e.map(e=>this.preprocess(e))),r=await Promise.all(t.map(e=>this.preprocess(e,{do_normalize:!1,do_convert_rgb:!1,do_convert_grayscale:!0})));return{pixel_values:du(n.map((e,t)=>H([e.pixel_values,r[t].pixel_values],0)),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}},vm=class extends K{post_process_pose_estimation(e,t,{threshold:n=null}={}){let r=e.tolist(),[i,a,o,s]=e.dims,c=[];for(let e=0;e/gm,bboxes:/([^<]+)?/gm},this.size_per_bin=1e3}construct_prompts(e){typeof e==`string`&&(e=[e]);let t=[];for(let n of e)if(this.task_prompts_without_inputs.has(n))t.push(this.task_prompts_without_inputs.get(n));else{for(let[e,r]of this.task_prompts_with_input)if(n.includes(e)){t.push(r.replaceAll(`{input}`,n).replaceAll(e,``));break}t.length!==e.length&&t.push(n)}return t}post_process_generation(e,t,n){let r=this.tasks_answer_post_processing_type.get(t)??`pure_text`;e=e.replaceAll(``,``).replaceAll(``,``);let i;switch(r){case`pure_text`:i=e;break;case`description_with_bboxes`:case`bboxes`:case`phrase_grounding`:case`ocr`:let a=r===`ocr`?`quad_boxes`:`bboxes`,o=e.matchAll(this.regexes[a]),s=[],c=[];for(let[e,t,...r]of o)s.push(t?t.trim():s.at(-1)??``),c.push(r.map((e,t)=>(Number(e)+.5)/this.size_per_bin*n[t%2]));i={labels:s,[a]:c};break;default:throw Error(`Task "${t}" (of type "${r}") not yet implemented.`)}return{[t]:i}}async _call(e,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=await this.image_processor(e,n),i=t?this.tokenizer(this.construct_prompts(t),n):{};return{...r,...i}}},Cm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.image_seq_length=this.config.image_seq_length;let{boi_token:r,image_token:i,eoi_token:a}=this.tokenizer.config;this.boi_token=r,this.image_token=i,this.eoi_token=a;let o=i.repeat(this.image_seq_length);this.full_image_sequence=` - -${r}${o}${a} - -`}async _call(e,t=null,n={}){typeof e==`string`&&(e=[e]);let r;return t&&(r=await this.image_processor(t,n),e=e.map(e=>e.replaceAll(this.boi_token,this.full_image_sequence))),{...this.tokenizer(e,n),...r}}},wm=class extends G{static image_processor_class=xm;static feature_extractor_class=jf;static tokenizer_class=W;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_seq_length=this.config.audio_seq_length,this.image_seq_length=this.config.image_seq_length;let{audio_token_id:r,boa_token:i,audio_token:a,eoa_token:o,image_token_id:s,boi_token:c,image_token:l,eoi_token:u}=this.tokenizer.config;this.audio_token_id=r,this.boa_token=i,this.audio_token=a;let d=a.repeat(this.audio_seq_length);this.full_audio_sequence=` - -${i}${d}${o} - -`,this.image_token_id=s,this.boi_token=c,this.image_token=l;let f=l.repeat(this.image_seq_length);this.full_image_sequence=` - -${c}${f}${u} - -`}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;n&&(i=await this.feature_extractor(n,r),e=e.map(e=>e.replaceAll(this.audio_token,this.full_audio_sequence)));let a;return t&&(a=await this.image_processor(t,r),e=e.map(e=>e.replaceAll(this.image_token,this.full_image_sequence))),{...this.tokenizer(e,r),...a,...i}}},Tm=class extends G{static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_ms_per_token=this.config.audio_ms_per_token??40,this.audio_seq_length=this.config.audio_seq_length??750,this.image_seq_length=this.config.image_seq_length??280;let{audio_token:r,boa_token:i,eoa_token:a,image_token:o,boi_token:s,eoi_token:c}=this.tokenizer.config;this.audio_token=r,this.boa_token=i,this.eoa_token=a,this.image_token=o,this.boi_token=s,this.eoi_token=c}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([rl(e,Id,!0,t),W.from_pretrained(e,t),nl(e,Ld,!1,t)]),a={tokenizer:r};return n.image_processor&&(a.image_processor=new xp(n.image_processor)),n.feature_extractor&&(a.feature_extractor=new bf(n.feature_extractor)),new this(n,a,i)}_compute_audio_num_tokens(e,t){let n=Math.round(t*20/1e3),r=Math.round(t*10/1e3),i=Math.floor(n/2),a=Math.floor((e+i-n-1)/r)+1;if(a<=0)return 0;for(let e=0;e<2;++e)a=Math.floor((a-1)/2)+1;return Math.min(a,this.audio_seq_length)}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;if(t){i=await this.image_processor(t,r);let n=i.num_soft_tokens_per_image,a=0;e=e.map(e=>e.replaceAll(this.image_token,()=>` - -${this.boi_token}${this.image_token.repeat(n[a++])}${this.eoi_token} - -`))}let a;if(n){let t=Array.isArray(n)?n:[n];a=await this.feature_extractor(t[0],r);let i=this.feature_extractor.config.sampling_rate??16e3,o=0;e=e.map(e=>e.replaceAll(this.audio_token,()=>` - -${this.boa_token}${this.audio_token.repeat(this._compute_audio_num_tokens(t[o++].length,i))}${this.eoa_token} - -`))}return{...this.tokenizer(e,r),...i,...a}}},Em=class extends G{static image_processor_class=xm;static tokenizer_class=W;static image_token=`<|image_pad|>`;async _call(e,t=null,...n){Array.isArray(e)||(e=[e]);let r,i;if(t&&(r=await this.image_processor(t),i=r.image_grid_thw),i){let t=this.image_processor.config.merge_size**2,n=0,r=this.constructor.image_token,a=i.tolist();e=e.map(e=>{for(;e.includes(r);){let i=Number(a[n++].reduce((e,t)=>e*t,1n));e=e.replace(r,`<|placeholder|>`.repeat(Math.floor(i/t)))}return e.replaceAll(`<|placeholder|>`,r)})}return{...this.tokenizer(e),...r}}},Dm=class extends Em{static image_token=`<|image|>`},Om=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;_get_num_audio_features(e){let{hop_length:t}=this.feature_extractor.config.melspec_kwargs,{projector_window_size:n,projector_downsample_rate:r}=this.feature_extractor.config,i=Math.floor(n/r),a=Math.floor(e/t)+1,o=Math.floor(a/2);return Math.ceil(o/n)*i}async _call(e,t=null,n={}){if(Array.isArray(e))throw Error(`Batched inputs are not supported yet.`);let r={};if(t){let{input_features:n}=await this.feature_extractor(t);r.input_features=n;let i=this._get_num_audio_features(t.length);r.input_features_mask=new V(`bool`,new Uint8Array(i).fill(1),[1,i]);let a=this.config.audio_token??`<|audio|>`;if(!e.includes(a))throw Error(`The input text does not contain the audio token ${a}.`);e=e.replaceAll(a,a.repeat(i))}return{...this.tokenizer(e,{add_special_tokens:!1,...n}),...r}}};function km(e,t){let n=e.dims.at(-1)-1,r=e.tolist();r.fill(!1,0,1),r.fill(!1,n);let i=t.tolist();return r.map((e,t)=>e?t:null).filter(e=>e!==null).map(e=>i[e])}var Am=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t,n={}){let r=e?await this.image_processor(e,n):{};return{...t?this.tokenizer(t,n):{},...r}}post_process_grounded_object_detection(e,t,{box_threshold:n=.25,text_threshold:r=.25,target_sizes:i=null}={}){let{logits:a,pred_boxes:o}=e,s=a.dims[0];if(i!==null&&i.length!==s)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let c=a.dims.at(1),l=a.sigmoid(),u=l.max(-1).tolist(),d=o.tolist().map(e=>e.map(e=>Wf(e))),f=[];for(let e=0;ee.map((e,t)=>e*a[(t+1)%2])));let o=u[e],s=[],p=[],m=[];for(let i=0;i`+i.repeat(e);o+=` -`}return o+=` -${r}${a}`+i.repeat(e)+`${r}`,o}function Mm(e,t,n,r){return`${t}${r}`+n.repeat(e)+`${t}`}function Nm(e,t,n,r,i,a){return e===0&&t===0?Mm(n,r,i,a):jm(n,e,t,r,i,a)}var Pm=class extends G{static image_processor_class=xm;static tokenizer_class=W;static uses_processor_config=!0;fake_image_token=``;image_token=``;global_img_token=``;async _call(e,t=null,n={}){n.return_row_col_info??=!0;let r;t&&(r=await this.image_processor(t,n)),Array.isArray(e)||(e=[e]);let i=r.rows??[Array(e.length).fill(0)],a=r.cols??[Array(e.length).fill(0)],o=this.config.image_seq_len,s=[],c=[];for(let t=0;tNm(e,l[t],o,this.fake_image_token,this.image_token,this.global_img_token)),d=n.split(this.image_token);if(d.length===0)throw Error(`The image token should be present in the text.`);let f=d[0];for(let e=0;ee.images).flatMap(e=>e.images).map(e=>Vf.read(e)));let r=this.tokenizer,i=r.apply_chat_template(e,{tokenize:!1,add_generation_prompt:!0,chat_template:n}),a=e=>r.encode(e,{add_special_tokens:!1}),o=i.split(this.image_tag),s=o.length-1;if(t.length!==s)throw Error(`Number of images provided (${t.length}) does not match number of "${this.image_tag}" image tags (${s})`);let[c,l,u]=r.convert_tokens_to_ids([this.image_tag,this.image_start_tag,this.image_end_tag]),d=a(o[0]),f=Array(d.length).fill(!1);for(let e=1;e0){let e=await this.image_processor(t);return e.pixel_values.unsqueeze_(0),{...m,...e}}return m}},Im=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e=null,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=e?this.tokenizer(e,n):{},i=t?await this.image_processor(t,n):{};return{...r,...i}}},Lm=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t=null,n={}){let{image_rows:r,image_cols:i,image_sizes:a,...o}=await this.image_processor(e,{...n,return_row_col_info:!0});if(t){let e=this.config.image_token??``,{tile_size:n=512,downsample_factor:o=2,encoder_patch_size:s=16,use_thumbnail:c=!0}=this.image_processor.config,l=e=>Math.ceil(Math.floor(e/s)/o),u=l(n)**2,d=this.config.image_start_token??`<|image_start|>`,f=this.config.image_end_token??`<|image_end|>`,p=this.config.image_thumbnail??`<|img_thumbnail|>`;Array.isArray(t)||(t=[t]);let m=0;t=t.map(t=>{let n=t.split(e);return n[0]+n.slice(1).map(t=>{let n=m++,[o,s]=a[n],h=r[n],g=i[n],_=l(o)*l(s),v=d;if(h>1||g>1){let t=e.repeat(u);for(let e=0;e`+t;c&&(v+=p+e.repeat(_))}else v+=e.repeat(_);return v+f+t}).join(``)})}return{...o,...t?this.tokenizer(t,n):{}}}},Rm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,patch_size:a,num_additional_image_tokens:o}=this.config,s=Math.floor(e/a)*Math.floor(n/a)+o;t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;e0?i.reduce((e,t)=>e*t,1):0;c.push(n),s.push(a)}return[i(c),s]}char_decode(e){return this.char_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}bpe_decode(e){return this.bpe_tokenizer.batch_decode(e)}wp_decode(e){return this.wp_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}batch_decode([e,t,n]){let[r,i]=this._decode_helper(e,`char`),[a,o]=this._decode_helper(t,`bpe`),[s,c]=this._decode_helper(n,`wp`),l=[],u=[];for(let e=0;e`;function Wm(e,t,n,r,i){return`${r.repeat(n*i)}${t}${e} -`}var Gm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!1;async _call(e,t=null,n={}){t||=(A.warn(`You are using PaliGemma without a text prefix. It will perform as a picture-captioning model.`),``),Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let r=this.tokenizer.bos_token,i=this.image_processor.config.image_seq_length,a;t.some(e=>e.includes(Um))?a=t.map(e=>{let t=e.replaceAll(Um,Um.repeat(i)),n=t.lastIndexOf(Um),a=n===-1?0:n+Um.length;return t.slice(0,a)+r+t.slice(a)+` -`}):(A.warn("You are passing both `text` and `images` to `PaliGemmaProcessor`. The processor expects special image tokens in the text, as many tokens as there are images per each text. It is recommended to add `` tokens in the very beginning of your text. For this call, we will infer how many images each text has and add special tokens."),a=t.map(t=>Wm(t,r,i,Um,e.length)));let o=this.tokenizer(a,n);return{...await this.image_processor(e,n),...o}}},Km=`<|image|>`,qm=/<\|image_\d+\|>/g,Jm=class extends G{static image_processor_class=xm;static tokenizer_class=W;async _call(e,t=null,{padding:n=!0,truncation:r=!0,num_crops:i=null}={}){Array.isArray(e)||(e=[e]);let a,o;if(t){o=await this.image_processor(t,{num_crops:i});let{num_img_tokens:s}=o,c=e.map((e,t)=>e.split(qm).join(Km.repeat(s[t])));a=this.tokenizer(c,{padding:n,truncation:r});let l=this.tokenizer._tokenizer.token_to_id(Km);a.input_ids.map_(e=>e==l?-e:e)}else a=this.tokenizer(e);return{...a,...o}}},Ym=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,image_break_token:a,image_end_token:o,patch_size:s,spatial_merge_size:c}=this.config,l=s*c,u=Math.floor(e/l),d=Math.floor(n/l);t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;esh(e,o)),c=s.map(e=>e.length),l=s.flat(),u=(await Promise.all(l.map(e=>this.feature_extractor(e,n)))).map(e=>e.input_features);r.audio_values=u.length>1?H(u,0):u[0];let d=i[0];for(let e=0;e0){if(l>Tc)throw Error(`The number of external data chunks (${l}) exceeds the maximum allowed value (${Tc}).`);let t=Th(o,l);for(let n of t){let t=`${r.subfolder??``}/${n}`;c.push(new Promise(async(i,a)=>{let o=await tl(e,t,!0,r,s);i(o instanceof Uint8Array?{path:n,data:o}:n)}))}}else a.externalData!==void 0&&(c=a.externalData.map(async t=>{if(typeof t.data==`string`){let n=await tl(e,t.data,!0,r);return{...t,data:n}}return t}));return Promise.all(c)}async function Oh(e,t,n,r=!1,i=void 0){let a=n.config?.[`transformers.js_config`]??{},o=Gl(n.device??a.device,t,{warn:e=>A.info(e)}),s=jl(o),c=a.device_config??{};c.hasOwnProperty(o)&&(a={...a,...c[o]});let l=Zl(n.dtype??a.dtype,t,o,{configDtype:a.dtype,warn:e=>A.info(e)});if(!Xl.hasOwnProperty(l))throw Error(`Invalid dtype: ${l}. Should be one of: ${Object.keys(ql).join(`, `)}`);if(o===`webgpu`&&!O.IS_NODE_ENV&&l===ql.fp16&&!await Kl())throw Error(`The device (${o}) does not support fp16.`);let u=Xl[l],d={...n.session_options};d.executionProviders??=s;let f=a.free_dimension_overrides;f?d.freeDimensionOverrides??=f:o.startsWith(`webnn`)&&!d.freeDimensionOverrides&&A.warn(`WebNN does not currently support dynamic shapes and requires 'free_dimension_overrides' to be set in config.json, preferably as a field within config["transformers.js_config"]["device_config"]["${o}"]. When 'free_dimension_overrides' is not set, you may experience significant performance degradation.`);let p=Eh(e,t,n,u),m=await Dh(e,t,u,n,n.use_external_data_format??a.use_external_data_format,d);if(m.length>0&&(!O.IS_NODE_ENV||m.some(e=>typeof e!=`string`))&&(d.externalData=m),r&&o===`webgpu`){let e=bh(n.config,{prefix:`present`,session_name:i});if(e.size>0&&!Bl()){let t={};for(let n of e)t[n]=`gpu-buffer`;d.preferredOutputLocation=t}}return{buffer_or_path:await p,session_options:d,session_config:{dtype:l,device:o}}}async function kh(e,t,n,r=void 0){return Object.fromEntries(await Promise.all(Object.keys(t).map(async i=>{let a=r?.[i]??!1,{buffer_or_path:o,session_options:s,session_config:c}=await Oh(e,t[i],n,a,i);return[i,await Fl(o,s,c)]})))}function Ah(e){for(let t in e)Rl(e[t])?e[t]=new V(e[t]):typeof e[t]==`object`&&Ah(e[t]);return e}async function q(e,t){let n=jh(e,t);try{return Ah(await Ll(e,Object.fromEntries(Object.entries(n).map(([e,t])=>{let n=t.ort_tensor;return O.IS_NODE_ENV&&typeof Float16Array<`u`&&n.cpuData instanceof Float16Array&&(n.cpuData=new Uint16Array(n.cpuData.buffer)),[e,n]}))))}catch(e){let t=Object.fromEntries(Object.entries(n).map(([e,t])=>{let n={type:t.type,dims:t.dims,location:t.location};return n.location!==`gpu-buffer`&&(n.data=t.data),[e,n]}));throw A.error(`An error occurred during model execution: "${e}".`),A.error(`Inputs given to model:`,t),e}}function jh(e,t){let n=/* @__PURE__ */ Object.create(null),r=[];for(let i of e.inputNames){let e=t[i];if(!(e instanceof V)){r.push(i);continue}n[i]=Bl()?e.clone():e}if(r.length>0)throw Error(`An error occurred during model execution: "Missing the following inputs: ${r.join(`, `)}.`);let i=Object.keys(t).length,a=e.inputNames.length;if(i>a){let n=Object.keys(t).filter(t=>!e.inputNames.includes(t));A.warn(`WARNING: Too many inputs were provided (${i} > ${a}). The following inputs will be ignored: "${n.join(`, `)}".`)}return n}var Mh=class{},Nh=class extends Mh{constructor({last_hidden_state:e,hidden_states:t=null,attentions:n=null}){super(),this.last_hidden_state=e,this.hidden_states=t,this.attentions=n}},J=class extends Mh{constructor({logits:e,...t}){super(),this.logits=e;let n=Object.values(t);n.length>0&&(this.attentions=n)}},Ph=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Fh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Ih=class extends Mh{constructor({start_logits:e,end_logits:t}){super(),this.start_logits=e,this.end_logits=t}},Lh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Rh=class extends Mh{constructor({logits:e,past_key_values:t}){super(),this.logits=e,this.past_key_values=t}},zh=class extends Mh{constructor({logits:e,past_key_values:t,encoder_outputs:n,decoder_attentions:r=null,cross_attentions:i=null}){super(),this.logits=e,this.past_key_values=t,this.encoder_outputs=n,this.decoder_attentions=r,this.cross_attentions=i}},Bh=class extends Mh{constructor({alphas:e}){super(),this.alphas=e}},Vh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Hh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Uh=class extends $r{constructor(){super(),this.processors=[]}push(e){this.processors.push(e)}extend(e){this.processors.push(...e)}_call(e,t){let n=t;for(let t of this.processors)n=t(e,n);return n}[Symbol.iterator](){return this.processors.values()}},Wh=class extends Vh{constructor(e){super(),this.bos_token_id=e}_call(e,t){for(let n=0;n=1&&i[i.length-1]>=this.timestamp_begin,o=i.length<2||i[i.length-2]>=this.timestamp_begin;if(a&&(o?r.subarray(this.timestamp_begin).fill(-1/0):r.subarray(0,this.eos_token_id).fill(-1/0)),e[n].length===this.begin_index&&this.max_initial_timestamp_index!==null){let e=this.timestamp_begin+this.max_initial_timestamp_index;r.subarray(e+1).fill(-1/0)}let s=sl(r);Math.log(s.subarray(this.timestamp_begin).map(Math.exp).reduce((e,t)=>e+t))>ll(s.subarray(0,this.timestamp_begin))[0]&&r.subarray(0,this.timestamp_begin).fill(-1/0)}return t}},Yh=class extends Vh{constructor(e){super(),this.no_repeat_ngram_size=e}getNgrams(e){let t=e.length,n=[];for(let r=0;r1 to use the classifier-free guidance processor, got guidance scale ${e}.`);this.guidance_scale=e}_call(e,t){if(t.dims[0]!==2*e.length)throw Error(`Logits should have twice the batch size of the input ids, the first half of batches corresponding to the conditional inputs, and the second half of batches corresponding to the unconditional inputs. Got batch size ${t.dims[0]} for the logits and ${e.length} for the input ids.`);let n=e.length,r=t.slice([0,n],null),i=t.slice([n,t.dims[0]],null);for(let e=0;ee.length>=this.max_length)}},og=class extends rg{constructor(e){super(),Array.isArray(e)||(e=[e]),this.eos_token_id=e}_call(e,t){return e.map(e=>{let t=e.at(-1);return this.eos_token_id.some(e=>t==e)})}},sg=class extends $r{constructor(e){super(),this.generation_config=e}async _call(e){return this.sample(e)}async sample(e){throw Error(`sample should be implemented in subclasses.`)}getLogits(e,t){let n=e.dims.at(-1),r=e.data;if(t===-1)r=r.slice(-n);else{let e=t*n;r=r.slice(e,e+n)}return r}randomSelect(e){return xc(e)}static getSampler(e){if(e.do_sample)return new lg(e);if(e.num_beams>1)return new ug(e);if(e.num_return_sequences>1)throw Error(`num_return_sequences has to be 1 when doing greedy search, but is ${e.num_return_sequences}.`);return new cg(e)}},cg=class extends sg{async sample(e){let t=ll(e.data)[1];return[[BigInt(t),0]]}},lg=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},()=>{let e=this.randomSelect(i);return[r.data[e],Math.log(i[e])]})}},ug=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},(e,t)=>[r.data[t],Math.log(i[t])])}},dg=class{constructor(e){if(e)for(let t in e){if(t in this)throw TypeError(`Key "${t}" conflicts with an existing property on DynamicCache`);let n=e[t];if(!(n instanceof V))throw TypeError(`Expected a Tensor for key "${t}", got ${typeof n}`);this[t]=n}}get_seq_length(){let e=this;if(Object.keys(e).length===0)return 0;for(let t in e)if(t.startsWith(`past_key_values.`))return e[t].dims.at(-2);throw Error(`Unable to determine sequence length from the cache.`)}update(e){for(let t in e){let n=this[t],r=e[t];n&&n!==r&&n.location===`gpu-buffer`&&n.dispose(),this[t]=r}}async dispose(){let e=[];for(let t of Object.values(this))t.location===`gpu-buffer`&&e.push(t.dispose());await Promise.all(e)}},Y={EncoderOnly:0,EncoderDecoder:1,Seq2Seq:2,Vision2Seq:3,DecoderOnly:4,DecoderOnlyWithoutHead:5,MaskGeneration:6,ImageTextToText:7,Musicgen:8,MultiModality:9,Phi3V:10,AudioTextToText:11,AutoEncoder:12,ImageAudioTextToText:13,Supertonic:14,Chatterbox:15,VoxtralRealtime:16},fg={[Y.DecoderOnly]:{sessions:(e,t)=>({model:t.model_file_name??`model`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.DecoderOnlyWithoutHead]:{sessions:(e,t)=>({model:t.model_file_name??`model`})},[Y.Seq2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Vision2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Musicgen]:{sessions:()=>({model:`text_encoder`,decoder_model_merged:`decoder_model_merged`,encodec_decode:`encodec_decode`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.EncoderDecoder]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0}},[Y.MaskGeneration]:{sessions:()=>({model:`vision_encoder`,prompt_encoder_mask_decoder:`prompt_encoder_mask_decoder`})},[Y.ImageTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageTextToText].text_only_sessions};return n||(r.vision_encoder=`vision_encoder`),e.is_encoder_decoder&&(r.model=`encoder_model`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.AudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.ImageAudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageAudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`,r.vision_encoder=`vision_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Phi3V]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`model`,vision_encoder:`vision_encoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.MultiModality]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`language_model`,lm_head:`lm_head`,gen_head:`gen_head`,gen_img_embeds:`gen_img_embeds`,image_decode:`image_decode`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AutoEncoder]:{sessions:()=>({encoder_model:`encoder_model`,decoder_model:`decoder_model`})},[Y.Supertonic]:{sessions:()=>({text_encoder:`text_encoder`,latent_denoiser:`latent_denoiser`,voice_decoder:`voice_decoder`})},[Y.Chatterbox]:{sessions:()=>({embed_tokens:`embed_tokens`,speech_encoder:`speech_encoder`,model:`language_model`,conditional_decoder:`conditional_decoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.VoxtralRealtime]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.VoxtralRealtime].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0,audio_encoder:!0},optional_configs:{generation_config:`generation_config.json`}},default:{sessions:(e,t)=>({model:t.model_file_name??`model`})}};function pg(e,t,n={}){let r=fg[e]??fg.default;return{sessions:r.sessions(t,n,n.textOnly??!1),cache_sessions:r.cache_sessions,optional_configs:r.optional_configs}}function mg(e,{warn:t=!0}={}){let n=e.architectures||[];for(let e of n){let t=Cg.get(e);if(t!==void 0)return t}if(e.model_type){let t=Cg.get(e.model_type);if(t!==void 0)return t;for(let t of Object.values(_g))if(t.has(e.model_type)){let n=Cg.get(t.get(e.model_type));if(n!==void 0)return n}}if(t){let t=n.length>0?n.join(`, `):`(none)`;A.warn(`[resolve_model_type] Architecture(s) not found in MODEL_TYPE_MAPPING: [${t}] for model type '${e.model_type}'. Falling back to EncoderOnly (single model.onnx file). If you encounter issues, please report at: ${Nd}`)}return Y.EncoderOnly}function hg(e,{config:t=null,cache_dir:n=null,local_files_only:r=!1,revision:i=`main`}={}){return t===null?Wc(Ac(e,{cache_dir:n,local_files_only:r,revision:i}),()=>Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})):Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})}async function gg(e,{config:t=null,dtype:n=null,device:r=null,model_file_name:i=null}={}){t=await hg(e,{config:t});let a=[`config.json`],o=t[`transformers.js_config`]??{},s=o.use_external_data_format,c=`onnx`,l=r??o.device,u=n??o.dtype,d=mg(t),f=(e,t=null)=>{t??=e;let n=Gl(l,e),r=Xl[Zl(u,e,n)]??``,i=`${t}${r}.onnx`,o=`${c}/${i}`;a.push(o);let d=wh(s,i,e);for(let e of Th(i,d)){let t=`${c}/${e}`;a.push(t)}},{sessions:p,optional_configs:m}=pg(d,t,{model_file_name:i});for(let[e,t]of Object.entries(p))f(e,t);if(m)for(let e of Object.values(m))a.push(e);return a}var _g=null;function vg(e){_g=e}function yg(e){if(e instanceof V)return e;if(e.length===0)throw Error(`items must be non-empty`);if(Array.isArray(e[0])){if(e.some(t=>t.length!==e[0].length))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' and/or 'truncation=True' to have batched tensors with the same length.`);return new V(`int64`,BigInt64Array.from(e.flat().map(e=>BigInt(e))),[e.length,e[0].length])}return new V(`int64`,BigInt64Array.from(e.map(e=>BigInt(e))),[1,e.length])}function bg(e){return new V(`bool`,[e],[1])}var xg={[Y.DecoderOnly]:{can_generate:!0,forward:Pg,prepare_inputs:Bg},[Y.DecoderOnlyWithoutHead]:{can_generate:!1,forward:Pg,prepare_inputs:Bg},[Y.Seq2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Vision2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Musicgen]:{can_generate:!0,forward:Eg},[Y.EncoderDecoder]:{can_generate:!1,forward:Eg},[Y.ImageTextToText]:{can_generate:!0,forward:Lg,prepare_inputs:Hg},[Y.AudioTextToText]:{can_generate:!0,forward:Ig,prepare_inputs:Hg},[Y.ImageAudioTextToText]:{can_generate:!0,prepare_inputs:Hg},[Y.Phi3V]:{can_generate:!0,prepare_inputs:Hg},[Y.MultiModality]:{can_generate:!0},[Y.AutoEncoder]:{can_generate:!1,forward:Og},[Y.Chatterbox]:{can_generate:!0,forward:Dg},[Y.VoxtralRealtime]:{can_generate:!0,prepare_inputs:Bg},default:{can_generate:!1,forward:Dg}};function Sg(e,t){let n=Cg.get(e),r=!1,i=t?.architectures?.[0];if(i&&i!==e&&e?.endsWith(`ForCausalLM`)&&i.endsWith(`ForConditionalGeneration`)){let e=Cg.get(i);e!==void 0&&(n=e,r=!0)}let a=xg[n]??xg.default,o=fg[n]??fg.default;return{typeConfig:{...a,...o},textOnly:r,modelType:n}}var Cg=/* @__PURE__ */ new Map,wg=/* @__PURE__ */ new Map,Tg=/* @__PURE__ */ new Map,X=class extends $r{main_input_name=`input_ids`;forward_params=[`input_ids`,`attention_mask`];_return_dict_in_generate_keys=null;constructor(e,t,n){super(),this.config=e,this.sessions=t,this.configs=n;let{typeConfig:r}=Sg(Tg.get(this.constructor),e);this.can_generate=r.can_generate,this._forward=r.forward,this._prepare_inputs_for_generation=r.prepare_inputs,this.can_generate&&this.forward_params.push(`past_key_values`),this.custom_config=this.config[`transformers.js_config`]??{}}async dispose(){let e=[];for(let t of Object.values(this.sessions))e.push(t.release?.());return await Promise.all(e)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d},p=Tg.get(this);n=f.config=await Ch.from_pretrained(e,f);let{typeConfig:m,textOnly:h,modelType:g}=Sg(p,n);if(g===void 0){let e=p??n?.model_type;e!==`custom`&&A.warn(`Model type for '${e}' not found, assuming encoder-only architecture. Please report this at ${Nd}.`)}if(t&&!(t instanceof ti)){let r={};try{let t=await gg(e,{config:n,dtype:l,device:c,model_file_name:o});(await Promise.all(t.map(t=>Kc(e,t,f)))).forEach((e,n)=>{if(e.exists){let i=t[n]===`config.json`;r[t[n]]={loaded:i?e.size??0:0,total:e.size??0}}})}catch(e){A.warn(`Unable to fetch model file metadata for total progress tracking: ${e}`)}Object.keys(r).length>0&&(f.progress_callback=new ti(t,r))}let _=[kh(e,m.sessions(n,f,h),f,m.cache_sessions)];m.optional_configs&&_.push(Kg(e,m.optional_configs,f));let v=await Promise.all(_);return new this(n,...v)}async _call(e){return await this.forward(e)}async forward(e){return await this._forward(this,e)}get generation_config(){return this.configs?.generation_config??null}_get_logits_processor(e,t,n=null){let r=new Uh;if(e.repetition_penalty!==null&&e.repetition_penalty!==1&&r.push(new Xh(e.repetition_penalty)),e.no_repeat_ngram_size!==null&&e.no_repeat_ngram_size>0&&r.push(new Yh(e.no_repeat_ngram_size)),e.bad_words_ids!==null&&r.push(new $h(e.bad_words_ids,e.eos_token_id)),e.min_length!==null&&e.eos_token_id!==null&&e.min_length>0&&r.push(new Zh(e.min_length,e.eos_token_id)),e.min_new_tokens!==null&&e.eos_token_id!==null&&e.min_new_tokens>0&&r.push(new Qh(t,e.min_new_tokens,e.eos_token_id)),e.forced_bos_token_id!==null&&r.push(new Wh(e.forced_bos_token_id)),e.forced_eos_token_id!==null&&r.push(new Gh(e.max_length,e.forced_eos_token_id)),e.suppress_tokens!==null&&r.push(new Kh(e.suppress_tokens)),e.begin_suppress_tokens!==null){let n=t>1||e.forced_bos_token_id===null?t:t+1;r.push(new qh(e.begin_suppress_tokens,n))}return e.guidance_scale!==null&&e.guidance_scale>1&&r.push(new eg(e.guidance_scale)),e.temperature===0&&e.do_sample&&(A.warn("`do_sample` changed to false because `temperature: 0` implies greedy sampling (always selecting the most likely token), which is incompatible with `do_sample: true`."),e.do_sample=!1),e.do_sample&&e.temperature!==null&&e.temperature!==1&&r.push(new tg(e.temperature)),n!==null&&r.extend(n),r}_prepare_generation_config(e,t,n=ng){let r={...this.config};for(let e of[`decoder`,`generator`,`text_config`])e in r&&Object.assign(r,r[e]);let i=new n(r);return Object.assign(i,this.generation_config??{}),e&&Object.assign(i,e),t&&Object.assign(i,ci(t,Object.getOwnPropertyNames(i))),i}_get_stopping_criteria(e,t=null){let n=new ig;return e.max_length!==null&&n.push(new ag(e.max_length,this.config.max_position_embeddings??null)),e.eos_token_id!==null&&n.push(new og(e.eos_token_id)),t&&n.extend(t),n}_validate_model_class(){if(!this.can_generate){let e=[_g.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES,_g.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES].filter(Boolean),t=Tg.get(this.constructor),n=/* @__PURE__ */ new Set,r=this.config.model_type;for(let t of e){let e=t?.get(r);e&&n.add(e)}let i=`The current model class (${t}) is not compatible with \`.generate()\`, as it doesn't have a language model head.`;throw n.size>0&&(i+=` Please use the following class instead: ${[...n].join(`, `)}`),Error(i)}}prepare_inputs_for_generation(...e){if(!this._prepare_inputs_for_generation)throw Error(`prepare_inputs_for_generation is not implemented for this model.`);return this._prepare_inputs_for_generation(this,...e)}_update_model_kwargs_for_generation({generated_input_ids:e,outputs:t,model_inputs:n,is_encoder_decoder:r}){return n.past_key_values=kg(t,n.past_key_values),n.input_ids=new V(`int64`,e.flat(),[e.length,1]),r?`decoder_attention_mask`in n&&(n.decoder_attention_mask=H([n.decoder_attention_mask,yu([n.decoder_attention_mask.dims[0],1])],1)):n.attention_mask=H([n.attention_mask,yu([n.attention_mask.dims[0],1])],1),n.position_ids=null,n}_prepare_model_inputs({inputs:e,bos_token_id:t,model_kwargs:n}){let r=ci(n,this.forward_params),i=this.main_input_name;if(i in r){if(e)throw Error("`inputs`: {inputs}` were passed alongside {input_name} which is not allowed. Make sure to either pass {inputs} or {input_name}=...")}else r[i]=e;return{inputs_tensor:r[i],model_inputs:r,model_input_name:i}}async _prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:e,model_inputs:t,model_input_name:n,generation_config:r}){if(this.sessions.model.inputNames.includes(`inputs_embeds`)&&!t.inputs_embeds&&`_prepare_inputs_embeds`in this){let{input_ids:e,pixel_values:n,attention_mask:r,...i}=t,a=await this._prepare_inputs_embeds(t);t={...i,...ci(a,[`inputs_embeds`,`attention_mask`])}}let{last_hidden_state:i}=await Dg(this,t);if(r.guidance_scale!==null&&r.guidance_scale>1)i=H([i,vu(i,0)],0),`attention_mask`in t&&(t.attention_mask=H([t.attention_mask,Su(t.attention_mask)],0));else if(t.decoder_input_ids){let e=yg(t.decoder_input_ids).dims[0];if(e!==i.dims[0]){if(i.dims[0]!==1)throw Error(`The encoder outputs have a different batch size (${i.dims[0]}) than the decoder inputs (${e}).`);i=H(Array.from({length:e},()=>i),0)}}return t.encoder_outputs=i,t}_prepare_decoder_input_ids_for_generation({batch_size:e,model_input_name:t,model_kwargs:n,decoder_start_token_id:r,bos_token_id:i,generation_config:a}){let{decoder_input_ids:o,...s}=n;if(!(o instanceof V)){if(o)Array.isArray(o[0])||(o=Array.from({length:e},()=>o));else if(r??=i,this.config.model_type===`musicgen`)o=Array.from({length:e*this.config.decoder.num_codebooks},()=>[r]);else if(Array.isArray(r)){if(r.length!==e)throw Error(`\`decoder_start_token_id\` expected to have length ${e} but got ${r.length}`);o=r}else o=Array.from({length:e},()=>[r]);o=yg(o)}return s.decoder_attention_mask=bu(o),{input_ids:o,model_inputs:s}}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,streamer:i=null,...a}){this._validate_model_class(),t=this._prepare_generation_config(t,a);let{inputs_tensor:o,model_inputs:s,model_input_name:c}=this._prepare_model_inputs({inputs:e,model_kwargs:a}),l=this.config.is_encoder_decoder;l&&(`encoder_outputs`in s||(s=await this._prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:o,model_inputs:s,model_input_name:c,generation_config:t})));let u;l?{input_ids:u,model_inputs:s}=this._prepare_decoder_input_ids_for_generation({batch_size:s[c].dims.at(0),model_input_name:c,model_kwargs:s,decoder_start_token_id:t.decoder_start_token_id,bos_token_id:t.bos_token_id,generation_config:t}):u=s[c];let d=u.dims.at(-1);t.max_new_tokens!==null&&(t.max_length=d+t.max_new_tokens);let f=this._get_logits_processor(t,d,n),p=this._get_stopping_criteria(t,r),m=s[c].dims.at(0),h=sg.getSampler(t),g=Array(m).fill(0),_=u.tolist();i&&i.put(_);let v,y={},b={};for(;;){if(s=this.prepare_inputs_for_generation(_,s,t),v=await this.forward(s),t.return_dict_in_generate){if(t.output_attentions){let e=Ag(v);for(let t in e)t in y||(y[t]=[]),y[t].push(e[t])}else this._return_dict_in_generate_keys&&Object.assign(b,ci(v,this._return_dict_in_generate_keys))}let e=f(_,v.logits.slice(null,-1,null).to(`float32`)),n=[];for(let t=0;te))break;s=this._update_model_kwargs_for_generation({generated_input_ids:n,outputs:v,model_inputs:s,is_encoder_decoder:l})}i&&i.end();let x=new V(`int64`,_.flat(),[_.length,_[0].length]),S=kg(v,s.past_key_values),C=new Set(Object.values(S));for(let e of Object.values(v))e.location===`gpu-buffer`&&!C.has(e)&&e.dispose();return`past_key_values`in a||t.return_dict_in_generate||await S.dispose(),t.return_dict_in_generate?{sequences:x,past_key_values:S,...y,...b}:x}async _encode_input(e,t,n){if(!Object.hasOwn(this.sessions,e))throw Error(`Model does not have a ${e} session.`);let r=this.sessions[e];return(await q(r,ci(t,r.inputNames)))[n]}async encode_image(e){return this._encode_input(`vision_encoder`,e,`image_features`)}async encode_text(e){return this._encode_input(`embed_tokens`,e,`inputs_embeds`)}async encode_audio(e){return this._encode_input(`audio_encoder`,e,`audio_features`)}};async function Eg(e,t){let{encoder_outputs:n,input_ids:r,decoder_input_ids:i,decoder_attention_mask:a,...o}=t;return n||=(await Dg(e,ci(t,e.sessions.model.inputNames))).last_hidden_state,o.input_ids=i,o.encoder_hidden_states=n,e.sessions.decoder_model_merged.inputNames.includes(`encoder_attention_mask`)&&(o.encoder_attention_mask=t.attention_mask),a&&!o.attention_mask&&(o.attention_mask=a),await Pg(e,o,!0)}async function Dg(e,t){let n=e.sessions.model,r=ci(t,n.inputNames);if(n.inputNames.includes(`inputs_embeds`)&&!r.inputs_embeds){if(!t.input_ids)throw Error("Both `input_ids` and `inputs_embeds` are missing in the model inputs.");r.inputs_embeds=await e.encode_text({input_ids:t.input_ids})}if(n.inputNames.includes(`token_type_ids`)&&!r.token_type_ids){if(!r.input_ids)throw Error("Both `input_ids` and `token_type_ids` are missing in the model inputs.");r.token_type_ids=Su(r.input_ids)}if(n.inputNames.includes(`pixel_mask`)&&!r.pixel_mask){if(!r.pixel_values)throw Error("Both `pixel_values` and `pixel_mask` are missing in the model inputs.");let e=r.pixel_values.dims;r.pixel_mask=yu([e[0],e[2],e[3]])}return await q(n,r)}async function Og(e,t){let n=await e.encode(t);return await e.decode(n)}function kg(e,t){let n=/* @__PURE__ */ Object.create(null);for(let r in e)if(r.startsWith(`present`)){let i=r.replace(`present_ssm`,`past_ssm`).replace(`present_conv`,`past_conv`).replace(`present_recurrent`,`past_recurrent`).replace(`present_compressor`,`past_compressor`).replace(`present_indexer`,`past_indexer`).replace(`present`,`past_key_values`);n[i]=r.includes(`encoder`)&&t?t[i]:e[r]}return t?(t.update(n),t):new dg(n)}function Ag(e){let t={};for(let n of[`cross_attentions`,`encoder_attentions`,`decoder_attentions`])for(let r in e)r.startsWith(n)&&(n in t||(t[n]=[]),t[n].push(e[r]));return t}function jg(e,t){return e.map(e=>typeof e==`number`?e:t[e]??0)}function Mg(e,t,n){if(n&&Object.keys(n).length>0)return Object.assign(t,n),n;let r=e.sessions.decoder_model_merged??e.sessions.model,i=(t[e.main_input_name]??t.attention_mask)?.dims?.[0]??1,a=bh(e.config),o=e.config?.normalized_config?.num_heads,s={batch_size:i};typeof o==`number`&&(s[`batch_size x num_heads`]=i*o);let c=/* @__PURE__ */ Object.create(null);for(let e of r.inputMetadata){if(!a.has(e.name))continue;let n=jg(e.shape,s),r=n.reduce((e,t)=>e*t,1),i=Ql[e.type],o=new V(e.type,new i(r),n);t[e.name]=o,c[e.name]=o}return n?(n.update(c),n):new dg(c)}function Ng(e,t,n){t.num_logits_to_keep||(e.sessions.decoder_model_merged??e.sessions.model)?.inputNames.includes(`num_logits_to_keep`)&&(t.num_logits_to_keep=new V(`int64`,[n],[]))}async function Pg(e,t,n=!1){let r=e.sessions[n?`decoder_model_merged`:`model`],{past_key_values:i,...a}=t;return r.inputNames.includes(`use_cache_branch`)&&(a.use_cache_branch=bg(i!=null&&Object.keys(i).length>0)),r.inputNames.includes(`position_ids`)&&a.attention_mask&&!a.position_ids&&(a.position_ids=zg(a,i,+!![`paligemma`,`gemma3_text`,`gemma3`].includes(e.config.model_type))),Ng(e,a,0n),Mg(e,a,i),await q(r,ci(a,r.inputNames))}async function Fg(e,{encode_function:t,merge_function:n,modality_input_names:r,modality_output_name:i,input_ids:a=null,attention_mask:o=null,position_ids:s=null,inputs_embeds:c=null,past_key_values:l=null,generation_config:u=null,logits_processor:d=null,num_logits_to_keep:f=null,...p}){if(!c){c=await e.encode_text({input_ids:a,...p});let s=ci(p,r);if(Object.keys(s).length>0){if(a.dims[1]!==1){let e=await t({...s,...p});({inputs_embeds:c,attention_mask:o}=n({[i]:e,inputs_embeds:c,input_ids:a,attention_mask:o}))}else if(l&&a.dims[1]===1){let e=a.dims[1],t=l.get_seq_length();o=H([yu([a.dims[0],t]),o.slice(null,[o.dims[1]-e,o.dims[1]])],1)}}}if(!s&&[`qwen2_vl`,`qwen2_vl_text`,`qwen2_5_vl`,`qwen2_5_vl_text`,`qwen3_vl`,`qwen3_vl_text`,`qwen3_vl_moe`,`qwen3_vl_moe_text`,`qwen3_5`,`qwen3_5_text`,`qwen3_5_moe`,`qwen3_5_moe_text`,`glm_ocr`,`glm_ocr_text`].includes(e.config.model_type)){let{image_grid_thw:t,video_grid_thw:n}=p;[s]=e.get_rope_index(a,t,n,o)}return await Pg(e,{inputs_embeds:c,past_key_values:l,attention_mask:o,position_ids:s,generation_config:u,logits_processor:d,num_logits_to_keep:f},!0)}async function Ig(e,t){return await Fg(e,{...t,modality_input_names:[`audio_values`,`input_features`],modality_output_name:`audio_features`,encode_function:e.encode_audio.bind(e),merge_function:e._merge_input_ids_with_audio_features.bind(e)})}async function Lg(e,t){return await Fg(e,{...t,modality_input_names:[`pixel_values`],modality_output_name:`image_features`,encode_function:e.encode_image.bind(e),merge_function:e._merge_input_ids_with_image_features.bind(e)})}function Rg(e,t=0){let[n,r]=e.dims,i=e.data,a=new BigInt64Array(i.length);for(let e=0;ee.dims[1]||i[e.at(-1)])),Ng(e,n,1n),{...n,decoder_input_ids:yg(t)}}function Hg(e,...t){return e.config.is_encoder_decoder?Vg(e,...t):Bg(e,...t)}function Ug({modality_token_id:e,inputs_embeds:t,modality_features:n,input_ids:r,attention_mask:i}){let a=r.tolist().map(t=>t.reduce((t,n,r)=>(n==e&&t.push(r),t),[])),o=a.reduce((e,t)=>e+t.length,0),s=n.dims[0];if(o!==s)throw Error(`Number of tokens and features do not match: tokens: ${o}, features ${s}`);let c=0;for(let e=0;e[r,await rl(e,t[r],!1,n)])))}var qg={};Sr(qg,{ASTForAudioClassification:()=>u_,ASTModel:()=>l_,ASTPreTrainedModel:()=>c_,AfmoeForCausalLM:()=>i_,AfmoeModel:()=>r_,AfmoePreTrainedModel:()=>n_,AlbertForMaskedLM:()=>Qg,AlbertForQuestionAnswering:()=>Zg,AlbertForSequenceClassification:()=>Xg,AlbertModel:()=>Yg,AlbertPreTrainedModel:()=>Jg,ApertusForCausalLM:()=>t_,ApertusModel:()=>e_,ApertusPreTrainedModel:()=>$g,ArceeForCausalLM:()=>s_,ArceeModel:()=>o_,ArceePreTrainedModel:()=>a_,BartForConditionalGeneration:()=>p_,BartForSequenceClassification:()=>m_,BartModel:()=>f_,BartPretrainedModel:()=>d_,BaseModelOutput:()=>Nh,BeitForImageClassification:()=>__,BeitModel:()=>g_,BeitPreTrainedModel:()=>h_,BertForMaskedLM:()=>b_,BertForQuestionAnswering:()=>C_,BertForSequenceClassification:()=>x_,BertForTokenClassification:()=>S_,BertModel:()=>y_,BertPreTrainedModel:()=>v_,BlenderbotForConditionalGeneration:()=>E_,BlenderbotModel:()=>T_,BlenderbotPreTrainedModel:()=>w_,BlenderbotSmallForConditionalGeneration:()=>k_,BlenderbotSmallModel:()=>O_,BlenderbotSmallPreTrainedModel:()=>D_,BloomForCausalLM:()=>M_,BloomModel:()=>j_,BloomPreTrainedModel:()=>A_,CHMv2ForDepthEstimation:()=>K_,CHMv2PreTrainedModel:()=>G_,CLIPModel:()=>Q_,CLIPPreTrainedModel:()=>Z_,CLIPSegForImageSegmentation:()=>av,CLIPSegModel:()=>iv,CLIPSegPreTrainedModel:()=>rv,CLIPTextModel:()=>$_,CLIPTextModelWithProjection:()=>ev,CLIPVisionModel:()=>tv,CLIPVisionModelWithProjection:()=>nv,CamembertForMaskedLM:()=>F_,CamembertForQuestionAnswering:()=>R_,CamembertForSequenceClassification:()=>I_,CamembertForTokenClassification:()=>L_,CamembertModel:()=>P_,CamembertPreTrainedModel:()=>N_,CausalLMOutput:()=>Lh,CausalLMOutputWithPast:()=>Rh,ChatterboxModel:()=>H_,ChatterboxPreTrainedModel:()=>V_,ChineseCLIPModel:()=>W_,ChineseCLIPPreTrainedModel:()=>U_,ClapAudioModelWithProjection:()=>X_,ClapModel:()=>J_,ClapPreTrainedModel:()=>q_,ClapTextModelWithProjection:()=>Y_,CodeGenForCausalLM:()=>cv,CodeGenModel:()=>sv,CodeGenPreTrainedModel:()=>ov,Cohere2ForCausalLM:()=>mv,Cohere2Model:()=>pv,Cohere2PreTrainedModel:()=>fv,CohereAsrForConditionalGeneration:()=>_v,CohereAsrModel:()=>gv,CohereAsrPreTrainedModel:()=>hv,CohereForCausalLM:()=>dv,CohereModel:()=>uv,CoherePreTrainedModel:()=>lv,ConvBertForMaskedLM:()=>bv,ConvBertForQuestionAnswering:()=>Cv,ConvBertForSequenceClassification:()=>xv,ConvBertForTokenClassification:()=>Sv,ConvBertModel:()=>yv,ConvBertPreTrainedModel:()=>vv,ConvNextForImageClassification:()=>Ev,ConvNextModel:()=>Tv,ConvNextPreTrainedModel:()=>wv,ConvNextV2ForImageClassification:()=>kv,ConvNextV2Model:()=>Ov,ConvNextV2PreTrainedModel:()=>Dv,DFineForObjectDetection:()=>Iv,DFineModel:()=>Fv,DFinePreTrainedModel:()=>Pv,DINOv3ConvNextModel:()=>ky,DINOv3ConvNextPreTrainedModel:()=>Oy,DINOv3ViTModel:()=>jy,DINOv3ViTPreTrainedModel:()=>Ay,DPTForDepthEstimation:()=>Hy,DPTModel:()=>Vy,DPTPreTrainedModel:()=>By,DacDecoderModel:()=>Hv,DacDecoderOutput:()=>Rv,DacEncoderModel:()=>Vv,DacEncoderOutput:()=>Lv,DacModel:()=>Bv,DacPreTrainedModel:()=>zv,DebertaForMaskedLM:()=>Gv,DebertaForQuestionAnswering:()=>Jv,DebertaForSequenceClassification:()=>Kv,DebertaForTokenClassification:()=>qv,DebertaModel:()=>Wv,DebertaPreTrainedModel:()=>Uv,DebertaV2ForMaskedLM:()=>ry,DebertaV2ForQuestionAnswering:()=>oy,DebertaV2ForSequenceClassification:()=>iy,DebertaV2ForTokenClassification:()=>ay,DebertaV2Model:()=>ny,DebertaV2PreTrainedModel:()=>ty,DecisionTransformerModel:()=>cy,DecisionTransformerPreTrainedModel:()=>sy,DeepseekV3ForCausalLM:()=>Zv,DeepseekV3Model:()=>Xv,DeepseekV3PreTrainedModel:()=>Yv,DeepseekV4ForCausalLM:()=>ey,DeepseekV4Model:()=>$v,DeepseekV4PreTrainedModel:()=>Qv,DeiTForImageClassification:()=>dy,DeiTModel:()=>uy,DeiTPreTrainedModel:()=>ly,DepthAnythingForDepthEstimation:()=>py,DepthAnythingPreTrainedModel:()=>fy,DepthProForDepthEstimation:()=>hy,DepthProPreTrainedModel:()=>my,DetrForObjectDetection:()=>vy,DetrForSegmentation:()=>yy,DetrModel:()=>_y,DetrObjectDetectionOutput:()=>by,DetrPreTrainedModel:()=>gy,DetrSegmentationOutput:()=>xy,Dinov2ForImageClassification:()=>wy,Dinov2Model:()=>Cy,Dinov2PreTrainedModel:()=>Sy,Dinov2WithRegistersForImageClassification:()=>Dy,Dinov2WithRegistersModel:()=>Ey,Dinov2WithRegistersPreTrainedModel:()=>Ty,DistilBertForMaskedLM:()=>Ly,DistilBertForQuestionAnswering:()=>Iy,DistilBertForSequenceClassification:()=>Py,DistilBertForTokenClassification:()=>Fy,DistilBertModel:()=>Ny,DistilBertPreTrainedModel:()=>My,DonutSwinModel:()=>zy,DonutSwinPreTrainedModel:()=>Ry,EdgeTamModel:()=>kE,EfficientNetForImageClassification:()=>Gy,EfficientNetModel:()=>Wy,EfficientNetPreTrainedModel:()=>Uy,ElectraForMaskedLM:()=>Jy,ElectraForQuestionAnswering:()=>Zy,ElectraForSequenceClassification:()=>Yy,ElectraForTokenClassification:()=>Xy,ElectraModel:()=>qy,ElectraPreTrainedModel:()=>Ky,Ernie4_5ForCausalLM:()=>eb,Ernie4_5Model:()=>$y,Ernie4_5PretrainedModel:()=>Qy,EsmForMaskedLM:()=>rb,EsmForSequenceClassification:()=>ib,EsmForTokenClassification:()=>ab,EsmModel:()=>nb,EsmPreTrainedModel:()=>tb,EuroBertForMaskedLM:()=>cb,EuroBertForSequenceClassification:()=>lb,EuroBertForTokenClassification:()=>ub,EuroBertModel:()=>sb,EuroBertPreTrainedModel:()=>ob,ExaoneForCausalLM:()=>pb,ExaoneModel:()=>fb,ExaonePreTrainedModel:()=>db,FalconForCausalLM:()=>gb,FalconH1ForCausalLM:()=>yb,FalconH1Model:()=>vb,FalconH1PreTrainedModel:()=>_b,FalconModel:()=>hb,FalconPreTrainedModel:()=>mb,FastViTForImageClassification:()=>Sb,FastViTModel:()=>xb,FastViTPreTrainedModel:()=>bb,Florence2ForConditionalGeneration:()=>wb,Florence2PreTrainedModel:()=>Cb,GLPNForDepthEstimation:()=>ix,GLPNModel:()=>rx,GLPNPreTrainedModel:()=>nx,GPT2LMHeadModel:()=>yx,GPT2Model:()=>vx,GPT2PreTrainedModel:()=>_x,GPTBigCodeForCausalLM:()=>sx,GPTBigCodeModel:()=>ox,GPTBigCodePreTrainedModel:()=>ax,GPTJForCausalLM:()=>Sx,GPTJModel:()=>xx,GPTJPreTrainedModel:()=>bx,GPTNeoForCausalLM:()=>ux,GPTNeoModel:()=>lx,GPTNeoPreTrainedModel:()=>cx,GPTNeoXForCausalLM:()=>px,GPTNeoXModel:()=>fx,GPTNeoXPreTrainedModel:()=>dx,Gemma2ForCausalLM:()=>Ab,Gemma2Model:()=>kb,Gemma2PreTrainedModel:()=>Ob,Gemma3ForCausalLM:()=>Rb,Gemma3ForConditionalGeneration:()=>Lb,Gemma3Model:()=>Ib,Gemma3PreTrainedModel:()=>Fb,Gemma3nForCausalLM:()=>Vb,Gemma3nForConditionalGeneration:()=>Bb,Gemma3nPreTrainedModel:()=>zb,Gemma4ForCausalLM:()=>Ub,Gemma4ForConditionalGeneration:()=>Hb,GemmaForCausalLM:()=>Db,GemmaModel:()=>Eb,GemmaPreTrainedModel:()=>Tb,GlmForCausalLM:()=>Kb,GlmModel:()=>Gb,GlmMoeDsaForCausalLM:()=>Yb,GlmMoeDsaModel:()=>Jb,GlmMoeDsaPreTrainedModel:()=>qb,GlmOcrForConditionalGeneration:()=>tx,GlmPreTrainedModel:()=>Wb,GptOssForCausalLM:()=>gx,GptOssModel:()=>hx,GptOssPreTrainedModel:()=>mx,GraniteForCausalLM:()=>Tx,GraniteModel:()=>wx,GraniteMoeHybridForCausalLM:()=>Ox,GraniteMoeHybridModel:()=>Dx,GraniteMoeHybridPreTrainedModel:()=>Ex,GranitePreTrainedModel:()=>Cx,GraniteSpeechForConditionalGeneration:()=>jx,GroundingDinoForObjectDetection:()=>Nx,GroundingDinoPreTrainedModel:()=>Mx,GroupViTModel:()=>Fx,GroupViTPreTrainedModel:()=>Px,HeliumForCausalLM:()=>Rx,HeliumModel:()=>Lx,HeliumPreTrainedModel:()=>Ix,HieraForImageClassification:()=>Vx,HieraModel:()=>Bx,HieraPreTrainedModel:()=>zx,HrmTextForCausalLM:()=>Wx,HrmTextModel:()=>Ux,HrmTextPreTrainedModel:()=>Hx,HubertForCTC:()=>Qx,HubertForSequenceClassification:()=>$x,HubertModel:()=>Zx,HubertPreTrainedModel:()=>Xx,HunYuanDenseV1ForCausalLM:()=>nS,HunYuanDenseV1Model:()=>tS,HunYuanDenseV1PreTrainedModel:()=>eS,IJepaForImageClassification:()=>oS,IJepaModel:()=>aS,IJepaPreTrainedModel:()=>iS,Idefics3ForConditionalGeneration:()=>rS,ImageMattingOutput:()=>Bh,JAISLMHeadModel:()=>lS,JAISModel:()=>cS,JAISPreTrainedModel:()=>sS,JinaCLIPModel:()=>dS,JinaCLIPPreTrainedModel:()=>uS,JinaCLIPTextModel:()=>fS,JinaCLIPVisionModel:()=>pS,Lfm2ForCausalLM:()=>gS,Lfm2Model:()=>hS,Lfm2MoeForCausalLM:()=>bS,Lfm2MoeModel:()=>yS,Lfm2MoePreTrainedModel:()=>vS,Lfm2PreTrainedModel:()=>mS,Lfm2VlForConditionalGeneration:()=>xS,LightOnOcrForConditionalGeneration:()=>_S,LiteWhisperForConditionalGeneration:()=>RO,Llama4ForCausalLM:()=>ES,Llama4PreTrainedModel:()=>TS,LlamaForCausalLM:()=>wS,LlamaModel:()=>CS,LlamaPreTrainedModel:()=>SS,LlavaForConditionalGeneration:()=>Mb,LlavaOnevisionForConditionalGeneration:()=>Mb,LlavaPreTrainedModel:()=>jb,LlavaQwen2ForCausalLM:()=>Pb,LongT5ForConditionalGeneration:()=>kS,LongT5Model:()=>OS,LongT5PreTrainedModel:()=>DS,M2M100ForConditionalGeneration:()=>MS,M2M100Model:()=>jS,M2M100PreTrainedModel:()=>AS,MBartForCausalLM:()=>US,MBartForConditionalGeneration:()=>VS,MBartForSequenceClassification:()=>HS,MBartModel:()=>BS,MBartPreTrainedModel:()=>zS,MPNetForMaskedLM:()=>aw,MPNetForQuestionAnswering:()=>cw,MPNetForSequenceClassification:()=>ow,MPNetForTokenClassification:()=>sw,MPNetModel:()=>iw,MPNetPreTrainedModel:()=>rw,MT5ForConditionalGeneration:()=>mw,MT5Model:()=>pw,MT5PreTrainedModel:()=>fw,MarianMTModel:()=>FS,MarianModel:()=>PS,MarianPreTrainedModel:()=>NS,MaskFormerForInstanceSegmentation:()=>RS,MaskFormerModel:()=>LS,MaskFormerPreTrainedModel:()=>IS,MaskedLMOutput:()=>Fh,Metric3DForDepthEstimation:()=>GS,Metric3DPreTrainedModel:()=>WS,Metric3Dv2ForDepthEstimation:()=>qS,Metric3Dv2PreTrainedModel:()=>KS,MgpstrForSceneTextRecognition:()=>XS,MgpstrModelOutput:()=>JS,MgpstrPreTrainedModel:()=>YS,MimiDecoderModel:()=>nC,MimiDecoderOutput:()=>QS,MimiEncoderModel:()=>tC,MimiEncoderOutput:()=>ZS,MimiModel:()=>eC,MimiPreTrainedModel:()=>$S,Ministral3ForCausalLM:()=>cC,Ministral3Model:()=>sC,Ministral3PreTrainedModel:()=>oC,MinistralForCausalLM:()=>aC,MinistralModel:()=>iC,MinistralPreTrainedModel:()=>rC,Mistral3ForConditionalGeneration:()=>fC,Mistral4ForCausalLM:()=>hC,Mistral4Model:()=>mC,Mistral4PreTrainedModel:()=>pC,MistralForCausalLM:()=>dC,MistralModel:()=>uC,MistralPreTrainedModel:()=>lC,MobileBertForMaskedLM:()=>vC,MobileBertForQuestionAnswering:()=>bC,MobileBertForSequenceClassification:()=>yC,MobileBertModel:()=>_C,MobileBertPreTrainedModel:()=>gC,MobileLLMForCausalLM:()=>CC,MobileLLMModel:()=>SC,MobileLLMPreTrainedModel:()=>xC,MobileNetV1ForImageClassification:()=>EC,MobileNetV1ForSemanticSegmentation:()=>DC,MobileNetV1Model:()=>TC,MobileNetV1PreTrainedModel:()=>wC,MobileNetV2ForImageClassification:()=>AC,MobileNetV2ForSemanticSegmentation:()=>jC,MobileNetV2Model:()=>kC,MobileNetV2PreTrainedModel:()=>OC,MobileNetV3ForImageClassification:()=>PC,MobileNetV3ForSemanticSegmentation:()=>FC,MobileNetV3Model:()=>NC,MobileNetV3PreTrainedModel:()=>MC,MobileNetV4ForImageClassification:()=>RC,MobileNetV4ForSemanticSegmentation:()=>zC,MobileNetV4Model:()=>LC,MobileNetV4PreTrainedModel:()=>IC,MobileViTForImageClassification:()=>HC,MobileViTModel:()=>VC,MobileViTPreTrainedModel:()=>BC,MobileViTV2ForImageClassification:()=>GC,MobileViTV2Model:()=>WC,MobileViTV2PreTrainedModel:()=>UC,ModelOutput:()=>Mh,ModernBertDecoderForCausalLM:()=>$C,ModernBertDecoderModel:()=>QC,ModernBertDecoderPreTrainedModel:()=>ZC,ModernBertForMaskedLM:()=>JC,ModernBertForSequenceClassification:()=>YC,ModernBertForTokenClassification:()=>XC,ModernBertModel:()=>qC,ModernBertPreTrainedModel:()=>KC,Moondream1ForConditionalGeneration:()=>Nb,MoonshineForConditionalGeneration:()=>nw,MoonshineModel:()=>tw,MoonshinePreTrainedModel:()=>ew,MptForCausalLM:()=>dw,MptModel:()=>uw,MptPreTrainedModel:()=>lw,MultiModalityCausalLM:()=>gw,MultiModalityPreTrainedModel:()=>hw,MusicgenForCausalLM:()=>yw,MusicgenForConditionalGeneration:()=>bw,MusicgenModel:()=>vw,MusicgenPreTrainedModel:()=>_w,NanoChatForCausalLM:()=>Cw,NanoChatModel:()=>Sw,NanoChatPreTrainedModel:()=>xw,NemotronHForCausalLM:()=>Ew,NemotronHModel:()=>Tw,NemotronHPreTrainedModel:()=>ww,NeoBertForMaskedLM:()=>kw,NeoBertForQuestionAnswering:()=>Mw,NeoBertForSequenceClassification:()=>Aw,NeoBertForTokenClassification:()=>jw,NeoBertModel:()=>Ow,NeoBertPreTrainedModel:()=>Dw,NomicBertModel:()=>Pw,NomicBertPreTrainedModel:()=>Nw,OPTForCausalLM:()=>tT,OPTModel:()=>eT,OPTPreTrainedModel:()=>$w,Olmo2ForCausalLM:()=>Bw,Olmo2Model:()=>zw,Olmo2PreTrainedModel:()=>Rw,Olmo3ForCausalLM:()=>Uw,Olmo3Model:()=>Hw,Olmo3PreTrainedModel:()=>Vw,OlmoForCausalLM:()=>Lw,OlmoHybridForCausalLM:()=>Kw,OlmoHybridModel:()=>Gw,OlmoHybridPreTrainedModel:()=>Ww,OlmoModel:()=>Iw,OlmoPreTrainedModel:()=>Fw,OpenAIPrivacyFilterForTokenClassification:()=>Yw,OpenAIPrivacyFilterModel:()=>Jw,OpenAIPrivacyFilterPreTrainedModel:()=>qw,OpenELMForCausalLM:()=>Qw,OpenELMModel:()=>Zw,OpenELMPreTrainedModel:()=>Xw,OwlViTForObjectDetection:()=>sT,OwlViTModel:()=>oT,OwlViTPreTrainedModel:()=>aT,Owlv2ForObjectDetection:()=>iT,Owlv2Model:()=>rT,Owlv2PreTrainedModel:()=>nT,PaliGemmaForConditionalGeneration:()=>cT,ParakeetForCTC:()=>uT,ParakeetPreTrainedModel:()=>lT,PatchTSMixerForPrediction:()=>pT,PatchTSMixerModel:()=>fT,PatchTSMixerPreTrainedModel:()=>dT,PatchTSTForPrediction:()=>gT,PatchTSTModel:()=>hT,PatchTSTPreTrainedModel:()=>mT,Phi3ForCausalLM:()=>ST,Phi3Model:()=>xT,Phi3PreTrainedModel:()=>bT,Phi3VForCausalLM:()=>wT,Phi3VPreTrainedModel:()=>CT,PhiForCausalLM:()=>yT,PhiModel:()=>vT,PhiPreTrainedModel:()=>_T,PreTrainedModel:()=>X,PvtForImageClassification:()=>DT,PvtModel:()=>ET,PvtPreTrainedModel:()=>TT,PyAnnoteForAudioFrameClassification:()=>AT,PyAnnoteModel:()=>kT,PyAnnotePreTrainedModel:()=>OT,QuestionAnsweringModelOutput:()=>Ih,Qwen2ForCausalLM:()=>NT,Qwen2Model:()=>MT,Qwen2MoeForCausalLM:()=>IT,Qwen2MoeModel:()=>FT,Qwen2MoePreTrainedModel:()=>PT,Qwen2PreTrainedModel:()=>jT,Qwen2VLForCausalLM:()=>Qb,Qwen2VLForConditionalGeneration:()=>Zb,Qwen2VLPreTrainedModel:()=>Xb,Qwen2_5_VLForCausalLM:()=>ex,Qwen2_5_VLForConditionalGeneration:()=>$b,Qwen3ForCausalLM:()=>zT,Qwen3Model:()=>RT,Qwen3MoeForCausalLM:()=>HT,Qwen3MoeModel:()=>VT,Qwen3MoePreTrainedModel:()=>BT,Qwen3NextForCausalLM:()=>GT,Qwen3NextModel:()=>WT,Qwen3NextPreTrainedModel:()=>UT,Qwen3PreTrainedModel:()=>LT,Qwen3VLForCausalLM:()=>qT,Qwen3VLForConditionalGeneration:()=>KT,Qwen3VLMoeForCausalLM:()=>YT,Qwen3VLMoeForConditionalGeneration:()=>JT,Qwen3_5ForCausalLM:()=>ZT,Qwen3_5ForConditionalGeneration:()=>XT,Qwen3_5MoeForCausalLM:()=>$T,Qwen3_5MoeForConditionalGeneration:()=>QT,RFDetrForObjectDetection:()=>aE,RFDetrModel:()=>iE,RFDetrObjectDetectionOutput:()=>oE,RFDetrPreTrainedModel:()=>rE,RTDetrForObjectDetection:()=>Mv,RTDetrModel:()=>jv,RTDetrObjectDetectionOutput:()=>Nv,RTDetrPreTrainedModel:()=>Av,RTDetrV2ForObjectDetection:()=>xE,RTDetrV2Model:()=>bE,RTDetrV2ObjectDetectionOutput:()=>SE,RTDetrV2PreTrainedModel:()=>yE,ResNetForImageClassification:()=>nE,ResNetModel:()=>tE,ResNetPreTrainedModel:()=>eE,RoFormerForMaskedLM:()=>hE,RoFormerForQuestionAnswering:()=>vE,RoFormerForSequenceClassification:()=>gE,RoFormerForTokenClassification:()=>_E,RoFormerModel:()=>mE,RoFormerPreTrainedModel:()=>pE,RobertaForMaskedLM:()=>lE,RobertaForQuestionAnswering:()=>fE,RobertaForSequenceClassification:()=>uE,RobertaForTokenClassification:()=>dE,RobertaModel:()=>cE,RobertaPreTrainedModel:()=>sE,Sam2ImageSegmentationOutput:()=>EE,Sam2Model:()=>OE,Sam2PreTrainedModel:()=>DE,Sam3TrackerModel:()=>AE,SamImageSegmentationOutput:()=>CE,SamModel:()=>TE,SamPreTrainedModel:()=>wE,SapiensForDepthEstimation:()=>NE,SapiensForNormalEstimation:()=>PE,SapiensForSemanticSegmentation:()=>ME,SapiensPreTrainedModel:()=>jE,SegformerForImageClassification:()=>LE,SegformerForSemanticSegmentation:()=>RE,SegformerModel:()=>IE,SegformerPreTrainedModel:()=>FE,Seq2SeqLMOutput:()=>zh,SequenceClassifierOutput:()=>J,SiglipModel:()=>BE,SiglipPreTrainedModel:()=>zE,SiglipTextModel:()=>VE,SiglipVisionModel:()=>HE,SmolLM3ForCausalLM:()=>GE,SmolLM3Model:()=>WE,SmolLM3PreTrainedModel:()=>UE,SmolVLMForConditionalGeneration:()=>KE,SnacDecoderModel:()=>XE,SnacEncoderModel:()=>YE,SnacModel:()=>JE,SnacPreTrainedModel:()=>qE,SolarOpenForCausalLM:()=>$E,SolarOpenModel:()=>QE,SolarOpenPreTrainedModel:()=>ZE,SpeechT5ForSpeechToText:()=>nD,SpeechT5ForTextToSpeech:()=>rD,SpeechT5HifiGan:()=>iD,SpeechT5Model:()=>tD,SpeechT5PreTrainedModel:()=>eD,SqueezeBertForMaskedLM:()=>sD,SqueezeBertForQuestionAnswering:()=>lD,SqueezeBertForSequenceClassification:()=>cD,SqueezeBertModel:()=>oD,SqueezeBertPreTrainedModel:()=>aD,StableLmForCausalLM:()=>fD,StableLmModel:()=>dD,StableLmPreTrainedModel:()=>uD,Starcoder2ForCausalLM:()=>hD,Starcoder2Model:()=>mD,Starcoder2PreTrainedModel:()=>pD,StyleTextToSpeech2Model:()=>_D,StyleTextToSpeech2PreTrainedModel:()=>gD,SupertonicForConditionalGeneration:()=>yD,SupertonicPreTrainedModel:()=>vD,Swin2SRForImageSuperResolution:()=>ED,Swin2SRModel:()=>TD,Swin2SRPreTrainedModel:()=>wD,SwinForImageClassification:()=>SD,SwinForSemanticSegmentation:()=>CD,SwinModel:()=>xD,SwinPreTrainedModel:()=>bD,T5ForConditionalGeneration:()=>kD,T5Model:()=>OD,T5PreTrainedModel:()=>DD,TableTransformerForObjectDetection:()=>MD,TableTransformerModel:()=>jD,TableTransformerObjectDetectionOutput:()=>ND,TableTransformerPreTrainedModel:()=>AD,TokenClassifierOutput:()=>Ph,TrOCRForCausalLM:()=>FD,TrOCRPreTrainedModel:()=>PD,UltravoxModel:()=>Ax,UltravoxPreTrainedModel:()=>kx,UniSpeechForCTC:()=>RD,UniSpeechForSequenceClassification:()=>zD,UniSpeechModel:()=>LD,UniSpeechPreTrainedModel:()=>ID,UniSpeechSatForAudioFrameClassification:()=>WD,UniSpeechSatForCTC:()=>HD,UniSpeechSatForSequenceClassification:()=>UD,UniSpeechSatModel:()=>VD,UniSpeechSatPreTrainedModel:()=>BD,VaultGemmaForCausalLM:()=>qD,VaultGemmaModel:()=>KD,VaultGemmaPreTrainedModel:()=>GD,ViTForImageClassification:()=>ZD,ViTMAEModel:()=>$D,ViTMAEPreTrainedModel:()=>QD,ViTMSNForImageClassification:()=>nO,ViTMSNModel:()=>tO,ViTMSNPreTrainedModel:()=>eO,ViTModel:()=>XD,ViTPreTrainedModel:()=>YD,VisionEncoderDecoderModel:()=>JD,VitMatteForImageMatting:()=>iO,VitMattePreTrainedModel:()=>rO,VitPoseForPoseEstimation:()=>oO,VitPosePreTrainedModel:()=>aO,VitsModel:()=>lO,VitsModelOutput:()=>sO,VitsPreTrainedModel:()=>cO,VoxtralForConditionalGeneration:()=>uO,VoxtralRealtimeForConditionalGeneration:()=>bO,VoxtralRealtimePreTrainedModel:()=>yO,Wav2Vec2BertForCTC:()=>CO,Wav2Vec2BertForSequenceClassification:()=>wO,Wav2Vec2BertModel:()=>SO,Wav2Vec2BertPreTrainedModel:()=>xO,Wav2Vec2ForAudioFrameClassification:()=>Yx,Wav2Vec2ForCTC:()=>qx,Wav2Vec2ForSequenceClassification:()=>Jx,Wav2Vec2Model:()=>Kx,Wav2Vec2PreTrainedModel:()=>Gx,WavLMForAudioFrameClassification:()=>jO,WavLMForCTC:()=>OO,WavLMForSequenceClassification:()=>kO,WavLMForXVector:()=>AO,WavLMModel:()=>DO,WavLMPreTrainedModel:()=>EO,WeSpeakerResNetModel:()=>NO,WeSpeakerResNetPreTrainedModel:()=>MO,WhisperForConditionalGeneration:()=>LO,WhisperModel:()=>IO,WhisperPreTrainedModel:()=>FO,XLMForQuestionAnswering:()=>WO,XLMForSequenceClassification:()=>HO,XLMForTokenClassification:()=>UO,XLMModel:()=>BO,XLMPreTrainedModel:()=>zO,XLMRobertaForMaskedLM:()=>qO,XLMRobertaForQuestionAnswering:()=>XO,XLMRobertaForSequenceClassification:()=>JO,XLMRobertaForTokenClassification:()=>YO,XLMRobertaModel:()=>KO,XLMRobertaPreTrainedModel:()=>GO,XLMWithLMHeadModel:()=>VO,XVectorOutput:()=>TO,YolosForObjectDetection:()=>$O,YolosModel:()=>QO,YolosObjectDetectionOutput:()=>ek,YolosPreTrainedModel:()=>ZO,YoutuForCausalLM:()=>rk,YoutuModel:()=>nk,YoutuPreTrainedModel:()=>tk,ZayaForCausalLM:()=>ok,ZayaModel:()=>ak,ZayaPreTrainedModel:()=>ik});var Jg=class extends X{},Yg=class extends Jg{},Xg=class extends Jg{async _call(e){return new J(await super._call(e))}},Zg=class extends Jg{async _call(e){return new Ih(await super._call(e))}},Qg=class extends Jg{async _call(e){return new Fh(await super._call(e))}},$g=class extends X{},e_=class extends $g{},t_=class extends $g{},n_=class extends X{},r_=class extends n_{},i_=class extends n_{},a_=class extends X{},o_=class extends a_{},s_=class extends a_{},c_=class extends X{},l_=class extends c_{},u_=class extends c_{},d_=class extends X{},f_=class extends d_{},p_=class extends d_{},m_=class extends d_{async _call(e){return new J(await super._call(e))}},h_=class extends X{},g_=class extends h_{},__=class extends h_{async _call(e){return new J(await super._call(e))}},v_=class extends X{},y_=class extends v_{},b_=class extends v_{async _call(e){return new Fh(await super._call(e))}},x_=class extends v_{async _call(e){return new J(await super._call(e))}},S_=class extends v_{async _call(e){return new Ph(await super._call(e))}},C_=class extends v_{async _call(e){return new Ih(await super._call(e))}},w_=class extends X{},T_=class extends w_{},E_=class extends w_{},D_=class extends X{},O_=class extends D_{},k_=class extends D_{},A_=class extends X{},j_=class extends A_{},M_=class extends A_{},N_=class extends X{},P_=class extends N_{},F_=class extends N_{async _call(e){return new Fh(await super._call(e))}},I_=class extends N_{async _call(e){return new J(await super._call(e))}},L_=class extends N_{async _call(e){return new Ph(await super._call(e))}},R_=class extends N_{async _call(e){return new Ih(await super._call(e))}},z_=4299n,B_=6561n,V_=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`audio_values`,`exaggeration`,`audio_features`,`audio_tokens`,`speaker_embeddings`,`speaker_features`,`past_key_values`];main_input_name=`input_ids`;_return_dict_in_generate_keys=[`audio_tokens`,`speaker_embeddings`,`speaker_features`]},H_=class extends V_{async encode_speech(e){return q(this.sessions.speech_encoder,{audio_values:e})}async forward({input_ids:e=null,attention_mask:t=null,audio_values:n=null,exaggeration:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,audio_features:u=null,audio_tokens:d=null,speaker_embeddings:f=null,speaker_features:p=null,...m}){let h;if(!a){let s=this.sessions.embed_tokens.inputNames,c={input_ids:e};if(s.includes(`exaggeration`)){if(!(r instanceof V)){let t=e.dims[0];if(r==null)r=_u([t],.5);else if(typeof r==`number`)r=_u([t],r);else if(Array.isArray(r))r=new V(`float32`,r,[t]);else throw Error("Unsupported type for `exaggeration` input")}c.exaggeration=r}if(s.includes(`position_ids`)&&(c.position_ids=i),{inputs_embeds:a}=await q(this.sessions.embed_tokens,c),u&&d&&f&&p&&(h={audio_features:u,audio_tokens:d,speaker_embeddings:f,speaker_features:p}),h||n)h??=await this.encode_speech(n),a=H([h.audio_features,a],1),t=yu([a.dims[0],a.dims[1]]);else{let e=a.dims[1];if(!o||e!==1)throw Error(`Incorrect state encountered during generation.`);let n=o.get_seq_length();t=yu([a.dims[0],n+e])}}return{...await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1),...h}}prepare_inputs_for_generation(e,t,n){return!t.position_ids&&this.sessions.embed_tokens.inputNames.includes(`position_ids`)&&(t.position_ids=t.input_ids.dims[1]===1?new V(`int64`,Array.from({length:e.length},(t,n)=>e[n].length-e[n].findLastIndex(e=>e==B_)-1),[e.length,1]):new V(`int64`,t.input_ids.tolist().map(e=>{let t=0;return e.map(e=>e>=B_?0:t++)}).flat(),t.input_ids.dims)),t.input_ids.dims[1]===1&&(delete t.audio_values,delete t.audio_features,delete t.audio_tokens,delete t.speaker_embeddings,delete t.speaker_features),Bg(this,e,t,n)}async generate(e){let t=e.past_key_values,{sequences:n,audio_tokens:r,speaker_embeddings:i,speaker_features:a,past_key_values:o}=await super.generate({...e,return_dict_in_generate:!0});try{let t=n.slice(null,[e.input_ids.dims[1],-1]),o=H([r,t,_u([t.dims[0],3],z_)],1),{waveform:s}=await q(this.sessions.conditional_decoder,{speech_tokens:o,speaker_features:a,speaker_embeddings:i});return s}finally{o!==t&&await o?.dispose()}}},U_=class extends X{},W_=class extends U_{},G_=class extends X{},K_=class extends G_{},q_=class extends X{},J_=class extends q_{},Y_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},X_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`audio_model`})}},Z_=class extends X{},Q_=class extends Z_{},$_=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},ev=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},tv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},nv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},rv=class extends X{},iv=class extends rv{},av=class extends rv{},ov=class extends X{},sv=class extends ov{},cv=class extends ov{},lv=class extends X{},uv=class extends lv{},dv=class extends lv{},fv=class extends X{},pv=class extends fv{},mv=class extends fv{},hv=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},gv=class extends hv{},_v=class extends hv{},vv=class extends X{},yv=class extends vv{},bv=class extends vv{async _call(e){return new Fh(await super._call(e))}},xv=class extends vv{async _call(e){return new J(await super._call(e))}},Sv=class extends vv{async _call(e){return new Ph(await super._call(e))}},Cv=class extends vv{async _call(e){return new Ih(await super._call(e))}},wv=class extends X{},Tv=class extends wv{},Ev=class extends wv{async _call(e){return new J(await super._call(e))}},Dv=class extends X{},Ov=class extends Dv{},kv=class extends Dv{async _call(e){return new J(await super._call(e))}},Av=class extends X{},jv=class extends Av{},Mv=class extends Av{async _call(e){return new Nv(await super._call(e))}},Nv=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},Pv=class extends X{},Fv=class extends Pv{},Iv=class extends Pv{async _call(e){return new Nv(await super._call(e))}},Lv=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},Rv=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},zv=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},Bv=class extends zv{async encode(e){return new Lv(await q(this.sessions.encoder_model,e))}async decode(e){return new Rv(await q(this.sessions.decoder_model,e))}},Vv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},Hv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},Uv=class extends X{},Wv=class extends Uv{},Gv=class extends Uv{async _call(e){return new Fh(await super._call(e))}},Kv=class extends Uv{async _call(e){return new J(await super._call(e))}},qv=class extends Uv{async _call(e){return new Ph(await super._call(e))}},Jv=class extends Uv{async _call(e){return new Ih(await super._call(e))}},Yv=class extends X{},Xv=class extends Yv{},Zv=class extends Yv{},Qv=class extends X{},$v=class extends Qv{},ey=class extends Qv{},ty=class extends X{},ny=class extends ty{},ry=class extends ty{async _call(e){return new Fh(await super._call(e))}},iy=class extends ty{async _call(e){return new J(await super._call(e))}},ay=class extends ty{async _call(e){return new Ph(await super._call(e))}},oy=class extends ty{async _call(e){return new Ih(await super._call(e))}},sy=class extends X{},cy=class extends sy{},ly=class extends X{},uy=class extends ly{},dy=class extends ly{async _call(e){return new J(await super._call(e))}},fy=class extends X{},py=class extends fy{},my=class extends X{},hy=class extends my{},gy=class extends X{},_y=class extends gy{},vy=class extends gy{async _call(e){return new by(await super._call(e))}},yy=class extends gy{async _call(e){return new xy(await super._call(e))}},by=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},xy=class extends Mh{constructor({logits:e,pred_boxes:t,pred_masks:n}){super(),this.logits=e,this.pred_boxes=t,this.pred_masks=n}},Sy=class extends X{},Cy=class extends Sy{},wy=class extends Sy{async _call(e){return new J(await super._call(e))}},Ty=class extends X{},Ey=class extends Ty{},Dy=class extends Ty{async _call(e){return new J(await super._call(e))}},Oy=class extends X{},ky=class extends Oy{},Ay=class extends X{},jy=class extends Ay{},My=class extends X{},Ny=class extends My{},Py=class extends My{async _call(e){return new J(await super._call(e))}},Fy=class extends My{async _call(e){return new Ph(await super._call(e))}},Iy=class extends My{async _call(e){return new Ih(await super._call(e))}},Ly=class extends My{async _call(e){return new Fh(await super._call(e))}},Ry=class extends X{},zy=class extends Ry{},By=class extends X{},Vy=class extends By{},Hy=class extends By{},Uy=class extends X{},Wy=class extends Uy{},Gy=class extends Uy{async _call(e){return new J(await super._call(e))}},Ky=class extends X{},qy=class extends Ky{},Jy=class extends Ky{async _call(e){return new Fh(await super._call(e))}},Yy=class extends Ky{async _call(e){return new J(await super._call(e))}},Xy=class extends Ky{async _call(e){return new Ph(await super._call(e))}},Zy=class extends Ky{async _call(e){return new Ih(await super._call(e))}},Qy=class extends X{},$y=class extends Qy{},eb=class extends Qy{},tb=class extends X{},nb=class extends tb{},rb=class extends tb{async _call(e){return new Fh(await super._call(e))}},ib=class extends tb{async _call(e){return new J(await super._call(e))}},ab=class extends tb{async _call(e){return new Ph(await super._call(e))}},ob=class extends X{},sb=class extends ob{},cb=class extends ob{async _call(e){return new Fh(await super._call(e))}},lb=class extends ob{async _call(e){return new J(await super._call(e))}},ub=class extends ob{async _call(e){return new Ph(await super._call(e))}},db=class extends X{},fb=class extends db{},pb=class extends db{},mb=class extends X{},hb=class extends mb{},gb=class extends mb{},_b=class extends X{},vb=class extends _b{},yb=class extends _b{},bb=class extends X{},xb=class extends bb{},Sb=class extends bb{async _call(e){return new J(await super._call(e))}},Cb=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`pixel_values`,`encoder_outputs`,`decoder_input_ids`,`decoder_inputs_embeds`,`decoder_attention_mask`,`past_key_values`];main_input_name=`inputs_embeds`},wb=class extends Cb{_merge_input_ids_with_image_features({inputs_embeds:e,image_features:t,input_ids:n,attention_mask:r}){return{inputs_embeds:H([t,e],1),attention_mask:H([yu(t.dims.slice(0,2)),r],1)}}async _prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:n,attention_mask:r}){if(!e&&!t)throw Error("Either `input_ids` or `pixel_values` should be provided.");let i,a;return e&&(i=await this.encode_text({input_ids:e})),t&&(a=await this.encode_image({pixel_values:t})),i&&a?{inputs_embeds:n,attention_mask:r}=this._merge_input_ids_with_image_features({inputs_embeds:i,image_features:a,input_ids:e,attention_mask:r}):n=i||a,{inputs_embeds:n,attention_mask:r}}async forward({input_ids:e,pixel_values:t,attention_mask:n,decoder_input_ids:r,decoder_attention_mask:i,encoder_outputs:a,past_key_values:o,inputs_embeds:s,decoder_inputs_embeds:c,num_logits_to_keep:l=null}){if(s||({inputs_embeds:s,attention_mask:n}=await this._prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:s,attention_mask:n})),!a){let{last_hidden_state:e}=await Dg(this,{inputs_embeds:s,attention_mask:n});a=e}if(!c){if(!r)throw Error("Either `decoder_input_ids` or `decoder_inputs_embeds` should be provided.");c=await this.encode_text({input_ids:r})}let u={inputs_embeds:c,attention_mask:i,encoder_attention_mask:n,encoder_hidden_states:a,past_key_values:o,num_logits_to_keep:l};return await Pg(this,u,!0)}},Tb=class extends X{},Eb=class extends Tb{},Db=class extends Tb{},Ob=class extends X{},kb=class extends Ob{},Ab=class extends Ob{},jb=class extends X{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`position_ids`,`past_key_values`]},Mb=class extends jb{_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_index??this.config.image_token_id,...e,image_features:n})}},Nb=class extends Mb{},Pb=class extends Mb{},Fb=class extends X{},Ib=class extends Fb{},Lb=class extends Mb{},Rb=class extends Lb{},zb=class extends X{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`input_features`,`input_features_mask`,`past_key_values`]},Bb=class extends zb{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,input_features:r=null,input_features_mask:i=null,position_ids:a=null,inputs_embeds:o=null,per_layer_inputs:s=null,past_key_values:c=null,generation_config:l=null,logits_processor:u=null,num_logits_to_keep:d=null,...f}){if((!o||!s)&&({inputs_embeds:o,per_layer_inputs:s}=await q(this.sessions.embed_tokens,{input_ids:e}),e.dims[1]!==1)){if(n){let{image_features:r}=await this._encode_vision({pixel_values:n,...f});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_image_features({image_features:r,inputs_embeds:o,input_ids:e,attention_mask:t}))}if(r){let{audio_features:n}=await q(this.sessions.audio_encoder,{input_features:r,input_features_mask:i});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_audio_features({audio_features:n,inputs_embeds:o,input_ids:e,attention_mask:t}))}}return await Pg(this,{inputs_embeds:o,per_layer_inputs:s,past_key_values:c,attention_mask:t,position_ids:a,generation_config:l,logits_processor:u,num_logits_to_keep:d},!0)}_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values})}_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_id,...e,image_features:n})}_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.audio_token_id,...e,audio_features:n})}},Vb=class extends Bb{},Hb=class extends Bb{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`image_position_ids`,`input_features`,`input_features_mask`,`past_key_values`];_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values,pixel_position_ids:e.image_position_ids})}},Ub=class extends Hb{},Wb=class extends X{},Gb=class extends Wb{},Kb=class extends Wb{},qb=class extends X{},Jb=class extends qb{},Yb=class extends qb{},Xb=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`,`pixel_values`,`image_grid_thw`]},Zb=class extends Xb{image_grid_thw_name=`grid_thw`;_get_text_only_rope_index(e,t){if(t){let{data:e,dims:n}=Rg(t),r=BigInt64Array.from({length:3*e.length},(t,n)=>e[n%e.length]),i=Array.from({length:n[0]},(t,r)=>ll(e.subarray(n[1]*r,n[1]*(r+1)))[0]+1n+BigInt(n[1]));return[new V(`int64`,r,[3,...n]),new V(`int64`,i,[i.length,1])]}{let[t,n]=e.dims;return[new V(`int64`,BigInt64Array.from({length:3*t*n},(e,r)=>BigInt(Math.floor(r%n/t))),[3,...e.dims]),xu([t,1])]}}_reorder_and_write_positions(e,t,n,r){let i=e.reduce((e,t)=>e+t.length,0),a=Array(i),o=0;for(let t=0;t<3;++t)for(let n of e){let e=n.length/3;for(let r=t*e;r<(t+1)*e;++r)a[o++]=n[r]}let s=0;for(let e=0;e(t==s&&e.push(n),e),[]).map(e=>c[e+1]),u=l.filter(e=>e==a).length,d=l.filter(e=>e==o).length,f=[],p=0,m=u,h=d;for(let e=0;et>p&&e==a),s=c.findIndex((e,t)=>t>p&&e==o),l=m>0&&e!==-1?e:c.length+1,u=h>0&&s!==-1?s:c.length+1,d,g,_,v;l0?ll(f.at(-1))[0]+1:0;f.push(Array.from({length:3*S},(e,t)=>C+t%S));let ee=S+C,w=y*b*x,te=Array.from({length:w},(e,t)=>ee+Math.floor(t/(b*x))),ne=Array.from({length:w},(e,t)=>ee+Math.floor(t/x)%b),re=Array.from({length:w},(e,t)=>ee+t%x);f.push([te,ne,re].flat()),p=d+w}if(p0?ll(f.at(-1))[0]+1:0,t=c.length-p;f.push(Array.from({length:3*t},(n,r)=>e+r%t))}return f}get_rope_index(e,t,n,r){let{vision_config:i}=this.config,a=i.spatial_merge_size??2;if(t||n){let i=e.tolist();r||=bu(e);let o=r.tolist(),s=Array.from({length:3},()=>Array.from({length:e.dims[0]},()=>Array.from({length:e.dims[1]},()=>0))),c=t?t.tolist():[],l=n?n.tolist():[],u={image_index:0,video_index:0},d=[];for(let e=0;eo[e][n]==1),n=this._get_multimodal_rope_positions({filtered_ids:t,image_grid_thw_list:c,video_grid_thw_list:l,spatial_merge_size:a,state:u}),r=this._reorder_and_write_positions(n,o[e],s,e);d.push(ll(r)[0]+1-i[e].length)}return[new V(`int64`,s.flat(1/0),[3,e.dims[0],e.dims[1]]),new V(`int64`,d,[d.length,1])]}return this._get_text_only_rope_index(e,r)}async encode_image({pixel_values:e,image_grid_thw:t}){return(await q(this.sessions.vision_encoder,{pixel_values:e,[this.image_grid_thw_name]:t})).image_features}_merge_input_ids_with_image_features(e){return Wg({image_token_id:this.config.image_token_id,...e})}prepare_inputs_for_generation(e,t,n){if(Ng(this,t,1n),!t.attention_mask||t.position_ids||!(this.sessions.decoder_model_merged??this.sessions.model).inputNames.includes(`position_ids`))return t;if(!t.past_key_values)[t.position_ids,t.rope_deltas]=this.get_rope_index(t.input_ids,t.image_grid_thw,t.video_grid_thw,t.attention_mask);else{t.pixel_values=null;let e=t.past_key_values.get_seq_length();if(en+e);t.position_ids=du([r,r,r],0)}}return t}},Qb=class extends Zb{},$b=class extends Zb{image_grid_thw_name=`image_grid_thw`},ex=class extends Qb{image_grid_thw_name=`image_grid_thw`},tx=class extends $b{get_vision_position_ids(e,t,n,r){let i=Math.floor(t[0]/n),a=Math.floor(t[1]/r),o=Math.floor(t[2]/r),s=a*o*i,c=Array.from({length:s},()=>e),l=Array.from({length:s},(t,n)=>e+Math.floor(n/(o*i))),u=Array.from({length:s},(t,n)=>e+n%o);return[...c,...l,...u]}_get_multimodal_rope_positions({filtered_ids:e,image_grid_thw_list:t,video_grid_thw_list:n,spatial_merge_size:r,state:i}){let{image_token_id:a}=this.config,o=[],s=0,c=+(e[0]==a);for(let t=1;t<=e.length;++t){let n=tl+n%e)),l+=e}else{let e=t[i.image_index++].map(Number),n=e[0];u.push(this.get_vision_position_ids(l,e,n,r)),l+=Math.max(e[1],e[2])/r}return u}},nx=class extends X{},rx=class extends nx{},ix=class extends nx{},ax=class extends X{},ox=class extends ax{},sx=class extends ax{},cx=class extends X{},lx=class extends cx{},ux=class extends cx{},dx=class extends X{},fx=class extends dx{},px=class extends dx{},mx=class extends X{},hx=class extends mx{},gx=class extends mx{},_x=class extends X{},vx=class extends _x{},yx=class extends _x{},bx=class extends X{},xx=class extends bx{},Sx=class extends bx{},Cx=class extends X{},wx=class extends Cx{},Tx=class extends Cx{},Ex=class extends X{},Dx=class extends Ex{},Ox=class extends Ex{},kx=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`audio_values`,`past_key_values`]},Ax=class extends kx{_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.ignore_index??this.config.audio_token_id??this.config.audio_token_index,...e,audio_features:n})}},jx=class extends Ax{forward_params=[`input_ids`,`attention_mask`,`input_features`,`past_key_values`]},Mx=class extends X{},Nx=class extends Mx{},Px=class extends X{},Fx=class extends Px{},Ix=class extends X{},Lx=class extends Ix{},Rx=class extends Ix{},zx=class extends X{},Bx=class extends zx{},Vx=class extends zx{async _call(e){return new J(await super._call(e))}},Hx=class extends X{},Ux=class extends Hx{},Wx=class extends Hx{forward_params=[`input_ids`,`attention_mask`,`token_type_ids`,`past_key_values`];prepare_inputs_for_generation(e,t,n){let r=Bg(this,e,t,n);return r.token_type_ids=(r.past_key_values?Su:bu)(r.input_ids),r}},Gx=class extends X{},Kx=class extends Gx{},qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},Jx=class extends Gx{async _call(e){return new J(await super._call(e))}},Yx=class extends Gx{async _call(e){return new Ph(await super._call(e))}},Xx=class extends X{},Zx=class extends Gx{},Qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},$x=class extends Gx{async _call(e){return new J(await super._call(e))}},eS=class extends X{},tS=class extends eS{},nS=class extends eS{},rS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`position_ids`,`past_key_values`]},iS=class extends X{},aS=class extends iS{},oS=class extends iS{async _call(e){return new J(await super._call(e))}},sS=class extends X{},cS=class extends sS{},lS=class extends sS{},uS=class extends X{},dS=class extends uS{async forward(e){let t=!e.input_ids,n=!e.pixel_values;if(t&&n)throw Error("Either `input_ids` or `pixel_values` should be provided.");if(t&&(e.input_ids=yu([e.pixel_values.dims[0],1])),n){let{image_size:t}=this.config.vision_config;e.pixel_values=_u([0,3,t,t],0)}let{text_embeddings:r,image_embeddings:i,l2norm_text_embeddings:a,l2norm_image_embeddings:o}=await super.forward(e),s={};return t||(s.text_embeddings=r,s.l2norm_text_embeddings=a),n||(s.image_embeddings=i,s.l2norm_image_embeddings=o),s}},fS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},pS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},mS=class extends X{},hS=class extends mS{},gS=class extends mS{},_S=class extends Mb{},vS=class extends X{},yS=class extends vS{},bS=class extends vS{},xS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`spatial_shapes`,`position_ids`,`past_key_values`]},SS=class extends X{},CS=class extends SS{},wS=class extends SS{},TS=class extends X{},ES=class extends TS{},DS=class extends X{},OS=class extends DS{},kS=class extends DS{},AS=class extends X{},jS=class extends AS{},MS=class extends AS{},NS=class extends X{},PS=class extends NS{},FS=class extends NS{},IS=class extends X{},LS=class extends IS{},RS=class extends IS{},zS=class extends X{},BS=class extends zS{},VS=class extends zS{},HS=class extends zS{async _call(e){return new J(await super._call(e))}},US=class extends zS{},WS=class extends X{},GS=class extends WS{},KS=class extends X{},qS=class extends KS{},JS=class extends Mh{constructor({char_logits:e,bpe_logits:t,wp_logits:n}){super(),this.char_logits=e,this.bpe_logits=t,this.wp_logits=n}get logits(){return[this.char_logits,this.bpe_logits,this.wp_logits]}},YS=class extends X{},XS=class extends YS{async _call(e){return new JS(await super._call(e))}},ZS=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},QS=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},$S=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},eC=class extends $S{async encode(e){return new ZS(await q(this.sessions.encoder_model,e))}async decode(e){return new QS(await q(this.sessions.decoder_model,e))}},tC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},nC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},rC=class extends X{},iC=class extends rC{},aC=class extends rC{},oC=class extends X{},sC=class extends oC{},cC=class extends oC{},lC=class extends X{},uC=class extends lC{},dC=class extends lC{},fC=class extends Mb{},pC=class extends X{},mC=class extends pC{},hC=class extends pC{},gC=class extends X{},_C=class extends gC{},vC=class extends gC{async _call(e){return new Fh(await super._call(e))}},yC=class extends gC{async _call(e){return new J(await super._call(e))}},bC=class extends gC{async _call(e){return new Ih(await super._call(e))}},xC=class extends X{},SC=class extends xC{},CC=class extends xC{},wC=class extends X{},TC=class extends wC{},EC=class extends wC{async _call(e){return new J(await super._call(e))}},DC=class extends wC{},OC=class extends X{},kC=class extends OC{},AC=class extends OC{async _call(e){return new J(await super._call(e))}},jC=class extends OC{},MC=class extends X{},NC=class extends MC{},PC=class extends MC{async _call(e){return new J(await super._call(e))}},FC=class extends MC{},IC=class extends X{},LC=class extends IC{},RC=class extends IC{async _call(e){return new J(await super._call(e))}},zC=class extends IC{},BC=class extends X{},VC=class extends BC{},HC=class extends BC{async _call(e){return new J(await super._call(e))}},UC=class extends X{},WC=class extends UC{},GC=class extends UC{async _call(e){return new J(await super._call(e))}},KC=class extends X{},qC=class extends KC{},JC=class extends KC{async _call(e){return new Fh(await super._call(e))}},YC=class extends KC{async _call(e){return new J(await super._call(e))}},XC=class extends KC{async _call(e){return new Ph(await super._call(e))}},ZC=class extends X{},QC=class extends ZC{},$C=class extends ZC{},ew=class extends X{requires_attention_mask=!1;main_input_name=`input_values`;forward_params=[`input_values`,`decoder_input_ids`,`past_key_values`]},tw=class extends ew{},nw=class extends ew{},rw=class extends X{},iw=class extends rw{},aw=class extends rw{async _call(e){return new Fh(await super._call(e))}},ow=class extends rw{async _call(e){return new J(await super._call(e))}},sw=class extends rw{async _call(e){return new Ph(await super._call(e))}},cw=class extends rw{async _call(e){return new Ih(await super._call(e))}},lw=class extends X{},uw=class extends lw{},dw=class extends lw{},fw=class extends X{},pw=class extends fw{},mw=class extends fw{},hw=class extends X{},gw=class extends hw{forward_params=[`input_ids`,`pixel_values`,`images_seq_mask`,`images_emb_mask`,`attention_mask`,`position_ids`,`past_key_values`];constructor(...e){super(...e),this._generation_mode=`text`}async forward(e){let t=this._generation_mode??`text`,n;if(t===`text`||!e.past_key_values){let t=this.sessions.prepare_inputs_embeds;n=await q(t,ci(e,t.inputNames))}else{let t=this.sessions.gen_img_embeds;n=await q(t,ci({image_ids:e.input_ids},t.inputNames))}let r={...e,...n},i=await Pg(this,r),a=this.sessions[t===`text`?`lm_head`:`gen_head`];if(!a)throw Error(`Unable to find "${a}" generation head`);let o=await q(a,ci(i,a.inputNames));return{...n,...i,...o}}prepare_inputs_for_generation(e,t,n){let r=!!t.past_key_values;return Ng(this,t,1n),n.guidance_scale!==null&&n.guidance_scale>1&&(r?t.input_ids=H([t.input_ids,t.input_ids],0):(t.input_ids=H([t.input_ids,vu(t.input_ids,BigInt(n.pad_token_id))],0),t.attention_mask=H([t.attention_mask,vu(t.attention_mask,0n)],0))),(r||!t.pixel_values)&&(t.pixel_values=_u([0,0,3,384,384],1)),r&&(t.images_seq_mask=new V(`bool`,[,].fill(!0).fill(!1,0,1),[1,1]),t.images_emb_mask=new V(`bool`,[].fill(!1),[1,1,0])),t}async generate(e){return this._generation_mode=`text`,super.generate(e)}async generate_images(e){this._generation_mode=`image`;let t=(e.inputs??e[this.main_input_name]).dims[1],n=(await super.generate(e)).slice(null,[t,null]),r=this.sessions.image_decode,{decoded_image:i}=await q(r,{generated_tokens:n}),a=i.add_(1).mul_(255/2).clamp_(0,255).to(`uint8`),o=[];for(let e of a){let t=Vf.fromTensor(e);o.push(t)}return o}},_w=class extends X{},vw=class extends _w{},yw=class extends _w{},bw=class extends X{forward_params=[`input_ids`,`attention_mask`,`encoder_outputs`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`];_apply_and_filter_by_delay_pattern_mask(e){let[t,n]=e.dims,r=this.config.decoder.num_codebooks,i=n-r,a=0;for(let t=0;t0&&o<=i&&(e.data[a++]=e.data[t])}let o=Math.floor(t/r),s=a/(o*r);return new V(e.type,e.data.slice(0,a),[o,r,s])}prepare_inputs_for_generation(e,t,n){let r=BigInt(this.config.decoder.pad_token_id),i=structuredClone(e);for(let e=0;e=t&&(i[e][t]=r);return n.guidance_scale!==null&&n.guidance_scale>1&&(i=i.concat(i)),Vg(this,i,t,n)}async generate(e){let t=await super.generate(e),n=this._apply_and_filter_by_delay_pattern_mask(t).unsqueeze_(0),{audio_values:r}=await q(this.sessions.encodec_decode,{audio_codes:n});return r}},xw=class extends X{},Sw=class extends xw{},Cw=class extends xw{},ww=class extends X{},Tw=class extends ww{},Ew=class extends ww{},Dw=class extends X{},Ow=class extends Dw{},kw=class extends Dw{async _call(e){return new Fh(await super._call(e))}},Aw=class extends Dw{async _call(e){return new J(await super._call(e))}},jw=class extends Dw{async _call(e){return new Ph(await super._call(e))}},Mw=class extends Dw{async _call(e){return new Ih(await super._call(e))}},Nw=class extends X{},Pw=class extends Nw{},Fw=class extends X{},Iw=class extends Fw{},Lw=class extends Fw{},Rw=class extends X{},zw=class extends Rw{},Bw=class extends Rw{},Vw=class extends X{},Hw=class extends Vw{},Uw=class extends Vw{},Ww=class extends X{},Gw=class extends Ww{},Kw=class extends Ww{},qw=class extends X{},Jw=class extends qw{},Yw=class extends qw{async _call(e){return new J(await super._call(e))}},Xw=class extends X{},Zw=class extends Xw{},Qw=class extends Xw{},$w=class extends X{},eT=class extends $w{},tT=class extends $w{},nT=class extends X{},rT=class extends nT{},iT=class extends nT{},aT=class extends X{},oT=class extends aT{},sT=class extends aT{},cT=class extends Mb{},lT=class extends X{},uT=class extends lT{async _call(e){return new Lh(await super._call(e))}},dT=class extends X{},fT=class extends dT{},pT=class extends dT{},mT=class extends X{},hT=class extends mT{},gT=class extends mT{},_T=class extends X{},vT=class extends _T{},yT=class extends _T{},bT=class extends X{},xT=class extends bT{},ST=class extends bT{},CT=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`pixel_values`,`image_sizes`,`past_key_values`]},wT=class extends CT{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,image_sizes:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,...u}){if(!a){let t;if(n&&e.dims[1]!==1){if(!r)throw Error("`image_sizes` must be provided when `pixel_values` is provided.");({image_features:t}=await q(this.sessions.vision_encoder,{pixel_values:n,image_sizes:r}))}else{let e=this.config.normalized_config.hidden_size;t=new V(`float32`,[],[0,e])}({inputs_embeds:a}=await q(this.sessions.prepare_inputs_embeds,{input_ids:e,image_features:t}))}return await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,position_ids:i,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1)}},TT=class extends X{},ET=class extends TT{},DT=class extends TT{async _call(e){return new J(await super._call(e))}},OT=class extends X{},kT=class extends OT{},AT=class extends OT{async _call(e){return new Ph(await super._call(e))}},jT=class extends X{},MT=class extends jT{},NT=class extends jT{},PT=class extends X{},FT=class extends PT{},IT=class extends PT{},LT=class extends X{},RT=class extends LT{},zT=class extends LT{},BT=class extends X{},VT=class extends BT{},HT=class extends BT{},UT=class extends X{},WT=class extends UT{},GT=class extends UT{},KT=class extends $b{},qT=class extends ex{},JT=class extends KT{},YT=class extends qT{},XT=class extends KT{},ZT=class extends XT{},QT=class extends XT{},$T=class extends ZT{},eE=class extends X{},tE=class extends eE{},nE=class extends eE{async _call(e){return new J(await super._call(e))}},rE=class extends X{},iE=class extends rE{},aE=class extends rE{async _call(e){return new oE(await super._call(e))}},oE=class extends Nv{},sE=class extends X{},cE=class extends sE{},lE=class extends sE{async _call(e){return new Fh(await super._call(e))}},uE=class extends sE{async _call(e){return new J(await super._call(e))}},dE=class extends sE{async _call(e){return new Ph(await super._call(e))}},fE=class extends sE{async _call(e){return new Ih(await super._call(e))}},pE=class extends X{},mE=class extends pE{},hE=class extends pE{async _call(e){return new Fh(await super._call(e))}},gE=class extends pE{async _call(e){return new J(await super._call(e))}},_E=class extends pE{async _call(e){return new Ph(await super._call(e))}},vE=class extends pE{async _call(e){return new Ih(await super._call(e))}},yE=class extends X{},bE=class extends yE{},xE=class extends yE{async _call(e){return new SE(await super._call(e))}},SE=class extends Nv{},CE=class extends Mh{constructor({iou_scores:e,pred_masks:t}){super(),this.iou_scores=e,this.pred_masks=t}},wE=class extends X{},TE=class extends wE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){e=!e.image_embeddings||!e.image_positional_embeddings?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_labels??=yu(e.input_points.dims.slice(0,-1));let t={image_embeddings:e.image_embeddings,image_positional_embeddings:e.image_positional_embeddings};return e.input_points&&(t.input_points=e.input_points),e.input_labels&&(t.input_labels=e.input_labels),e.input_boxes&&(t.input_boxes=e.input_boxes),await q(this.sessions.prompt_encoder_mask_decoder,t)}async _call(e){return new CE(await super._call(e))}},EE=class extends Mh{constructor({iou_scores:e,pred_masks:t,object_score_logits:n}){super(),this.iou_scores=e,this.pred_masks=t,this.object_score_logits=n}},DE=class extends X{},OE=class extends DE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){let{num_feature_levels:t}=this.config.vision_config;if(e=Array.from({length:t},(e,t)=>`image_embeddings.${t}`).some(t=>!e[t])?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_points){if(e.input_boxes&&e.input_boxes.dims[1]!==1)throw Error("When both `input_points` and `input_boxes` are provided, the number of boxes per image must be 1.");let t=e.input_points.dims;e.input_labels??=yu(t.slice(0,-1)),e.input_boxes??=_u([t[0],0,4],0)}else if(e.input_boxes){let t=e.input_boxes.dims;e.input_labels=_u([t[0],t[1],0],-1n),e.input_points=_u([t[0],1,0,2],0)}else throw Error("At least one of `input_points` or `input_boxes` must be provided.");let n=this.sessions.prompt_encoder_mask_decoder;return await q(n,ci(e,n.inputNames))}async _call(e){return new EE(await super._call(e))}},kE=class extends OE{},AE=class extends OE{},jE=class extends X{},ME=class extends jE{},NE=class extends jE{},PE=class extends jE{},FE=class extends X{},IE=class extends FE{},LE=class extends FE{},RE=class extends FE{},zE=class extends X{},BE=class extends zE{},VE=class extends zE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},HE=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},UE=class extends X{},WE=class extends UE{},GE=class extends UE{},KE=class extends rS{},qE=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},JE=class extends qE{async encode(e){return await q(this.sessions.encoder_model,e)}async decode(e){return await q(this.sessions.decoder_model,e)}},YE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},XE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},ZE=class extends X{},QE=class extends ZE{},$E=class extends ZE{},eD=class extends X{},tD=class extends eD{},nD=class extends eD{},rD=class extends eD{async generate_speech(e,t,{threshold:n=.5,minlenratio:r=0,maxlenratio:i=20,vocoder:a=null}={}){let o={input_ids:e},{encoder_outputs:s,encoder_attention_mask:c}=await Dg(this,o),l=s.dims[1]/this.config.reduction_factor,u=Math.floor(l*i),d=Math.floor(l*r),f=this.config.num_mel_bins,p=[],m=null,h=null,g=0;for(;;){++g;let e=bg(!!h),r;r=h?h.output_sequence_out:new V(`float32`,new Float32Array(f),[1,1,f]);let i={use_cache_branch:e,output_sequence:r,encoder_attention_mask:c,speaker_embeddings:t,encoder_hidden_states:s};Mg(this,i,m),h=await q(this.sessions.decoder_model_merged,i),m=kg(h,m);let{prob:a,spectrum:o}=h;if(p.push(o),g>=d&&(Array.from(a.data).filter(e=>e>=n).length>0||g>=u))break}let _=H(p),{waveform:v}=await q(a.sessions.model,{spectrogram:_});return{spectrogram:_,waveform:v}}},iD=class extends X{main_input_name=`spectrogram`},aD=class extends X{},oD=class extends aD{},sD=class extends aD{async _call(e){return new Fh(await super._call(e))}},cD=class extends aD{async _call(e){return new J(await super._call(e))}},lD=class extends aD{async _call(e){return new Ih(await super._call(e))}},uD=class extends X{},dD=class extends uD{},fD=class extends uD{},pD=class extends X{},mD=class extends pD{},hD=class extends pD{},gD=class extends X{},_D=class extends gD{},vD=class extends X{},yD=class extends vD{async generate_speech({input_ids:e,attention_mask:t,style:n,num_inference_steps:r=5,speed:i=1.05}){let{sampling_rate:a,chunk_compress_factor:o,base_chunk_size:s,latent_dim:c}=this.config,{last_hidden_state:l,durations:u}=await q(this.sessions.text_encoder,{input_ids:e,attention_mask:t,style:n}),d=u.div(i).mul_(a),f=s*o,p=d.data,m=Int32Array.from(p,e=>Math.ceil(e/f)),h=Math.max(...m),g=e.dims[0],_=new BigInt64Array(g*h);for(let e=0;ee*t,1),r=Ql[e.type];c[e.name]=new V(e.type,new r(n),t)}let f=Ql[d],p=new V(d,new f(s*dO),[1,s,dO]),m=t[Symbol.asyncIterator]?.()??t[Symbol.iterator]?.();if(!m)throw Error(`input_features must be iterable or async iterable`);return{encoder_session:i,enc_kv_cache:c,enc_padding_cache:p,enc_past_seq_len:0,audio_embed_queue:[],audio_embed_total_tokens:0,audio_queue_offset:0,audio_consumed:0,stream_exhausted:!1,chunks_iter:m,text_hidden_size:n.hidden_size}}async function hO(e,t){let n=t.dims[2],r=Math.floor((fO+n-3)/2)+1,i=new V(`int64`,BigInt64Array.from({length:r},(t,n)=>BigInt(e.enc_past_seq_len+n)),[1,r]),a=e.enc_past_seq_len+r,o=yu([1,a]),{audio_embeds:s,present_padding_cache:c,...l}=await q(e.encoder_session,{input_features:t,attention_mask:o,position_ids:i,past_padding_cache:e.enc_padding_cache,...e.enc_kv_cache});e.enc_padding_cache.location===`gpu-buffer`&&e.enc_padding_cache.dispose(),e.enc_padding_cache=c;for(let t in l)if(t.startsWith(`present.`)){let n=t.replace(`present`,`past_key_values`),r=e.enc_kv_cache[n];r?.location===`gpu-buffer`&&r.dispose(),e.enc_kv_cache[n]=l[t]}return e.enc_past_seq_len=a,s}async function gO(e,t){for(;e.audio_embed_total_tokens0&&e.audio_embed_queue.length>0;){let t=e.audio_embed_queue[0],n=t.tokens-e.audio_queue_offset,o=Math.min(a,n),s=e.audio_queue_offset*e.text_hidden_size;for(let n=0;n=t.tokens&&(e.audio_embed_queue.shift(),e.audio_queue_offset=0)}e.audio_consumed+=n-a}var vO=class extends rg{constructor(e){super(),this._s=e}_call(e){let t=this._s.stream_exhausted&&this._s.audio_embed_queue.length===0;return e.map(()=>t)}},yO=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`]},bO=class extends yO{async forward({input_ids:e,past_key_values:t,...n}){let r=e.dims[1],i=pO.get(this);i&&await gO(i,i.audio_consumed+r);let{inputs_embeds:a}=await q(this.sessions.embed_tokens,{input_ids:e});i&&_O(i,a,r);let o={inputs_embeds:a,...n};Mg(this,o,t);let s=this.sessions.decoder_model_merged;return await q(s,ci(o,s.inputNames))}async generate({input_features:e,stopping_criteria:t,...n}){if(!e)throw Error(`input_features (generator/iterable) must be provided`);let r=mO(this,e);pO.set(this,r);let i=new ig;i.push(new vO(r)),t&&i.extend(t);try{return await super.generate({...n,stopping_criteria:i})}finally{r.enc_kv_cache.dispose(),pO.delete(this)}}},xO=class extends X{},SO=class extends xO{},CO=class extends xO{async _call(e){return new Lh(await super._call(e))}},wO=class extends xO{async _call(e){return new J(await super._call(e))}},TO=class extends Mh{constructor({logits:e,embeddings:t}){super(),this.logits=e,this.embeddings=t}},EO=class extends X{},DO=class extends EO{},OO=class extends EO{async _call(e){return new Lh(await super._call(e))}},kO=class extends EO{async _call(e){return new J(await super._call(e))}},AO=class extends EO{async _call(e){return new TO(await super._call(e))}},jO=class extends EO{async _call(e){return new Ph(await super._call(e))}},MO=class extends X{},NO=class extends MO{},PO=class extends ng{return_timestamps=null;return_token_timestamps=null;num_frames=null;alignment_heads=null;task=null;language=null;no_timestamps_token_id=null;prompt_ids=null;is_multilingual=null;lang_to_id=null;task_to_id=null;max_initial_timestamp_index=1},FO=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`attention_mask`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},IO=class extends FO{},LO=class extends FO{_prepare_generation_config(e,t){return super._prepare_generation_config(e,t,PO)}_retrieve_init_tokens(e){let t=[e.decoder_start_token_id],n=e.language,r=e.task;if(e.is_multilingual){n||=(A.warn(`No language specified - defaulting to English (en).`),`en`);let i=`<|${Dd(n)}|>`;t.push(e.lang_to_id[i]),t.push(e.task_to_id[r??`transcribe`])}else if(n||r)throw Error("Cannot specify `task` or `language` for an English-only model. If the model is intended to be multilingual, pass `is_multilingual=true` to generate, or update the generation config.");return!e.return_timestamps&&e.no_timestamps_token_id&&t.at(-1)!==e.no_timestamps_token_id?t.push(e.no_timestamps_token_id):e.return_timestamps&&t.at(-1)===e.no_timestamps_token_id&&(A.warn("<|notimestamps|> prompt token is removed from generation_config since `return_timestamps` is set to `true`."),t.pop()),t.filter(e=>e!=null)}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,...i}){t=this._prepare_generation_config(t,i);let a=i.decoder_input_ids instanceof V?Du(i.decoder_input_ids):i.decoder_input_ids??this._retrieve_init_tokens(t);if(t.return_timestamps&&(n??=new Uh,n.push(new Jh(t,a))),t.begin_suppress_tokens&&(n??=new Uh,n.push(new qh(t.begin_suppress_tokens,a.length))),t.return_token_timestamps){if(!t.alignment_heads)throw Error("Model generation config has no `alignment_heads`, token-level timestamps not available. See https://gist.github.com/hollance/42e32852f24243b748ae6bc1f985b13a on how to add this property to the generation config.");t.task===`translate`&&A.warn(`Token-level timestamps may not be reliable for task 'translate'.`),t.output_attentions=!0,t.return_dict_in_generate=!0}if(t.return_timestamps&&!i.max_new_tokens)return this._generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:a,kwargs:i});let o=await super.generate({inputs:e,generation_config:t,logits_processor:n,decoder_input_ids:a,...i});return t.return_token_timestamps&&(o.token_timestamps=this._extract_token_timestamps(o,t.alignment_heads,t.num_frames,.02,a.length)),o}async _generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:r,kwargs:i}){let a=t.no_timestamps_token_id+1,o=Array.isArray(t.eos_token_id)?t.eos_token_id[0]:t.eos_token_id,s=t.return_token_timestamps,c=e,l=c.dims[2],u=2*this.config.max_source_positions,d=0,f=[],p=[];for(;de+n)}if(v.length>0&&v.at(-1)===o&&v.pop(),v.length===0)break;let b=v.map(e=>e>=a),x=v.length>=2&&b[v.length-1]&&!b[v.length-2],S=[];for(let e=0;e0){if(x)C=e-d;else{let e=S.at(-1);C=(v[e-1]-a)*2,ee=e}}else C=e-d;let w=Math.floor(d/2),te=a+1500;for(let e=0;e=a&&(v[e]=Math.min(v[e]+w,te));f.push(...v.slice(0,ee)),y&&p.push(...y.slice(0,ee)),d+=C}f.push(o);let m=[...r,...f];if(s){let e=new V(`int64`,m.map(BigInt),[1,m.length]),t=[...Array(r.length).fill(0),...p,0];return{sequences:e,token_timestamps:new V(`float32`,new Float32Array(t),[1,t.length])}}return new V(`int64`,m.map(BigInt),[1,m.length])}_extract_token_timestamps(e,t,n=null,r=.02,i=0){if(!e.cross_attentions)throw Error("Model outputs must contain cross attentions to extract timestamps. This is most likely because the model was not exported with `output_attentions=True`.");n??A.warn("`num_frames` has not been set, meaning the entire audio will be analyzed. This may lead to inaccurate token-level timestamps for short audios (< 30 seconds).");let a=this.config.median_filter_width;a===void 0&&(A.warn("Model config has no `median_filter_width`, using default value of 7."),a=7);let o=e.cross_attentions,s=Array.from({length:this.config.decoder_layers},(e,t)=>H(o.map(e=>e[t]),2)),c=du(t.map(([e,t])=>{if(e>=s.length)throw Error(`Layer index ${e} is out of bounds for cross attentions (length ${s.length}).`);return n?s[e].slice(null,t,null,[0,n]):s[e].slice(null,t)})).permute(1,0,2,3),[l,u]=pu(c,-2,0,!0),d=c.clone();for(let e=0;e0?d.slice(null,null,[i,d.dims[2]],null):d,1)],p=e.sequences.dims,m=new V(`float32`,new Float32Array(p[0]*p[1]),p);for(let e=0;et[n+1]-t[n])).map(e=>!!e),o=[];for(let e=0;e0&&s.push(o.at(-1)),m[e].data.set(s)}return m}},RO=class extends LO{},zO=class extends X{},BO=class extends zO{},VO=class extends zO{async _call(e){return new Fh(await super._call(e))}},HO=class extends zO{async _call(e){return new J(await super._call(e))}},UO=class extends zO{async _call(e){return new Ph(await super._call(e))}},WO=class extends zO{async _call(e){return new Ih(await super._call(e))}},GO=class extends X{},KO=class extends GO{},qO=class extends GO{async _call(e){return new Fh(await super._call(e))}},JO=class extends GO{async _call(e){return new J(await super._call(e))}},YO=class extends GO{async _call(e){return new Ph(await super._call(e))}},XO=class extends GO{async _call(e){return new Ih(await super._call(e))}},ZO=class extends X{},QO=class extends ZO{},$O=class extends ZO{async _call(e){return new ek(await super._call(e))}},ek=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},tk=class extends X{},nk=class extends tk{},rk=class extends tk{},ik=class extends X{},ak=class extends ik{},ok=class extends ik{},sk=/* @__PURE__ */ new Map([[`bert`,`BertModel`],[`eurobert`,`EuroBertModel`],[`neobert`,`NeoBertModel`],[`modernbert`,`ModernBertModel`],[`nomic_bert`,`NomicBertModel`],[`roformer`,`RoFormerModel`],[`electra`,`ElectraModel`],[`esm`,`EsmModel`],[`convbert`,`ConvBertModel`],[`camembert`,`CamembertModel`],[`deberta`,`DebertaModel`],[`deberta-v2`,`DebertaV2Model`],[`mpnet`,`MPNetModel`],[`albert`,`AlbertModel`],[`distilbert`,`DistilBertModel`],[`roberta`,`RobertaModel`],[`xlm`,`XLMModel`],[`xlm-roberta`,`XLMRobertaModel`],[`clap`,`ClapModel`],[`clip`,`CLIPModel`],[`clipseg`,`CLIPSegModel`],[`chinese_clip`,`ChineseCLIPModel`],[`siglip`,`SiglipModel`],[`jina_clip`,`JinaCLIPModel`],[`mobilebert`,`MobileBertModel`],[`squeezebert`,`SqueezeBertModel`],[`wav2vec2`,`Wav2Vec2Model`],[`wav2vec2-bert`,`Wav2Vec2BertModel`],[`unispeech`,`UniSpeechModel`],[`unispeech-sat`,`UniSpeechSatModel`],[`hubert`,`HubertModel`],[`wavlm`,`WavLMModel`],[`audio-spectrogram-transformer`,`ASTModel`],[`vits`,`VitsModel`],[`pyannote`,`PyAnnoteModel`],[`wespeaker-resnet`,`WeSpeakerResNetModel`],[`detr`,`DetrModel`],[`rt_detr`,`RTDetrModel`],[`rt_detr_v2`,`RTDetrV2Model`],[`rf_detr`,`RFDetrModel`],[`d_fine`,`DFineModel`],[`table-transformer`,`TableTransformerModel`],[`vit`,`ViTModel`],[`ijepa`,`IJepaModel`],[`pvt`,`PvtModel`],[`vit_msn`,`ViTMSNModel`],[`vit_mae`,`ViTMAEModel`],[`groupvit`,`GroupViTModel`],[`fastvit`,`FastViTModel`],[`mobilevit`,`MobileViTModel`],[`mobilevitv2`,`MobileViTV2Model`],[`owlvit`,`OwlViTModel`],[`owlv2`,`Owlv2Model`],[`beit`,`BeitModel`],[`deit`,`DeiTModel`],[`hiera`,`HieraModel`],[`convnext`,`ConvNextModel`],[`convnextv2`,`ConvNextV2Model`],[`dinov2`,`Dinov2Model`],[`dinov2_with_registers`,`Dinov2WithRegistersModel`],[`dinov3_vit`,`DINOv3ViTModel`],[`dinov3_convnext`,`DINOv3ConvNextModel`],[`resnet`,`ResNetModel`],[`swin`,`SwinModel`],[`swin2sr`,`Swin2SRModel`],[`donut-swin`,`DonutSwinModel`],[`yolos`,`YolosModel`],[`dpt`,`DPTModel`],[`glpn`,`GLPNModel`],[`hifigan`,`SpeechT5HifiGan`],[`efficientnet`,`EfficientNetModel`],[`decision_transformer`,`DecisionTransformerModel`],[`patchtst`,`PatchTSTModel`],[`patchtsmixer`,`PatchTSMixerModel`],[`mobilenet_v1`,`MobileNetV1Model`],[`mobilenet_v2`,`MobileNetV2Model`],[`mobilenet_v3`,`MobileNetV3Model`],[`mobilenet_v4`,`MobileNetV4Model`],[`maskformer`,`MaskFormerModel`],[`mgp-str`,`MgpstrForSceneTextRecognition`],[`style_text_to_speech_2`,`StyleTextToSpeech2Model`],[`openai_privacy_filter`,`OpenAIPrivacyFilterModel`]]),ck=/* @__PURE__ */ new Map([[`t5`,`T5Model`],[`longt5`,`LongT5Model`],[`mt5`,`MT5Model`],[`bart`,`BartModel`],[`mbart`,`MBartModel`],[`marian`,`MarianModel`],[`whisper`,`WhisperModel`],[`cohere_asr`,`CohereAsrModel`],[`m2m_100`,`M2M100Model`],[`blenderbot`,`BlenderbotModel`],[`blenderbot-small`,`BlenderbotSmallModel`]]),lk=/* @__PURE__ */ new Map([[`mimi`,`MimiModel`],[`dac`,`DacModel`],[`snac`,`SnacModel`]]),uk=/* @__PURE__ */ new Map([[`bloom`,`BloomModel`],[`jais`,`JAISModel`],[`gpt2`,`GPT2Model`],[`gpt_oss`,`GptOssModel`],[`gptj`,`GPTJModel`],[`gpt_bigcode`,`GPTBigCodeModel`],[`gpt_neo`,`GPTNeoModel`],[`gpt_neox`,`GPTNeoXModel`],[`codegen`,`CodeGenModel`],[`llama`,`LlamaModel`],[`apertus`,`ApertusModel`],[`nanochat`,`NanoChatModel`],[`arcee`,`ArceeModel`],[`afmoe`,`AfmoeModel`],[`lfm2`,`Lfm2Model`],[`lfm2_moe`,`Lfm2MoeModel`],[`smollm3`,`SmolLM3Model`],[`exaone`,`ExaoneModel`],[`olmo`,`OlmoModel`],[`olmo2`,`Olmo2Model`],[`olmo3`,`Olmo3Model`],[`olmo_hybrid`,`OlmoHybridModel`],[`mobilellm`,`MobileLLMModel`],[`granite`,`GraniteModel`],[`granitemoehybrid`,`GraniteMoeHybridModel`],[`cohere`,`CohereModel`],[`cohere2`,`Cohere2Model`],[`gemma`,`GemmaModel`],[`gemma2`,`Gemma2Model`],[`vaultgemma`,`VaultGemmaModel`],[`gemma3_text`,`Gemma3Model`],[`helium`,`HeliumModel`],[`glm`,`GlmModel`],[`glm_moe_dsa`,`GlmMoeDsaModel`],[`openelm`,`OpenELMModel`],[`qwen2`,`Qwen2Model`],[`qwen2_moe`,`Qwen2MoeModel`],[`qwen3`,`Qwen3Model`],[`qwen3_moe`,`Qwen3MoeModel`],[`qwen3_next`,`Qwen3NextModel`],[`phi`,`PhiModel`],[`phi3`,`Phi3Model`],[`mpt`,`MptModel`],[`opt`,`OPTModel`],[`mistral`,`MistralModel`],[`mistral4`,`Mistral4Model`],[`ministral`,`MinistralModel`],[`ministral3`,`Ministral3Model`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2Model`],[`deepseek_v3`,`DeepseekV3Model`],[`deepseek_v4`,`DeepseekV4Model`],[`falcon`,`FalconModel`],[`falcon_h1`,`FalconH1Model`],[`nemotron_h`,`NemotronHModel`],[`solar_open`,`SolarOpenModel`],[`stablelm`,`StableLmModel`],[`modernbert-decoder`,`ModernBertDecoderModel`],[`hunyuan_v1_dense`,`HunYuanDenseV1Model`],[`youtu`,`YoutuModel`],[`zaya`,`ZayaModel`],[`hrm_text`,`HrmTextModel`]]),dk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForSpeechToText`],[`whisper`,`WhisperForConditionalGeneration`],[`lite-whisper`,`LiteWhisperForConditionalGeneration`],[`moonshine`,`MoonshineForConditionalGeneration`],[`cohere_asr`,`CohereAsrForConditionalGeneration`]]),fk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForTextToSpeech`]]),pk=/* @__PURE__ */ new Map([[`vits`,`VitsModel`],[`musicgen`,`MusicgenForConditionalGeneration`],[`supertonic`,`SupertonicForConditionalGeneration`]]),mk=/* @__PURE__ */ new Map([[`bert`,`BertForSequenceClassification`],[`eurobert`,`EuroBertForSequenceClassification`],[`neobert`,`NeoBertForSequenceClassification`],[`modernbert`,`ModernBertForSequenceClassification`],[`roformer`,`RoFormerForSequenceClassification`],[`electra`,`ElectraForSequenceClassification`],[`esm`,`EsmForSequenceClassification`],[`convbert`,`ConvBertForSequenceClassification`],[`camembert`,`CamembertForSequenceClassification`],[`deberta`,`DebertaForSequenceClassification`],[`deberta-v2`,`DebertaV2ForSequenceClassification`],[`mpnet`,`MPNetForSequenceClassification`],[`albert`,`AlbertForSequenceClassification`],[`distilbert`,`DistilBertForSequenceClassification`],[`roberta`,`RobertaForSequenceClassification`],[`xlm`,`XLMForSequenceClassification`],[`xlm-roberta`,`XLMRobertaForSequenceClassification`],[`bart`,`BartForSequenceClassification`],[`mbart`,`MBartForSequenceClassification`],[`mobilebert`,`MobileBertForSequenceClassification`],[`squeezebert`,`SqueezeBertForSequenceClassification`]]),hk=/* @__PURE__ */ new Map([[`bert`,`BertForTokenClassification`],[`eurobert`,`EuroBertForTokenClassification`],[`neobert`,`NeoBertForTokenClassification`],[`modernbert`,`ModernBertForTokenClassification`],[`roformer`,`RoFormerForTokenClassification`],[`electra`,`ElectraForTokenClassification`],[`esm`,`EsmForTokenClassification`],[`convbert`,`ConvBertForTokenClassification`],[`camembert`,`CamembertForTokenClassification`],[`deberta`,`DebertaForTokenClassification`],[`deberta-v2`,`DebertaV2ForTokenClassification`],[`mpnet`,`MPNetForTokenClassification`],[`distilbert`,`DistilBertForTokenClassification`],[`roberta`,`RobertaForTokenClassification`],[`xlm`,`XLMForTokenClassification`],[`xlm-roberta`,`XLMRobertaForTokenClassification`],[`openai_privacy_filter`,`OpenAIPrivacyFilterForTokenClassification`]]),gk=/* @__PURE__ */ new Map([[`t5`,`T5ForConditionalGeneration`],[`longt5`,`LongT5ForConditionalGeneration`],[`mt5`,`MT5ForConditionalGeneration`],[`bart`,`BartForConditionalGeneration`],[`mbart`,`MBartForConditionalGeneration`],[`marian`,`MarianMTModel`],[`m2m_100`,`M2M100ForConditionalGeneration`],[`blenderbot`,`BlenderbotForConditionalGeneration`],[`blenderbot-small`,`BlenderbotSmallForConditionalGeneration`]]),_k=/* @__PURE__ */ new Map([[`bloom`,`BloomForCausalLM`],[`gpt2`,`GPT2LMHeadModel`],[`gpt_oss`,`GptOssForCausalLM`],[`jais`,`JAISLMHeadModel`],[`gptj`,`GPTJForCausalLM`],[`gpt_bigcode`,`GPTBigCodeForCausalLM`],[`gpt_neo`,`GPTNeoForCausalLM`],[`gpt_neox`,`GPTNeoXForCausalLM`],[`codegen`,`CodeGenForCausalLM`],[`llama`,`LlamaForCausalLM`],[`nanochat`,`NanoChatForCausalLM`],[`apertus`,`ApertusForCausalLM`],[`llama4_text`,`Llama4ForCausalLM`],[`arcee`,`ArceeForCausalLM`],[`afmoe`,`AfmoeForCausalLM`],[`lfm2`,`Lfm2ForCausalLM`],[`lfm2_moe`,`Lfm2MoeForCausalLM`],[`smollm3`,`SmolLM3ForCausalLM`],[`exaone`,`ExaoneForCausalLM`],[`olmo`,`OlmoForCausalLM`],[`olmo2`,`Olmo2ForCausalLM`],[`olmo3`,`Olmo3ForCausalLM`],[`olmo_hybrid`,`OlmoHybridForCausalLM`],[`mobilellm`,`MobileLLMForCausalLM`],[`granite`,`GraniteForCausalLM`],[`granitemoehybrid`,`GraniteMoeHybridForCausalLM`],[`cohere`,`CohereForCausalLM`],[`cohere2`,`Cohere2ForCausalLM`],[`gemma`,`GemmaForCausalLM`],[`gemma2`,`Gemma2ForCausalLM`],[`vaultgemma`,`VaultGemmaForCausalLM`],[`gemma3_text`,`Gemma3ForCausalLM`],[`gemma3`,`Gemma3ForCausalLM`],[`helium`,`HeliumForCausalLM`],[`glm`,`GlmForCausalLM`],[`glm_moe_dsa`,`GlmMoeDsaForCausalLM`],[`openelm`,`OpenELMForCausalLM`],[`qwen2`,`Qwen2ForCausalLM`],[`qwen2_moe`,`Qwen2MoeForCausalLM`],[`qwen3`,`Qwen3ForCausalLM`],[`qwen3_moe`,`Qwen3MoeForCausalLM`],[`qwen3_next`,`Qwen3NextForCausalLM`],[`qwen2_vl`,`Qwen2VLForCausalLM`],[`qwen2_5_vl`,`Qwen2_5_VLForCausalLM`],[`qwen3_vl`,`Qwen3VLForCausalLM`],[`qwen3_vl_moe`,`Qwen3VLMoeForCausalLM`],[`qwen3_5`,`Qwen3_5ForCausalLM`],[`qwen3_5_text`,`Qwen3_5ForCausalLM`],[`qwen3_5_moe`,`Qwen3_5MoeForCausalLM`],[`gemma3n`,`Gemma3nForCausalLM`],[`gemma4`,`Gemma4ForCausalLM`],[`phi`,`PhiForCausalLM`],[`phi3`,`Phi3ForCausalLM`],[`mpt`,`MptForCausalLM`],[`opt`,`OPTForCausalLM`],[`mbart`,`MBartForCausalLM`],[`mistral`,`MistralForCausalLM`],[`mistral4`,`Mistral4ForCausalLM`],[`ministral`,`MinistralForCausalLM`],[`ministral3`,`Ministral3ForCausalLM`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2ForCausalLM`],[`deepseek_v3`,`DeepseekV3ForCausalLM`],[`deepseek_v4`,`DeepseekV4ForCausalLM`],[`falcon`,`FalconForCausalLM`],[`falcon_h1`,`FalconH1ForCausalLM`],[`nemotron_h`,`NemotronHForCausalLM`],[`trocr`,`TrOCRForCausalLM`],[`solar_open`,`SolarOpenForCausalLM`],[`stablelm`,`StableLmForCausalLM`],[`modernbert-decoder`,`ModernBertDecoderForCausalLM`],[`hunyuan_v1_dense`,`HunYuanDenseV1ForCausalLM`],[`youtu`,`YoutuForCausalLM`],[`zaya`,`ZayaForCausalLM`],[`hrm_text`,`HrmTextForCausalLM`],[`phi3_v`,`Phi3VForCausalLM`]]),vk=/* @__PURE__ */ new Map([[`multi_modality`,`MultiModalityCausalLM`]]),yk=/* @__PURE__ */ new Map([[`bert`,`BertForMaskedLM`],[`eurobert`,`EuroBertForMaskedLM`],[`neobert`,`NeoBertForMaskedLM`],[`modernbert`,`ModernBertForMaskedLM`],[`roformer`,`RoFormerForMaskedLM`],[`electra`,`ElectraForMaskedLM`],[`esm`,`EsmForMaskedLM`],[`convbert`,`ConvBertForMaskedLM`],[`camembert`,`CamembertForMaskedLM`],[`deberta`,`DebertaForMaskedLM`],[`deberta-v2`,`DebertaV2ForMaskedLM`],[`mpnet`,`MPNetForMaskedLM`],[`albert`,`AlbertForMaskedLM`],[`distilbert`,`DistilBertForMaskedLM`],[`roberta`,`RobertaForMaskedLM`],[`xlm`,`XLMWithLMHeadModel`],[`xlm-roberta`,`XLMRobertaForMaskedLM`],[`mobilebert`,`MobileBertForMaskedLM`],[`squeezebert`,`SqueezeBertForMaskedLM`]]),bk=/* @__PURE__ */ new Map([[`bert`,`BertForQuestionAnswering`],[`neobert`,`NeoBertForQuestionAnswering`],[`roformer`,`RoFormerForQuestionAnswering`],[`electra`,`ElectraForQuestionAnswering`],[`convbert`,`ConvBertForQuestionAnswering`],[`camembert`,`CamembertForQuestionAnswering`],[`deberta`,`DebertaForQuestionAnswering`],[`deberta-v2`,`DebertaV2ForQuestionAnswering`],[`mpnet`,`MPNetForQuestionAnswering`],[`albert`,`AlbertForQuestionAnswering`],[`distilbert`,`DistilBertForQuestionAnswering`],[`roberta`,`RobertaForQuestionAnswering`],[`xlm`,`XLMForQuestionAnswering`],[`xlm-roberta`,`XLMRobertaForQuestionAnswering`],[`mobilebert`,`MobileBertForQuestionAnswering`],[`squeezebert`,`SqueezeBertForQuestionAnswering`]]),xk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`]]),Sk=/* @__PURE__ */ new Map([[`llava`,`LlavaForConditionalGeneration`],[`llava_onevision`,`LlavaOnevisionForConditionalGeneration`],[`moondream1`,`Moondream1ForConditionalGeneration`],[`florence2`,`Florence2ForConditionalGeneration`],[`qwen2_vl`,`Qwen2VLForConditionalGeneration`],[`qwen2_5_vl`,`Qwen2_5_VLForConditionalGeneration`],[`qwen3_vl`,`Qwen3VLForConditionalGeneration`],[`qwen3_vl_moe`,`Qwen3VLMoeForConditionalGeneration`],[`qwen3_5`,`Qwen3_5ForConditionalGeneration`],[`qwen3_5_moe`,`Qwen3_5MoeForConditionalGeneration`],[`lfm2_vl`,`Lfm2VlForConditionalGeneration`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`],[`paligemma`,`PaliGemmaForConditionalGeneration`],[`llava_qwen2`,`LlavaQwen2ForCausalLM`],[`gemma3`,`Gemma3ForConditionalGeneration`],[`gemma3n`,`Gemma3nForConditionalGeneration`],[`gemma4`,`Gemma4ForConditionalGeneration`],[`mistral3`,`Mistral3ForConditionalGeneration`],[`lighton_ocr`,`LightOnOcrForConditionalGeneration`],[`glm_ocr`,`GlmOcrForConditionalGeneration`]]),Ck=/* @__PURE__ */ new Map([[`granite_speech`,`GraniteSpeechForConditionalGeneration`],[`ultravox`,`UltravoxModel`],[`voxtral`,`VoxtralForConditionalGeneration`],[`voxtral_realtime`,`VoxtralRealtimeForConditionalGeneration`]]),wk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`]]),Tk=/* @__PURE__ */ new Map([[`vit`,`ViTForImageClassification`],[`ijepa`,`IJepaForImageClassification`],[`pvt`,`PvtForImageClassification`],[`vit_msn`,`ViTMSNForImageClassification`],[`fastvit`,`FastViTForImageClassification`],[`mobilevit`,`MobileViTForImageClassification`],[`mobilevitv2`,`MobileViTV2ForImageClassification`],[`beit`,`BeitForImageClassification`],[`deit`,`DeiTForImageClassification`],[`hiera`,`HieraForImageClassification`],[`convnext`,`ConvNextForImageClassification`],[`convnextv2`,`ConvNextV2ForImageClassification`],[`dinov2`,`Dinov2ForImageClassification`],[`dinov2_with_registers`,`Dinov2WithRegistersForImageClassification`],[`resnet`,`ResNetForImageClassification`],[`swin`,`SwinForImageClassification`],[`segformer`,`SegformerForImageClassification`],[`efficientnet`,`EfficientNetForImageClassification`],[`mobilenet_v1`,`MobileNetV1ForImageClassification`],[`mobilenet_v2`,`MobileNetV2ForImageClassification`],[`mobilenet_v3`,`MobileNetV3ForImageClassification`],[`mobilenet_v4`,`MobileNetV4ForImageClassification`]]),Ek=/* @__PURE__ */ new Map([[`detr`,`DetrForObjectDetection`],[`rt_detr`,`RTDetrForObjectDetection`],[`rt_detr_v2`,`RTDetrV2ForObjectDetection`],[`rf_detr`,`RFDetrForObjectDetection`],[`d_fine`,`DFineForObjectDetection`],[`table-transformer`,`TableTransformerForObjectDetection`],[`yolos`,`YolosForObjectDetection`]]),Dk=/* @__PURE__ */ new Map([[`owlvit`,`OwlViTForObjectDetection`],[`owlv2`,`Owlv2ForObjectDetection`],[`grounding-dino`,`GroundingDinoForObjectDetection`]]),Ok=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`clipseg`,`CLIPSegForImageSegmentation`]]),kk=/* @__PURE__ */ new Map([[`segformer`,`SegformerForSemanticSegmentation`],[`sapiens`,`SapiensForSemanticSegmentation`],[`swin`,`SwinForSemanticSegmentation`],[`mobilenet_v1`,`MobileNetV1ForSemanticSegmentation`],[`mobilenet_v2`,`MobileNetV2ForSemanticSegmentation`],[`mobilenet_v3`,`MobileNetV3ForSemanticSegmentation`],[`mobilenet_v4`,`MobileNetV4ForSemanticSegmentation`]]),Ak=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`maskformer`,`MaskFormerForInstanceSegmentation`]]),jk=/* @__PURE__ */ new Map([[`sam`,`SamModel`],[`sam2`,`Sam2Model`],[`edgetam`,`EdgeTamModel`],[`sam3_tracker`,`Sam3TrackerModel`]]),Mk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForCTC`],[`wav2vec2-bert`,`Wav2Vec2BertForCTC`],[`unispeech`,`UniSpeechForCTC`],[`unispeech-sat`,`UniSpeechSatForCTC`],[`wavlm`,`WavLMForCTC`],[`hubert`,`HubertForCTC`],[`parakeet_ctc`,`ParakeetForCTC`]]),Nk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForSequenceClassification`],[`wav2vec2-bert`,`Wav2Vec2BertForSequenceClassification`],[`unispeech`,`UniSpeechForSequenceClassification`],[`unispeech-sat`,`UniSpeechSatForSequenceClassification`],[`wavlm`,`WavLMForSequenceClassification`],[`hubert`,`HubertForSequenceClassification`],[`audio-spectrogram-transformer`,`ASTForAudioClassification`]]),Pk=/* @__PURE__ */ new Map([[`wavlm`,`WavLMForXVector`]]),Fk=/* @__PURE__ */ new Map([[`unispeech-sat`,`UniSpeechSatForAudioFrameClassification`],[`wavlm`,`WavLMForAudioFrameClassification`],[`wav2vec2`,`Wav2Vec2ForAudioFrameClassification`],[`pyannote`,`PyAnnoteForAudioFrameClassification`]]),Ik=/* @__PURE__ */ new Map([[`vitmatte`,`VitMatteForImageMatting`]]),Lk=/* @__PURE__ */ new Map([[`patchtst`,`PatchTSTForPrediction`],[`patchtsmixer`,`PatchTSMixerForPrediction`]]),Rk=/* @__PURE__ */ new Map([[`swin2sr`,`Swin2SRForImageSuperResolution`]]),zk=/* @__PURE__ */ new Map([[`chmv2`,`CHMv2ForDepthEstimation`],[`dpt`,`DPTForDepthEstimation`],[`depth_anything`,`DepthAnythingForDepthEstimation`],[`glpn`,`GLPNForDepthEstimation`],[`sapiens`,`SapiensForDepthEstimation`],[`depth_pro`,`DepthProForDepthEstimation`],[`metric3d`,`Metric3DForDepthEstimation`],[`metric3dv2`,`Metric3Dv2ForDepthEstimation`]]),Bk=/* @__PURE__ */ new Map([[`sapiens`,`SapiensForNormalEstimation`]]),Vk=/* @__PURE__ */ new Map([[`vitpose`,`VitPoseForPoseEstimation`]]),Hk=/* @__PURE__ */ new Map([[`clip`,`CLIPVisionModelWithProjection`],[`siglip`,`SiglipVisionModel`],[`jina_clip`,`JinaCLIPVisionModel`]]),Uk=[[sk,Y.EncoderOnly],[ck,Y.EncoderDecoder],[uk,Y.DecoderOnlyWithoutHead],[lk,Y.AutoEncoder],[mk,Y.EncoderOnly],[hk,Y.EncoderOnly],[gk,Y.Seq2Seq],[dk,Y.Seq2Seq],[_k,Y.DecoderOnly],[vk,Y.MultiModality],[yk,Y.EncoderOnly],[bk,Y.EncoderOnly],[xk,Y.Vision2Seq],[Sk,Y.ImageTextToText],[Ck,Y.AudioTextToText],[Tk,Y.EncoderOnly],[Ok,Y.EncoderOnly],[Ak,Y.EncoderOnly],[kk,Y.EncoderOnly],[Ik,Y.EncoderOnly],[Lk,Y.EncoderOnly],[Rk,Y.EncoderOnly],[zk,Y.EncoderOnly],[Bk,Y.EncoderOnly],[Vk,Y.EncoderOnly],[Ek,Y.EncoderOnly],[Dk,Y.EncoderOnly],[jk,Y.MaskGeneration],[Mk,Y.EncoderOnly],[Nk,Y.EncoderOnly],[fk,Y.Seq2Seq],[pk,Y.EncoderOnly],[Pk,Y.EncoderOnly],[Fk,Y.EncoderOnly],[Hk,Y.EncoderOnly]];for(let[e,t]of Uk)for(let n of e.values()){Cg.set(n,t);let e=qg[n];Tg.set(e,n),wg.set(n,e)}var Wk=[[`MusicgenForConditionalGeneration`,bw,Y.Musicgen],[`Phi3VForCausalLM`,wT,Y.Phi3V],[`CLIPTextModelWithProjection`,ev,Y.EncoderOnly],[`SiglipTextModel`,VE,Y.EncoderOnly],[`JinaCLIPTextModel`,fS,Y.EncoderOnly],[`ClapTextModelWithProjection`,Y_,Y.EncoderOnly],[`ClapAudioModelWithProjection`,X_,Y.EncoderOnly],[`DacEncoderModel`,Vv,Y.EncoderOnly],[`DacDecoderModel`,Hv,Y.EncoderOnly],[`MimiEncoderModel`,tC,Y.EncoderOnly],[`MimiDecoderModel`,nC,Y.EncoderOnly],[`SnacEncoderModel`,YE,Y.EncoderOnly],[`SnacDecoderModel`,XE,Y.EncoderOnly],[`Gemma3nForConditionalGeneration`,Bb,Y.ImageAudioTextToText],[`Gemma4ForConditionalGeneration`,Hb,Y.ImageAudioTextToText],[`SupertonicForConditionalGeneration`,yD,Y.Supertonic],[`ChatterboxModel`,H_,Y.Chatterbox],[`VoxtralRealtimeForConditionalGeneration`,bO,Y.VoxtralRealtime]];for(let[e,t,n]of Wk)Cg.set(e,n),Tg.set(t,e),wg.set(e,t);var Gk=/* @__PURE__ */ new Map([[`modnet`,Ok],[`birefnet`,Ok],[`isnet`,Ok],[`ben`,Ok]]);for(let[e,t]of Gk.entries())t.set(e,`PreTrainedModel`),Cg.set(e,Y.EncoderOnly),wg.set(e,X);var Kk=new Set(Gk.keys());Cg.set(`PreTrainedModel`,Y.EncoderOnly),Tg.set(X,`PreTrainedModel`);var Z={MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES:mk,MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES:hk,MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES:fk,MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES:pk,MODEL_FOR_MASKED_LM_MAPPING_NAMES:yk,MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES:bk,MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES:Tk,MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES:Ok,MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES:kk,MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES:Ak,MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES:Ek,MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES:Dk,MODEL_FOR_MASK_GENERATION_MAPPING_NAMES:jk,MODEL_FOR_CTC_MAPPING_NAMES:Mk,MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES:Nk,MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES:Pk,MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES:Fk,MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES:wk,MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES:Ik,MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES:Rk,MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES:zk,MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES:Bk,MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES:Vk,MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES:Hk,MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES:Sk,MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES:Ck,MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES:gk,MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES:dk,MODEL_FOR_CAUSAL_LM_MAPPING_NAMES:_k,MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES:xk};vg(Z);var Q=class{static MODEL_CLASS_MAPPINGS=null;static BASE_IF_FAIL=!1;static supports(e){if(!this.MODEL_CLASS_MAPPINGS)return!1;for(let t of this.MODEL_CLASS_MAPPINGS)if(t.has(e))return!0;return this.BASE_IF_FAIL}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d};if(f.config=await Ch.from_pretrained(e,f),!this.MODEL_CLASS_MAPPINGS)throw Error("`MODEL_CLASS_MAPPINGS` not implemented for this type of `AutoClass`: "+this.name);let{model_type:p}=f.config;for(let t of this.MODEL_CLASS_MAPPINGS){let n=t.get(p);if(!n){for(let e of t.values())if(e[0]===p){n=e;break}if(!n)continue}return await qg[n].from_pretrained(e,f)}if(this.BASE_IF_FAIL)return Kk.has(p)||A.warn(`Unknown model class "${p}", attempting to construct from base class.`),await X.from_pretrained(e,f);throw Error(`Unsupported model type: ${p}`)}},qk=class extends Q{static MODEL_CLASS_MAPPINGS=Uk.map(e=>e[0]);static BASE_IF_FAIL=!0},Jk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES]},Yk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES]},Xk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES]},Zk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES]},Qk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES]},$k=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES]},eA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES]},tA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASKED_LM_MAPPING_NAMES]},nA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES]},rA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES]},iA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES]},aA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES]},oA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES]},sA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES]},cA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES]},lA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASK_GENERATION_MAPPING_NAMES]});var uA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CTC_MAPPING_NAMES]},dA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES]};var fA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES]});var pA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES]},mA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES]};var hA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES]};async function gA(e){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>Vf.read(e)))}async function _A(e,t){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>typeof e==`string`||e instanceof URL?Wd(e,t):e instanceof Float64Array?new Float32Array(e):e))}function vA(e,t){t&&(e=e.map(e=>e|0));let[n,r,i,a]=e;return{xmin:n,ymin:r,xmax:i,ymax:a}}var yA=class extends $r{constructor({task:e,model:t,tokenizer:n=null,processor:r=null}){super(),this.task=e,this.model=t,this.tokenizer=n,this.processor=r}async dispose(){await this.model.dispose()}},bA=class extends yA{async _call(e,{top_k:t=1}={}){let n=this.tokenizer(e,{padding:!0,truncation:!0}),r=await this.model(n),{problem_type:i,id2label:a}=this.model.config,o=i===`multi_label_classification`?e=>e.sigmoid():e=>new V(`float32`,ol(e.data),e.dims),s=[];for(let e of r.logits){let n=await iu(o(e),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));t===1?s.push(...i):s.push(i)}return Array.isArray(e)||t===1?s:s[0]}},xA=class extends yA{async _call(e,{ignore_labels:t=[`O`],aggregation_strategy:n=`none`}={}){if(n!==`none`&&n!==`simple`)throw Error(`Invalid aggregation_strategy: "${n}". Must be one of "none" or "simple".`);let r=Array.isArray(e),i=this.tokenizer(r?e:[e],{padding:!0,truncation:!0}),a=(await this.model(i)).logits,o=this.model.config.id2label,s=[];for(let e=0;e{let o=0,s=[];for(let n=i;ne==u),i=a[e].tolist(),f=o[e].tolist();for(let n=1;ne==t[n])!==-1)&&(i[n]=-1/0,f[n]=-1/0);let p=ol(i).map((e,t)=>[e,t]),m=ol(f).map((e,t)=>[e,t]);p[0][0]=0,m[0][0]=0;let h=oi(p,m).filter(e=>e[0][1]<=e[1][1]).map(e=>[e[0][1],e[1][1],e[0][0]*e[1][0]]).sort((e,t)=>t[2]-e[2]),g=[];for(let e=0;ee==n);if(c===-1)throw Error(`Mask token (${r}) not found in text.`);let l=a[e][c],u=await iu(new V(`float32`,ol(l.data),l.dims),t),d=u[0].tolist(),f=u[1].tolist();o.push(f.map((e,t)=>{let n=i.slice();return n[c]=e,{score:d[t],token:Number(e),token_str:this.tokenizer.decode([e]),sequence:this.tokenizer.decode(n,{skip_special_tokens:!0})}}))}return Array.isArray(e)?o:o[0]}},EA=class extends yA{_default_generation_config={max_new_tokens:256};_key=`generated_text`;async _call(e,t={}){Array.isArray(e)||(e=[e]),this.model.config.prefix&&(e=e.map(e=>this.model.config.prefix+e));let n=this.model.config.task_specific_params;n&&n[this.task]&&n[this.task].prefix&&(e=e.map(e=>n[this.task].prefix+e));let r=this.tokenizer,i={padding:!0,truncation:!0},a;a=this.task===`translation`&&`_build_translation_inputs`in r?r._build_translation_inputs(e,i,t):r(e,i);let o=await this.model.generate({...a,...this._default_generation_config,...t});return r.batch_decode(o,{skip_special_tokens:!0}).map(e=>({[this._key]:e}))}},DA=class extends EA{_key=`summary_text`},OA=class extends EA{_key=`translation_text`};function kA(e){return Array.isArray(e)&&e.every(e=>`role`in e&&`content`in e)}var AA=class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t={}){let{add_special_tokens:n,return_full_text:r,tools:i,documents:a,chat_template:o,tokenizer_encode_kwargs:s,...c}=t,l=!1,u=!1,d=n??(this.tokenizer.add_bos_token||this.tokenizer.add_eos_token)??!1,f=s,p;if(typeof e==`string`)p=e=[e];else if(Array.isArray(e)&&e.every(e=>typeof e==`string`))l=!0,p=e;else{if(kA(e))e=[e];else if(Array.isArray(e)&&e.every(kA))l=!0;else throw Error(`Input must be a string, an array of strings, a Chat, or an array of Chats`);u=!0;let t={tokenize:!1,add_generation_prompt:!0,...ci({tools:i,documents:a,chat_template:o},[`tools`,`documents`,`chat_template`]),...f};p=e.map(e=>this.tokenizer.apply_chat_template(e,t)),d=!1,f=void 0}let m=u?!1:r??!0;this.tokenizer.padding_side=`left`;let h=this.tokenizer(p,{add_special_tokens:d,padding:!0,truncation:!0,...f}),g=await this.model.generate({...h,...this._default_generation_config,...c}),_=this.tokenizer.batch_decode(g,{skip_special_tokens:!0}),v;!m&&h.input_ids.dims.at(-1)>0&&(v=this.tokenizer.batch_decode(h.input_ids,{skip_special_tokens:!0}).map(e=>e.length));let y=Array.from({length:e.length},e=>[]);for(let t=0;t<_.length;++t){let n=Math.floor(t/g.dims[0]*e.length);v&&(_[t]=_[t].slice(v[n])),y[n].push({generated_text:u?[...e[n],{role:`assistant`,content:_[t]}]:_[t]})}return!l&&y.length===1?y[0]:y}},jA=class extends yA{constructor(e){super(e),this.label2id=Object.fromEntries(Object.entries(this.model.config.label2id).map(([e,t])=>[e.toLowerCase(),t])),this.entailment_id=this.label2id.entailment,this.entailment_id===void 0&&(A.warn(`Could not find 'entailment' in label2id mapping. Using 2 as entailment_id.`),this.entailment_id=2),this.contradiction_id=this.label2id.contradiction??this.label2id.not_entailment,this.contradiction_id===void 0&&(A.warn(`Could not find 'contradiction' in label2id mapping. Using 0 as contradiction_id.`),this.contradiction_id=0)}async _call(e,t,{hypothesis_template:n=`This example is {}.`,multi_label:r=!1}={}){let i=Array.isArray(e);i||(e=[e]),Array.isArray(t)||(t=[t]);let a=t.map(e=>n.replace(`{}`,e)),o=r||t.length===1,s=[];for(let n of e){let e=[];for(let t of a){let r=this.tokenizer(n,{text_pair:t,padding:!0,truncation:!0}),i=await this.model(r);o?e.push([i.logits.data[this.contradiction_id],i.logits.data[this.entailment_id]]):e.push(i.logits.data[this.entailment_id])}let r=(o?e.map(e=>ol(e)[1]):ol(e)).map((e,t)=>[e,t]).sort((e,t)=>t[0]-e[0]);s.push({sequence:n,labels:r.map(e=>t[e[1]]),scores:r.map(e=>e[0])})}return i?s:s[0]}},MA=class extends yA{async _call(e,{top_k:t=5}={}){let n=this.processor.feature_extractor.config.sampling_rate,r=await _A(e,n),i=this.model.config.id2label,a=[];for(let e of r){let n=await this.processor(e),r=(await this.model(n)).logits[0],o=await iu(new V(`float32`,ol(r.data),r.dims),t),s=o[0].tolist(),c=o[1].tolist().map((e,t)=>({label:i?i[e]:`LABEL_${e}`,score:s[t]}));a.push(c)}return Array.isArray(e)?a:a[0]}},NA=class extends yA{async _call(e,t,{hypothesis_template:n=`This is a sound of {}.`}={}){let r=!Array.isArray(e);r&&(e=[e]);let i=t.map(e=>n.replace(`{}`,e)),a=this.tokenizer(i,{padding:!0,truncation:!0}),o=this.processor.feature_extractor.config.sampling_rate,s=await _A(e,o),c=[];for(let e of s){let n=await this.processor(e),r=ol((await this.model({...a,...n})).logits_per_audio.data);c.push([...r].map((e,n)=>({score:e,label:t[n]})))}return r?c[0]:c}},PA=class extends yA{_default_generation_config={};async _call(e,t={}){switch(t={...this._default_generation_config,...t},this.model.config.model_type){case`whisper`:case`lite-whisper`:return this._call_whisper(e,t);case`wav2vec2`:case`wav2vec2-bert`:case`unispeech`:case`unispeech-sat`:case`hubert`:case`parakeet_ctc`:return this._call_wav2vec2(e,t);case`moonshine`:return this._call_moonshine(e,t);case`cohere_asr`:return this._call_cohere_asr(e,t);default:throw Error(`AutomaticSpeechRecognitionPipeline does not support model type '${this.model.config.model_type}'.`)}}async _call_wav2vec2(e,t){t.language&&A.warn('`language` parameter is not yet supported for `wav2vec2` models, defaulting to "English".'),t.task&&A.warn('`task` parameter is not yet supported for `wav2vec2` models, defaulting to "transcribe".');let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let t=await this.processor(e),n=(await this.model(t)).logits[0],r=[];for(let e of n)r.push(ll(e.data)[1]);let i=this.tokenizer.decode(r,{skip_special_tokens:!0}).trim();o.push({text:i})}return n?o[0]:o}async _call_whisper(e,t){let n=t.return_timestamps??!1,r=t.chunk_length_s??0,i=t.force_full_sequences??!1,a=t.stride_length_s??null,o={...t};n===`word`&&(o.return_token_timestamps=!0,o.return_timestamps=!0);let s=!Array.isArray(e),c=s?[e]:e,l=this.processor.feature_extractor.config,u=l.chunk_length/this.model.config.max_source_positions,d=l.hop_length,f=l.sampling_rate,p=await _A(c,f),m=[];for(let e of p){let t=[];if(r>0){if(a===null)a=r/6;else if(r<=a)throw Error("`chunk_length_s` must be larger than `stride_length_s`.");let n=f*r,i=f*a,o=n-2*i,s=0;for(;;){let r=s+n,a=e.subarray(s,r),c=await this.processor(a),l=s===0,u=r>=e.length;if(t.push({stride:[a.length,l?0:i,u?0:i],input_features:c.input_features,is_last:u}),u)break;s+=o}}else t=[{stride:[e.length,0,0],input_features:(await this.processor(e)).input_features,is_last:!0}];for(let e of t){o.num_frames=Math.floor(e.stride[0]/d);let t=await this.model.generate({inputs:e.input_features,...o});if(n===`word`){let n=t.sequences.tolist()[0],r=t.token_timestamps.tolist()[0],i=this.tokenizer.timestamp_begin,a=Math.max(n.findIndex(e=>Number(e)>=i),0);e.tokens=n.slice(a),e.token_timestamps=r.slice(a).map(e=>hl(e,2))}else e.tokens=t[0].tolist();e.stride=e.stride.map(e=>e/f)}let[s,c]=this.tokenizer._decode_asr(t,{time_precision:u,return_timestamps:n,force_full_sequences:i});m.push({text:s,...c})}return s?m[0]:m}async _call_moonshine(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let n=await this.processor(e),r=Math.floor(e.length/i)*6,a=await this.model.generate({max_new_tokens:r,...t,...n}),s=this.tokenizer.batch_decode(a,{skip_special_tokens:!0})[0];o.push({text:s})}return n?o[0]:o}async _call_cohere_asr(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor,a=i.config.sampling_rate,o=await _A(r,a),s=t.language??`en`,c=this.processor.get_decoder_prompt_ids(s),l=[];for(let e of o){let n=i.split_audio(e),r=[];for(let e of n){let n=await this.processor(e),i=await this.model.generate({...n,decoder_input_ids:c,...t}),a=this.tokenizer.decode(i[0].tolist(),{skip_special_tokens:!0}).trim();r.push(a)}let a=this.processor.constructor.join_chunks(r,s);l.push({text:a})}return n?l[0]:l}},FA=class extends yA{DEFAULT_VOCODER_ID=`Xenova/speecht5_hifigan`;constructor(e){super(e),this.vocoder=e.vocoder??null}async _prepare_speaker_embeddings(e,t){if((typeof e==`string`||e instanceof URL)&&(e=new Float32Array(await(await k.fetch(e)).arrayBuffer())),e instanceof Float32Array)e=new V(`float32`,e,[e.length]);else if(!(e instanceof V))throw Error("Speaker embeddings must be a `Tensor`, `Float32Array`, `string`, or `URL`.");if(t>1){if(e.dims[0]===1)e=e.repeat(t,1);else if(e.dims[0]!==t)throw Error(`Expected speaker embeddings batch size to be 1 or ${t}, but got ${e.dims[0]}.`)}return e}_postprocess_waveform(e,t,n,r=null){let i=t.data,[a,o]=t.dims,s=r?r.data:null,c=[];for(let e=0;e({generated_text:e.trim()}));a.push(r)}return n?a:a[0]}},LA=class extends yA{async _call(e,{top_k:t=5}={}){let n=await gA(e),{pixel_values:r}=await this.processor(n),i=await this.model({pixel_values:r}),{id2label:a}=this.model.config,o=[];for(let e of i.logits){let n=await iu(new V(`float32`,ol(e.data),e.dims),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));o.push(i)}return Array.isArray(e)?o:o[0]}},RA={panoptic:`post_process_panoptic_segmentation`,instance:`post_process_instance_segmentation`,semantic:`post_process_semantic_segmentation`},zA=class extends yA{async _call(e,{threshold:t=.5,mask_threshold:n=.5,overlap_mask_area_threshold:r=.8,label_ids_to_fuse:i=null,target_sizes:a=null,subtask:o=null}={}){if(Array.isArray(e)&&e.length!==1)throw Error(`Image segmentation pipeline currently only supports a batch size of 1.`);let s=await gA(e),c=s.map(e=>[e.height,e.width]),l=await this.processor(s),{inputNames:u,outputNames:d}=this.model.sessions.model;if(!u.includes(`pixel_values`)){if(u.length!==1)throw Error(`Expected a single input name, but got ${u.length} inputs: ${u}.`);let e=u[0];if(e in l)throw Error(`Input name ${e} already exists in the inputs.`);l[e]=l.pixel_values}let f=await this.model(l),p=null;if(o!==null)p=RA[o];else if(this.processor.image_processor){for(let[e,t]of Object.entries(RA))if(t in this.processor.image_processor){p=this.processor.image_processor[t].bind(this.processor.image_processor),o=e;break}}let m=this.model.config.id2label,h=[];if(!o){let e=f[d[0]];for(let t=0;te<-1e-5||e>1.00001)&&r.sigmoid_();let i=await Vf.fromTensor(r.mul_(255).to(`uint8`)).resize(n[1],n[0]);h.push({label:null,score:null,mask:i})}}else if(o===`panoptic`||o===`instance`){let e=p(f,t,n,r,i,a??c)[0],o=e.segmentation;for(let t of e.segments_info){let e=new Uint8ClampedArray(o.data.length);for(let n=0;n{let n=e.clone();return n.putAlpha(r[t].mask),n});return Array.isArray(e)?i:i[0]}},model:[aA,oA,sA],default:{model:`Xenova/modnet`},type:`image`},"zero-shot-image-classification":{pipeline:class extends yA{async _call(e,t,{hypothesis_template:n=`This is a photo of {}`}={}){let r=Array.isArray(e),i=await gA(e),a=t.map(e=>n.replace(`{}`,e)),o=this.tokenizer(a,{padding:this.model.config.model_type!==`siglip`||`max_length`,truncation:!0}),{pixel_values:s}=await this.processor(i),c=await this.model({...o,pixel_values:s}),l=this.model.config.model_type===`siglip`?e=>e.sigmoid().data:e=>ol(e.data),u=[];for(let e of c.logits_per_image){let n=[...l(e)].map((e,n)=>({score:e,label:t[n]}));n.sort((e,t)=>t.score-e.score),u.push(n)}return r?u:u[0]}},model:qk,default:{model:`Xenova/clip-vit-base-patch32`},type:`multimodal`},"object-detection":{pipeline:class extends yA{async _call(e,{threshold:t=.9,percentage:n=!1}={}){let r=Array.isArray(e);if(r&&e.length!==1)throw Error(`Object detection pipeline currently only supports a batch size of 1.`);let i=await gA(e),a=n?null:i.map(e=>[e.height,e.width]),{pixel_values:o,pixel_mask:s}=await this.processor(i),c=await this.model({pixel_values:o,pixel_mask:s}),l=this.processor.image_processor.post_process_object_detection(c,t,a),{id2label:u}=this.model.config,d=l.map(e=>e.boxes.map((t,r)=>({score:e.scores[r],label:u[e.classes[r]],box:vA(t,!n)})));return r?d:d[0]}},model:cA,default:{model:`Xenova/detr-resnet-50`},type:`multimodal`},"zero-shot-object-detection":{pipeline:class extends yA{async _call(e,t,{threshold:n=.1,top_k:r=null,percentage:i=!1}={}){let a=Array.isArray(e),o=await gA(e),s=this.tokenizer(t,{padding:!0,truncation:!0}),c=await this.processor(o),l=[];for(let e=0;e({score:e.scores[n],label:e.labels[n],box:vA(t,!i)}))}else{let e=this.processor.image_processor.post_process_object_detection(f,n,u,!0)[0];p=e.boxes.map((n,r)=>({score:e.scores[r],label:t[e.classes[r]],box:vA(n,!i)}))}p.sort((e,t)=>t.score-e.score),r!==null&&(p=p.slice(0,r)),l.push(p)}return a?l:l[0]}},model:lA,default:{model:`Xenova/owlvit-base-patch32`},type:`multimodal`},"document-question-answering":{pipeline:class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t,n={}){if(Array.isArray(e)){if(e.length!==1)throw Error(`Document Question Answering pipeline currently only supports a batch size of 1.`);e=e[0]}let r=(await gA(e))[0],{pixel_values:i}=await this.processor(r),a=`${t}`,o=this.tokenizer(a,{add_special_tokens:!1,padding:!0,truncation:!0}).input_ids,s=await this.model.generate({inputs:i,max_length:this.model.config.decoder.max_position_embeddings,decoder_input_ids:o,...this._default_generation_config,...n}),c=this.tokenizer.batch_decode(s)[0].match(/(.*?)<\/s_answer>/),l=null;return c&&c.length>=2&&(l=c[1].trim()),[{answer:l}]}},model:fA,default:{model:`Xenova/donut-base-finetuned-docvqa`},type:`multimodal`},"image-to-image":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),r=await this.model(n),i=[];for(let e of r.reconstruction){let t=e.squeeze().clamp_(0,1).mul_(255).round_().to(`uint8`);i.push(Vf.fromTensor(t))}return Array.isArray(e)?i:i[0]}},model:pA,default:{model:`Xenova/swin2SR-classical-sr-x2-64`},type:`image`},"depth-estimation":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),{predicted_depth:r}=await this.model(n),i=[];for(let e=0;et).sort((e,t)=>o[t]-o[e]).slice(0,r).map(e=>({index:e,score:o[e]}))}const WA={amp:`&`,lt:`<`,gt:`>`,quot:`"`,apos:`'`,nbsp:` `,hellip:`…`,mdash:`—`,ndash:`–`,laquo:`«`,raquo:`»`,middot:`·`,deg:`°`,times:`×`,euro:`€`,pound:`£`,reg:`®`,copy:`©`,bull:`•`,trade:`™`,rsquo:`’`,lsquo:`‘`,ldquo:`“`,rdquo:`”`};function GA(e){return typeof e!=`string`||!e?``:e.replace(/<[^>]*>/g,` `).replace(/&#x([0-9a-f]+);/gi,(e,t)=>KA(parseInt(t,16))).replace(/&#(\d+);/g,(e,t)=>KA(parseInt(t,10))).replace(/&([a-z]+);/gi,(e,t)=>WA[t.toLowerCase()]??e).replace(/\s+/g,` `).trim()}function KA(e){return Number.isFinite(e)&&e>0&&e<=1114111?String.fromCodePoint(e):``}function qA(e){return String(e??``).normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}const JA=/* @__PURE__ */ new Set(/* @__PURE__ */ `va.hoac.cua.cho.voi.mot.nung.khong.duoc.de.theo.loai.tinh.gia.thuoc.ve.tai.nha.mat.neu.thi.la.cac.nhan.bi.ra.nay`.split(`.`));function YA(e){let t=[];for(let n of qA(e).split(/[^a-z0-9]+/))n.length>1&&!JA.has(n)&&t.push(n);return t}function $(...e){for(let t of e)if(typeof t==`string`&&t.trim())return GA(t);return``}function XA(e){let t=/* @__PURE__ */ new Set,n=[],r=e=>{if(typeof e!=`string`)return;let r=e.trim();r&&!t.has(r)&&(/^https?:\/\//i.test(r)||/^data:image\//i.test(r))&&(t.add(r),n.push(r))};return Array.isArray(e.imgs)&&e.imgs.forEach(r),Array.isArray(e.images)&&e.images.forEach(r),r(e.i),r(e.image),n}function ZA(e){for(let t of[e.pn,e.salePn,e.priceNum,e.price_number,e.priceNumber]){let e=Number(t);if(Number.isFinite(e)&&e>0)return e}return 0}function QA(e){let t=Math.round(Number(e)||0);return t<=0?``:`${String(t).replace(/\B(?=(\d{3})+(?!\d))/g,`.`)}₫`}function $A(e){return $(e.p,e.priceText,e.price)||QA(ZA(e))}function ej(e){let t=e;if(typeof t==`string`&&t.trim()){let e=t.trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{t=JSON.parse(e)}catch{t=null}else t=null}let n=[];if(Array.isArray(t))for(let e of t)Array.isArray(e)&&e.length>=2?n.push([$(e[0]),$(e[1])]):e&&typeof e==`object`&&n.push([$(e.name,e.key),$(e.value)]);else if(t&&typeof t==`object`)for(let[e,r]of Object.entries(t)){let t=$(r)||(r==null?``:String(r));t&&n.push([$(e),t])}return n.filter(([e,t])=>e&&t)}function tj(e){return(Array.isArray(e.feats)?e.feats:Array.isArray(e.features)?e.features:[]).map(e=>$(e)).filter(Boolean)}function nj(e){if(!e||typeof e!=`object`)return null;let t=$(e.sku,e.mod,e.model,e.SAP),n=$(e.slug),r=$(e.n,e.name,e.title_clean,e.title)||t||n,i=t||n;return!i||!r?null:{sku:i,slug:n,model:$(e.mod,e.model,t),name:r,brand:$(e.brand),category:$(e.c,e.category,e.cs,e.category_slug),link:$(e.l,e.link),price:$A(e),priceNum:ZA(e),images:XA(e),summary:$(e.sum,e.summary,e.description,e.desc),specs:ej(e.specs),feats:tj(e),addedBy:$(e._addedBy,e._source)}}const rj={"catalogue/products.json":`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_url_added.json`,"catalogue/promos.json":`https://huggingface.co/datasets/bep40/vaistudio-data/resolve/main/promos.json`};let ij=null;function aj(){return import.meta.url.replace(/\/dist\/assets\/[^/]*$/,`/`)}function oj(e){let t=aj(),n=[new URL(`dist/`+e,t).href,new URL(e,t).href];return typeof document<`u`&&document.baseURI&&(n.push(new URL(e.replace(/^catalogue\//,`dist/catalogue/`),document.baseURI).href),n.push(new URL(e,document.baseURI).href)),[...new Set(n)]}async function sj(e){let t=rj[e],n=t?[t,...oj(e)]:oj(e),r;for(let t of n)try{let n={cache:`no-store`};typeof AbortSignal<`u`&&typeof AbortSignal.timeout==`function`&&(n.signal=AbortSignal.timeout(2e4));let i=await fetch(t,n);if(!i.ok){r=/* @__PURE__ */ Error(`HTTP ${i.status}`);continue}let a=await i.text(),o;try{o=JSON.parse(a)}catch{r=/* @__PURE__ */ Error(`body is not valid JSON`);continue}if(Array.isArray(o)?o.length===0&&e.includes(`products`):!o||typeof o!=`object`){r=/* @__PURE__ */ Error(`unexpected shape`);continue}return o}catch(e){r=e}throw Error(`Không tìm thấy ${e} (${r?.message||`không rõ`}). Chạy \`node scripts/sync-catalogue.mjs\` để nhân bản dữ liệu từ vai-avatar vào Space.`)}async function cj(){try{let e=await fetch(`https://huggingface.co/api/datasets/bep40/grob-products-updated/revision/main`,{cache:`no-store`});if(!e.ok)return null;let t=await e.json();return typeof t?.sha==`string`?t.sha:null}catch{return null}}let lj=null,uj=null;async function dj(){let e=await cj();if(e&&ij&&e===ij)return lj;let t=await fetch(`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_with_slugs.json`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=JSON.parse(await t.text());if(!Array.isArray(n)||!n.length)throw Error(`unexpected shape`);return lj=n,ij=e??`len:${n.length}`,n}function fj(){return uj||(uj=dj().catch(e=>{if(lj)return lj;throw e}).finally(()=>{uj=null}),uj)}function pj(e){return $(e.sku,e.mod,e.model).toUpperCase()?0:$(e.slug)?1:2}function mj(e){let t=[],n=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Map;for(let i of vj(Array.isArray(e)?e:[])){if(!i||typeof i!=`object`)continue;let e=$(i.slug).toLowerCase(),a=qA($(i.n,i.name,i.title)).trim(),o=$(i.imgs?.[0],i.i,i.image).split(`?`)[0],s=a&&o?`${a}\u0000${o}`:null;if(!e&&!s)continue;let c=pj(i),l=[];e&&l.push(n.get(e)),s&&l.push(r.get(s));let u=l.find(e=>e!==void 0);if(u&&u.ranke.described)).size===1&&(i.sort((e,t)=>t.images.length-e.images.length),r.set(e,i[0].images));return r}function vj(e){if(!Array.isArray(e))return e;let t=e.filter(gj);if(!t.length)return e;let n=_j(e),r=[],i=0,a=0;for(let t of e){if(!gj(t)){r.push(t);continue}let e=null;for(let r of hj($(t.n,t.name,t.title)))if(n.has(r)){e=n.get(r);break}if(e){r.push({...t,imgs:e,i:e[0],brand:`Malloca`}),i++;continue}r.push({...t,brand:`Malloca`}),a++}return t.length&&console.info(`[catalogue] Malloca misbranding: ${t.length} rows (name says Malloca, brand says otherwise). ${i} swapped to a real Malloca photo, ${a} relabelled, ${t.length-i-a} hidden.`),r}function yj(e){let t=[],n=e=>{let n=$(e).toUpperCase();n&&!t.includes(n)&&t.push(n)};n(e.sku),n(e.mod),n(e.model),n(e.SAP),n(e._source_alias),n(e.slug);let r=qA($(e.n,e.name,e.title_clean,e.title)).replace(/\s+/g,` `).trim();return r.length>8&&n(r),t}const bj=[[`name`,[`n`,`title_clean`,`title`]],[`priceNum`,[`p`,`pn`,`salePn`,`price_number`,`priceNumber`,`price`]],[`description`,[`sum`,`summary`,`desc`]],[`features`,[`feats`]],[`images`,[`imgs`,`i`,`image`]]];function xj(e){let t=e&&e.deleted;return t===!0||t===1||t===`true`||t===`1`}function Sj(e,t,n){let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Set;function o(e,t){for(let n of t){if(a.has(n))continue;let t=i.get(n);t===void 0?i.set(n,e):t!==e&&(i.delete(n),a.add(n))}}function s(e,t,n){let i=r.get(e);if(!i){r.set(e,{...t});return}let a={...i};if(n){for(let[e,r]of n)if(t[e]!==void 0)for(let e of r)delete a[e]}r.set(e,{...a,...t})}for(let e of Array.isArray(n)?n:[]){if(!e||typeof e!=`object`)continue;let t=yj(e);t.length&&(s(t[0],e),o(t[0],t))}for(let t of Array.isArray(e)?e:[]){if(!t||typeof t!=`object`)continue;let e=yj(t);if(!e.length)continue;let n=e.map(e=>i.get(e)).find(e=>e!==void 0)??e[0];s(n,t,bj),o(n,e)}let c=t&&typeof t==`object`&&t.productEdits&&typeof t.productEdits==`object`?t.productEdits:{};for(let[e,t]of Object.entries(c)){if(!t||typeof t!=`object`)continue;let n=yj(t),r=$(e).toUpperCase();if(!n.length&&!r)continue;let a=[...n,r].map(e=>i.get(e)).find(e=>e!==void 0)??r;s(a,t,bj),o(a,[...n,r])}let l=/* @__PURE__ */ new Map;for(let[e,t]of r){if(xj(t))continue;let n=nj(t);n&&l.set(e,n)}return l}function Cj(e){let t=2166136261,n=e=>{let n=String(e);for(let e=0;e>>0).toString(36)}-${e.size}`}let wj=null,Tj=null;function Ej(){return Tj||(Tj=(async()=>{let[e,t,n]=await Promise.all([sj(`catalogue/products.json`),sj(`catalogue/promos.json`).then(e=>(wj=e,e)).catch(()=>wj??{}),fj().then(e=>mj(e)).catch(()=>lj?mj(lj):[])]),r=Sj(e,t,n);return{items:r,signature:Cj(r),syncedAt:Date.now(),partial:!n.length}})().finally(()=>{Tj=null}),Tj)}async function Dj(){try{return await Ej()}catch{return null}}const Oj={name:6,model:4,brand:3,category:3,summary:1,feats:1,specs:1};function kj(e){let t={name:YA(e.name),model:YA(e.model),brand:YA(e.brand),category:YA(e.category),summary:YA(e.summary.slice(0,600)),feats:e.feats.flatMap(YA),specs:e.specs.flatMap(([e,t])=>YA(e).concat(YA(t)))},n=/* @__PURE__ */ new Map;for(let[e,r]of Object.entries(Oj))for(let i of new Set(t[e]||[]))(n.get(i)||0)2&&e.length>2&&(r.startsWith(e)||e.startsWith(r))&&(n=Math.max(n,i*.7));n&&(o+=n,s++)}s&&(o*=.55+.45*(s/r.length),i.length>3&&n.includes(i)&&(o*=1.35),a.push({sku:e.sku,score:o,product:e}))}return a.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),a.slice(0,n)}const Nj=qA;function Pj(e){return Nj(e).split(/\s+/).filter(e=>e.length>1)}const Fj=[`inox 304`,`inox sus304`,`inox304`,`inox`,`sus304`,`sus 304`,`nan oval`,`nan vuông`,`nan tron`,`nan dẹt`,`nan det`,`khung nhôm`,`nhôm`,`hợp kim`,`kính`,`gốm`,`đá granite`,`da granite`,`mây`,`thép`,`gang`,`nhựa abs`,`abs`,`thủy tinh`],Ij=[`malloca`,`eurogold`,`grob`,`canzy`,`demax`,`sunhouse`,`kangaroo`,`sharp`,`toshiba`,`panasonic`,`samsung`,`lg`,`electrolux`,`bosch`,`fischer`];function Lj(e){let t=/* @__PURE__ */ new Set,n=/(\d{1,4})\s*mm/gi,r=/[wdh]\s*[:=]?\s*(\d{1,4})/gi,i;for(;i=n.exec(e);)t.add(parseInt(i[1],10));for(;i=r.exec(e);)t.add(parseInt(i[1],10));return t}function Rj(e){let t=Nj((e.specs||[]).map(([e,t])=>`${e} ${t}`).join(` `));return{name:Nj(e.name||``),sku:Nj(e.model||e.sku||``),brand:Nj(e.brand||``),category:Nj(e.category||``),summary:Nj(e.summary||``),feats:Nj((e.feats||[]).join(` `)),specsText:t}}function zj(e,t,n){let{name:r,sku:i,brand:a,category:o,summary:s,feats:c,specsText:l}=Rj(e),u=Nj(String(t||``).trim()),d=0,f=u.replace(/[^a-z0-9]/g,``),p=r.replace(/[^a-z0-9]/g,``),m=i.replace(/[^a-z0-9]/g,``);f.length>=4&&(m===f?d+=1e3:p===f?d+=900:p.includes(f)||m.includes(f)?d+=550:m.length>=4&&f.includes(m)&&(d+=400));let h=n.filter(e=>e.length>1&&!/^\d{2,4}mm/.test(e));h.length&&h.every(e=>r.includes(e))&&(d+=300);let g=[r,a,o,Nj(e.summary||``),c,l].join(` `),_=String(t||``).trim();r===_?d+=200:i===_?d+=180:r.includes(_)?d+=100:i.includes(_)?d+=80:g.includes(_)&&(d+=50);let v=Lj(`${r} ${l} ${Nj(e.summary||``)} ${c} ${s}`),y=Lj(_);[...y].some(e=>v.has(e))?r.includes(_)?d+=40:r.split(` `).some(e=>/^\d{1,4}mm$/i.test(e))?d+=55:d+=l===``?40:50:y.size&&(d-=10);for(let e of n.filter(e=>/^\d{2,4}\s*mm$/.test(e))){let t=e.replace(/\s+/g,``);r.includes(t)?d+=60:i.includes(t)?d+=40:g.includes(t)&&(d+=25)}for(let t of Fj){let n=Nj(t);if(u.includes(n)&&(r.includes(n)||l.includes(n)||Nj(e.summary||``).includes(n))){d+=30;break}}let b=0,x=n.filter(e=>e.length>1&&!/^\d{2,4}\s*mm$/.test(e));for(let e of x)r.includes(e)?(d+=16,b++):i.includes(e)?d+=12:a.includes(e)?d+=8:o.includes(e)?d+=10:g.includes(e)&&(d+=3);b>=2?d+=35:b===1&&x.length>=2&&(d+=10);for(let e of x)o.includes(e)&&(d+=6);for(let e of Ij)u.includes(e)&&a.includes(e)&&(d+=50);return d}function Bj(e,t,n=24){let r=Pj(e);if(!r.length||!t?.size)return[];let i=[];for(let n of t.values()){let t=zj(n,String(e||``).trim(),r);t>0&&i.push({sku:n.sku,score:t,product:n})}return i.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),i.slice(0,n)}function Vj(e){let t=String(e?.image_id||``).trim();return t?`https://bep40-vai-avatar2-interior-api.hf.space/image/${encodeURIComponent(t)}.jpg`:``}function Hj(e){return String(e??``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}function Uj(e){let t=String(e?.image_id||``).trim();if(!t)return null;let n=Vj(e);if(!n)return null;let r=String(e.desc||e.alt||(e.post_titles||[])[0]||``).trim(),i=[].concat(e.categories||[],e.room_hints||[],e.labels||[]).map(e=>String(e||``).trim()).filter(Boolean),a=(e.keywords||[]).map(e=>String(e||``).trim()).filter(Boolean),o=Number(e.w),s=Number(e.h),c=Number.isFinite(o)&&Number.isFinite(s)&&o>0&&s>0?o/s:1;return{sku:`avatarimg:${t}`,avatarImageId:t,title:r,name:r,description:String(e.desc||``).trim(),categories:i,keywords:a,source:String(e.source||``).trim(),link:String((e.post_urls||[])[0]||``).trim(),ar:Math.max(.5,Math.min(2,c)),images:[n],src:n,addedAt:String(e.created_at||``).trim()}}async function Wj(e=24){try{let t=await fetch(`https://huggingface.co/datasets/bep40/vai-avatar2-interior/resolve/main/index.json`,{cache:`no-cache`});if(!t.ok)return[];let n=await t.json();if(!Array.isArray(n))return[];let r=n.filter(e=>e&&typeof e.created_at==`string`&&e.created_at).sort((e,t)=>e.created_att.created_at?-1:0).slice(0,120),i=[];for(let e of r){let t=Uj(e);t&&i.push(t)}return i.sort((e,t)=>e.addedAtt.addedAt?-1:0),i.slice(0,e)}catch{return[]}}function Gj(e,t,n=24){let r=Hj(String(e||``).trim());if(r.length<2||!t?.length)return[];let i=r.split(/\s+/).filter(e=>e.length>1),a=[];for(let e of t){let t=Hj([e.title,e.description,...e.categories||[],...e.keywords||[]].join(` `)),n=0;r.length>=3&&t.includes(r)&&(n+=900);let o=0;for(let e of i)t.includes(e)&&(n+=25,o++);o&&(n+=o*10,a.push({...e,score:n}))}return a.sort((e,t)=>t.score-e.score||(e.addedAtself.postMessage(e);function Xj(){return Kj??=(async()=>{Yj({status:`loading`,label:`Đang tải mô hình tìm kiếm`});let[e,t,n,r]=await Promise.all([W.from_pretrained(`sentence-transformers/clip-ViT-B-32-multilingual-v1`),ev.from_pretrained(`bep40/clip-vit-b32-multilingual-vi-text`,{dtype:`fp32`,device:`wasm`,revision:`9e1d53553228b17abfe6986fbe92e22bd6bd6bad`,progress_callback:e=>{e.status===`progress`&&e.file?.endsWith(`.onnx`)&&Yj({status:`loading`,label:`Đang tải mô hình tìm kiếm`,progress:e.progress})}}),VA(BA+`image-embeddings.json`).then(e=>JSON.parse(new TextDecoder().decode(e))),VA(BA+`image-embeddings_25k-512-32bit.bin`)]),i=new Float32Array(r);if(i.length!==n.length*512)throw Error(`The image database and embeddings do not match.`);return HA(i,512),Yj({status:`loading`,label:`Đang khởi động tìm kiếm`,progress:100}),await t(e(`a photograph`,{padding:!0,truncation:!0})),Yj({status:`ready`,count:n.length}),{tokenizer:e,model:t,metadata:n,embeddings:i}})().catch(e=>{throw Kj=null,e})}async function Zj(){if(!Jj){Jj=!0;try{let{tokenizer:e,model:t,metadata:n,embeddings:r}=await Xj();for(;qj;){let i=qj;qj=null;let a=performance.now();try{let{text_embeds:o}=await t(e(i.text,{padding:!0,truncation:!0}));if(qj)continue;let s=UA(o.data,r,512,96).map(({index:e,score:t})=>({...n[e],score:t}));Yj({status:`complete`,id:i.id,text:i.text,output:s,elapsed:performance.now()-a})}catch(e){Yj({status:`error`,id:i.id,message:e.message})}}}catch(e){Yj({status:`error`,id:qj?.id,message:e.message}),qj=null}finally{Jj=!1}}}let Qj=null;function $j(){return Qj??Ej().then(e=>(Qj=e,e))}async function eM(e=!1){let t=e?await Ej():await Dj();return t&&(Qj=t),t}let tM=null,nM=``;async function rM(){return tM||(tM=await Wj(24),nM=tM.map(e=>e.avatarImageId).join(`,`),tM)}async function iM(){let e=await Wj(24),t=e.map(e=>e.avatarImageId).join(`,`),n=t!==nM;tM=e,nM=t,Yj({status:`avatar-updated`,items:e,signature:t,changed:n,count:e.length})}async function aM(e,t,n){let r=performance.now();try{Yj({status:`products-loading`});let{items:i,signature:a}=await $j(),o=Bj(e,i,n),s=Mj(e,i,n),c=Gj(e,await rM());Yj({status:`products-complete`,id:t,text:e,output:o,legacy:s,interiors:c,signature:a,count:i.size,elapsed:performance.now()-r})}catch(e){Yj({status:`products-error`,id:t,message:e.message})}}self.addEventListener(`message`,({data:e})=>{e.type===`init`?(Xj().catch(e=>Yj({status:`error`,message:e.message})),$j().catch(()=>{}),iM().catch(()=>{})):e.type===`search`?(qj={id:e.id,text:e.text},Zj()):e.type===`search-products`?aM(e.text,e.id,e.limit??24):e.type===`refresh-catalogue`?(eM(e.force===!0).then(e=>e&&Yj({status:`catalogue-updated`,signature:e.signature,count:e.items.size,syncedAt:e.syncedAt})).catch(e=>Yj({status:`catalogue-error`,message:e.message})),iM().catch(()=>{})):e.type===`clear`&&(qj=null)}); \ No newline at end of file diff --git a/dist/assets/worker-hGPAZ_gn.js b/dist/assets/worker-hGPAZ_gn.js deleted file mode 100644 index 631ceaf1c0e0eae90c3bf406fcef8270f375b219..0000000000000000000000000000000000000000 --- a/dist/assets/worker-hGPAZ_gn.js +++ /dev/null @@ -1,45 +0,0 @@ -var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n=/* @__PURE__ */ (e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")}),r=/* @__PURE__ */ t({InferenceSession:()=>Me,TRACE:()=>Ce,TRACE_EVENT_BEGIN:()=>De,TRACE_EVENT_END:()=>Oe,TRACE_FUNC_BEGIN:()=>Te,TRACE_FUNC_END:()=>Ee,Tensor:()=>xe,default:()=>rr,env:()=>w,registerBackend:()=>h}),i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,c=(e=>typeof n<`u`?n:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof n<`u`?n:e)[t]}):e)(function(e){ -/*! -* ONNX Runtime Web v1.31.0-dev.20260914-8d85527a0 -* Copyright (c) Microsoft Corporation. All rights reserved. -* Licensed under the MIT License. -*/ -if(typeof n<`u`)return n.apply(this,arguments);throw Error(`Dynamic require of "`+e+`" is not supported`)}),l=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},u=(e,t)=>{for(var n in t)i(e,n,{get:t[n],enumerable:!0})},d=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(let c of o(t))!s.call(e,c)&&c!==n&&i(e,c,{get:()=>t[c],enumerable:!(r=a(t,c))||r.enumerable});return e},f=e=>d(i({},`__esModule`,{value:!0}),e),p,m,h,g,_,v=l(()=>{p=/* @__PURE__ */ new Map,m=[],h=(e,t,n)=>{if(t&&typeof t.init==`function`&&typeof t.createInferenceSessionHandler==`function`){let r=p.get(e);if(r===void 0)p.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let t=m.indexOf(e);t!==-1&&m.splice(t,1);for(let t=0;t{let t=p.get(e);if(!t)return`backend not found.`;if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(e){return n||(t.error=`${e}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},_=async e=>{let t=e.executionProviders||[],n=t.map(e=>typeof e==`string`?e:e.name),r=n.length===0?m:n,i,a=[],o=/* @__PURE__ */ new Set;for(let e of r){let t=await g(e);typeof t==`string`?a.push({name:e,err:t}):(i||=t,i===t&&o.add(e))}if(!i)throw Error(`no available backend found. ERR: ${a.map(e=>`[${e.name}] ${e.err}`).join(`, `)}`);for(let{name:e,err:t}of a)n.includes(e)&&console.warn(`removing requested execution provider "${e}" from session options because it is not available: ${t}`);let s=t.filter(e=>o.has(typeof e==`string`?e:e.name));return[i,new Proxy(e,{get:(e,t)=>t===`executionProviders`?s:Reflect.get(e,t)})]}}),y=l(()=>{v()}),b,x=l(()=>{b=`1.31.0-dev.20260911-2a43ec07e`}),S,C,ee=l(()=>{x(),S=`warning`,C={wasm:{},webgl:{},webgpu:{},versions:{common:b},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);S=e}},get logLevel(){return S}},Object.defineProperty(C,"logLevel",{enumerable:!0})}),w,te=l(()=>{ee(),w=C}),ne,re,ie=l(()=>{ne=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t!==void 0&&t.format!==void 0?t.format:`RGB`,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t{be(),ae=(e,t)=>{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:`RGB`,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,ae(o,s)}throw Error(`Can not access image data`)}else{if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(ae(e.data,s))}});throw Error(`Input data provided is not supported - aborted tensor creation`)}if(o!==void 0)return ae(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},se=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new ye({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ce=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new ye({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},le=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new ye({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},ue=(e,t,n)=>new ye({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]})}),de,fe,pe,me,he=l(()=>{de=/* @__PURE__ */ new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),fe=/* @__PURE__ */ new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]),pe=!1,me=()=>{if(!pe){pe=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<`u`&&n.from;e&&(de.set(`int64`,BigInt64Array),fe.set(BigInt64Array,`int64`)),t&&(de.set(`uint64`,BigUint64Array),fe.set(BigUint64Array,`uint64`)),r?(de.set(`float16`,n),fe.set(n,`float16`)):de.set(`float16`,Uint16Array)}}}),ge,_e,ve=l(()=>{be(),ge=e=>{let t=1;for(let n=0;n{switch(e.location){case`cpu`:return new ye(e.type,e.data,t);case`cpu-pinned`:return new ye({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new ye({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new ye({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new ye({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}}}),ye,be=l(()=>{ie(),T(),he(),ve(),ye=class{constructor(e,t,n){me();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=de.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`){if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=de.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray){if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`)}else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=fe.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=ge(i);if(this.cpuData&&a!==this.cpuData.length&&(r!==`uint4`&&r!==`int4`||Math.ceil(a/2)!==this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return oe(e,t)}static fromTexture(e,t){return se(e,t)}static fromGpuBuffer(e,t){return ce(e,t)}static fromMLTensor(e,t){return le(e,t)}static fromPinnedBuffer(e,t,n){return ue(e,t,n)}toDataURL(e){return ne(this,e)}toImageData(e){return re(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return _e(this,e)}}}),xe,Se=l(()=>{be(),xe=ye}),Ce,we,Te,Ee,De,Oe,ke=l(()=>{ee(),Ce=(e,t)=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.timeStamp(`${e}::ORT::${t}`)},we=(e,t)=>{let n=(/* @__PURE__ */ Error()).stack?.split(/\r\n|\r|\n/g)||[],r=!1;for(let i=0;i{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||we(`BEGIN`,e)},Ee=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||we(`END`,e)},De=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.time(`ORT::${e}`)},Oe=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.timeEnd(`ORT::${e}`)}}),Ae,je=l(()=>{v(),Se(),ke(),Ae=class e{constructor(e){this.handler=e}async run(e,t,n){Te(),De(`InferenceSession.run`);let r={},i={};if(typeof e!=`object`||!e||e instanceof xe||Array.isArray(e))throw TypeError(`'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.`);let a=!0;if(typeof t==`object`){if(t===null)throw TypeError(`Unexpected argument[1]: cannot be null.`);if(t instanceof xe)throw TypeError(`'fetches' cannot be a Tensor`);if(Array.isArray(t)){if(t.length===0)throw TypeError(`'fetches' cannot be an empty array.`);a=!1;for(let e of t){if(typeof e!=`string`)throw TypeError(`'fetches' must be a string array or an object.`);if(this.outputNames.indexOf(e)===-1)throw RangeError(`'fetches' contains invalid output name: ${e}.`);r[e]=null}if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else{let e=!1,o=Object.getOwnPropertyNames(t);for(let n of this.outputNames)if(o.indexOf(n)!==-1){let i=t[n];(i===null||i instanceof xe)&&(e=!0,a=!1,r[n]=i)}if(e){if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else i=t}}else if(typeof t<`u`)throw TypeError(`Unexpected argument[1]: must be 'fetches' or 'options'.`);for(let t of this.inputNames)if(typeof e[t]>`u`)throw Error(`input '${t}' is missing in 'feeds'.`);if(a)for(let e of this.outputNames)r[e]=null;let o=await this.handler.run(e,r,i),s={};for(let e in o)if(Object.hasOwnProperty.call(o,e)){let t=o[e];s[e]=t instanceof xe?t:new xe(t.type,t.data,t.dims)}return Oe(`InferenceSession.run`),Ee(),s}async release(){return this.handler.dispose()}static async create(t,n,r,i){Te(),De(`InferenceSession.create`);let a,o={};if(typeof t==`string`){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof Uint8Array){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&t instanceof SharedArrayBuffer){let e=t,s=0,c=t.byteLength;if(typeof n==`object`&&n)o=n;else if(typeof n==`number`){if(s=n,!Number.isSafeInteger(s))throw RangeError(`'byteOffset' must be an integer.`);if(s<0||s>=e.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${e.byteLength}).`);if(c=t.byteLength-s,typeof r==`number`){if(c=r,!Number.isSafeInteger(c))throw RangeError(`'byteLength' must be an integer.`);if(c<=0||s+c>e.byteLength)throw RangeError(`'byteLength' is out of range (0, ${e.byteLength-s}].`);if(typeof i==`object`&&i)o=i;else if(typeof i<`u`)throw TypeError(`'options' must be an object.`)}else if(typeof r<`u`)throw TypeError(`'byteLength' must be a number.`)}else if(typeof n<`u`)throw TypeError(`'options' must be an object.`);a=new Uint8Array(e,s,c)}else throw TypeError(`Unexpected argument[0]: must be 'path' or 'buffer'.`);let[s,c]=await _(o),l=await s.createInferenceSessionHandler(a,c);return Oe(`InferenceSession.create`),Ee(),new e(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),Me,Ne=l(()=>{je(),Me=Ae}),Pe=l(()=>{}),Fe=l(()=>{}),Ie=l(()=>{}),Le=l(()=>{}),Re={};u(Re,{InferenceSession:()=>Me,TRACE:()=>Ce,TRACE_EVENT_BEGIN:()=>De,TRACE_EVENT_END:()=>Oe,TRACE_FUNC_BEGIN:()=>Te,TRACE_FUNC_END:()=>Ee,Tensor:()=>xe,env:()=>w,registerBackend:()=>h});var ze=l(()=>{y(),te(),Ne(),Se(),Pe(),Fe(),ke(),Ie(),Le()}),Be=l(()=>{}),Ve={};u(Ve,{default:()=>We});var He,Ue,We,Ge=l(()=>{Dn(),ht(),ot(),He=`ort-wasm-proxy-worker`,Ue=globalThis.self?.name===He,Ue&&(self.onmessage=e=>{let{type:t,in:n}=e.data;try{switch(t){case`init-wasm`:mt(n.wasm).then(()=>{hn(n).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})})},e=>{postMessage({type:t,err:e})});break;case`init-ep`:{let{epName:e,env:r}=n;gn(r,e).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})});break}case`copy-from`:{let{buffer:e}=n,r=bn(e);postMessage({type:t,out:r});break}case`create`:{let{model:e,options:r}=n;xn(e,r).then(e=>{postMessage({type:t,out:e})},e=>{postMessage({type:t,err:e})});break}case`release`:Sn(n),postMessage({type:t});break;case`run`:{let{sessionId:e,inputIndices:r,inputs:i,outputIndices:a,options:o}=n;wn(e,r,i,a,Array(a.length).fill(null),o).then(e=>{e.some(e=>e[3]!==`cpu`)?postMessage({type:t,err:`Proxy does not support non-cpu tensor location.`}):postMessage({type:t,out:e},En([...i,...e]))},e=>{postMessage({type:t,err:e})});break}case`end-profiling`:Tn(n),postMessage({type:t})}}catch(e){postMessage({type:t,err:e})}}),We=Ue?null:e=>new Worker(e??Ye,{type:`module`,name:He})}),Ke,qe,Je,Ye,Xe,Ze,Qe,$e,et,tt,nt,rt,it,at,ot=l(()=>{Be(),Ke=typeof location>`u`?void 0:location.origin,qe=import.meta.url>`file:`&&import.meta.url<`file;`,Je=()=>qe?new URL(new URL(`ort.webgpu.min.mjs`,import.meta.url).href,Ke).href:import.meta.url,Ye=Je(),Xe=()=>{if(Ye&&!Ye.startsWith(`blob:`))return Ye.substring(0,Ye.lastIndexOf(`/`)+1)},Ze=(e,t)=>{try{let n=t??Ye;return(n?new URL(e,n):new URL(e)).origin===Ke}catch{return!1}},Qe=(e,t)=>{let n=t??Ye;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},$e=(e,t)=>`${t??`./`}${e}`,et=async e=>{let t=await(await fetch(e,{credentials:`same-origin`})).blob();return URL.createObjectURL(t)},tt=async e=>(await import( -/*webpackIgnore:true*/ -/*@vite-ignore*/ -e)).default,nt=(Ge(),f(Ve)).default,rt=async()=>{if(!Ye)throw Error(`Failed to load proxy worker: cannot determine the script source URL.`);if(Ze(Ye))return[void 0,nt()];let e=await et(Ye);return[e,nt(e)]},it=void 0,at=async(e,t,n,r)=>{let i=it&&!(e||t);if(i){if(Ye)i=Ze(Ye)||r&&!n;else if(r&&!n)i=!0;else throw Error(`cannot determine the script source URL.`)}if(i)return[void 0,it];{let r=`ort-wasm-simd-threaded.asyncify.mjs`,i=e??Qe(r,t),a=n&&i&&!Ze(i,t),o=a?await et(i):i??$e(r,t);return[a?o:void 0,await tt(o)]}}}),st,ct,lt,ut,dt,ft,pt,mt,E,ht=l(()=>{ot(),ct=!1,lt=!1,ut=!1,dt=()=>{if(typeof SharedArrayBuffer>`u`)return!1;try{return typeof MessageChannel<`u`&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},ft=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},pt=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},mt=async e=>{if(ct)return Promise.resolve();if(lt)throw Error(`multiple calls to 'initializeWebAssembly()' detected.`);if(ut)throw Error(`previous call to 'initializeWebAssembly()' failed.`);lt=!0;let t=e.initTimeout,n=e.numThreads;if(e.simd!==!1){if(e.simd===`relaxed`){if(!pt())throw Error(`Relaxed WebAssembly SIMD is not supported in the current environment.`)}else if(!ft())throw Error(`WebAssembly SIMD is not supported in the current environment.`)}let r=dt();n>1&&!r&&(typeof self<`u`&&!self.crossOriginIsolated&&console.warn(`env.wasm.numThreads is set to `+n+`, but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info.`),console.warn(`WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading.`),e.numThreads=n=1);let i=e.wasmPaths,a=typeof i==`string`?i:void 0,o=i?.mjs,s=o?.href??o,c=i?.wasm,l=c?.href??c,u=e.wasmBinary,[d,f]=await at(s,a,n>1,!!u||!!l),p=!1,m=[];if(t>0&&m.push(new Promise(e=>{setTimeout(()=>{p=!0,e()},t)})),m.push(new Promise((e,t)=>{let r={numThreads:n};if(u)r.wasmBinary=u,r.locateFile=e=>e;else if(l||a)r.locateFile=e=>l??a+e;else if(s&&s.indexOf(`blob:`)!==0)r.locateFile=e=>new URL(e,s).href;else if(d){let e=Xe();e&&(r.locateFile=t=>e+t)}f(r).then(t=>{lt=!1,ct=!0,st=t,e(),d&&URL.revokeObjectURL(d)},e=>{lt=!1,ut=!0,t(e)})})),await Promise.race(m),p)throw Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},E=()=>{if(ct&&st)return st;throw Error(`WebAssembly is not initialized yet.`)}}),gt,_t,D,vt=l(()=>{ht(),gt=(e,t)=>{let n=E(),r=n.lengthBytesUTF8(e)+1,i=n._malloc(r);return n.stringToUTF8(e,i,r),t.push(i),i},_t=(e,t,n,r)=>{if(typeof e==`object`&&e){if(n.has(e))throw Error(`Circular reference in options`);n.add(e)}Object.entries(e).forEach(([e,i])=>{let a=t?t+e:e;if(typeof i==`object`)_t(i,a+`.`,n,r);else if(typeof i==`string`||typeof i==`number`)r(a,i.toString());else if(typeof i==`boolean`)r(a,i?`1`:`0`);else throw Error(`Can't handle extra config type: ${typeof i}`)})},D=e=>{let t=E(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetLastError(r,r+n);let i=Number(t.getValue(r,n===4?`i32`:`i64`)),a=t.getValue(r+n,`*`),o=a?t.UTF8ToString(a):``;throw Error(`${e} ERROR_CODE: ${i}, ERROR_MESSAGE: ${o}`)}finally{t.stackRestore(n)}}}),yt,bt=l(()=>{ht(),vt(),yt=e=>{let t=E(),n=0,r=[],i=e||{};try{if(e?.logSeverityLevel===void 0)i.logSeverityLevel=2;else if(typeof e.logSeverityLevel!=`number`||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw Error(`log severity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)i.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!=`number`||!Number.isInteger(e.logVerbosityLevel))throw Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(i.terminate=!1);let a=0;return e?.tag!==void 0&&(a=gt(e.tag,r)),n=t._OrtCreateRunOptions(i.logSeverityLevel,i.logVerbosityLevel,!!i.terminate,a),n===0&&D(`Can't create run options.`),e?.extra!==void 0&&_t(e.extra,``,/* @__PURE__ */ new WeakSet,(e,i)=>{let a=gt(e,r),o=gt(i,r);t._OrtAddRunConfigEntry(n,a,o)!==0&&D(`Can't set a run config entry: ${e} - ${i}.`)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(e=>t._free(e)),e}}}),xt,St,Ct,wt,Tt,Et,Dt,Ot=l(()=>{ht(),vt(),xt=e=>{switch(e){case`disabled`:return 0;case`basic`:return 1;case`extended`:return 2;case`layout`:return 3;case`all`:return 99;default:throw Error(`unsupported graph optimization level: ${e}`)}},St=e=>{switch(e){case`sequential`:return 0;case`parallel`:return 1;default:throw Error(`unsupported execution mode: ${e}`)}},Ct=e=>{e.extra||={},e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||=`1`,e.executionProviders&&e.executionProviders.some(e=>(typeof e==`string`?e:e.name)===`webgpu`)&&(e.enableMemPattern=!1)},wt=(e,t,n,r)=>{let i=gt(t,r),a=gt(n,r);E()._OrtAddSessionConfigEntry(e,i,a)!==0&&D(`Can't set a session config entry: ${t} - ${n}.`)},Tt=(e,t,n,r)=>{let i=gt(t,r),a=gt(n,r);e.push([i,a])},Et=async(e,t,n)=>{let r=t.executionProviders;for(let i of r){let r=typeof i==`string`?i:i.name,a=[];switch(r){case`webnn`:if(r=`WEBNN`,wt(e,`session.disable_quant_qdq`,`1`,n),wt(e,`session.disable_qdq_constant_folding`,`1`,n),typeof i!=`string`){let t=i?.deviceType;t&&wt(e,`deviceType`,t,n)}break;case`webgpu`:{r=`WebGPU`;let e;if(typeof i!=`string`){let r=i;if(r.device){if(typeof GPUDevice<`u`&&r.device instanceof GPUDevice)e=r.device;else throw Error(`Invalid GPU device set in WebGPU EP options.`)}let{enableGraphCapture:o}=t;if(typeof o==`boolean`&&o&&Tt(a,`enableGraphCapture`,`1`,n),typeof r.preferredLayout==`string`&&Tt(a,`preferredLayout`,r.preferredLayout,n),r.forceCpuNodeNames){let e=Array.isArray(r.forceCpuNodeNames)?r.forceCpuNodeNames:[r.forceCpuNodeNames];Tt(a,`forceCpuNodeNames`,e.join(` -`),n)}r.validationMode&&Tt(a,`validationMode`,r.validationMode,n),typeof r.enableMatmulFp32Accumulation==`boolean`&&Tt(a,`enableMatmulFp32Accumulation`,r.enableMatmulFp32Accumulation?`1`:`0`,n);for(let e of[`storageBufferCacheMode`,`uniformBufferCacheMode`,`queryResolveBufferCacheMode`,`defaultBufferCacheMode`]){let t=r[e];if(t){if(t!==`disabled`&&t!==`lazyRelease`&&t!==`simple`&&t!==`bucket`)throw Error(`${e} must be one of 'disabled', 'lazyRelease', 'simple' or 'bucket': ${t}`);Tt(a,e,t,n)}}}let o=E().webgpuRegisterDevice(e);if(o){let[e,t,r]=o;Tt(a,`deviceId`,e.toString(),n),Tt(a,`webgpuInstance`,t.toString(),n),Tt(a,`webgpuDevice`,r.toString(),n)}}break;case`wasm`:case`cpu`:continue;default:throw Error(`not supported execution provider: ${r}`)}let o=gt(r,n),s=a.length,c=0,l=0;if(s>0){c=E()._malloc(s*E().PTR_SIZE),n.push(c),l=E()._malloc(s*E().PTR_SIZE),n.push(l);for(let e=0;e{let t=E(),n=0,r=[],i=e||{};Ct(i);try{let e=xt(i.graphOptimizationLevel??`all`),a=St(i.executionMode??`sequential`),o=typeof i.logId==`string`?gt(i.logId,r):0,s=i.logSeverityLevel??2;if(!Number.isInteger(s)||s<0||s>4)throw Error(`log severity level is not valid: ${s}`);let c=i.logVerbosityLevel??0;if(!Number.isInteger(c)||c<0||c>4)throw Error(`log verbosity level is not valid: ${c}`);let l=typeof i.optimizedModelFilePath==`string`?gt(i.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(e,!!i.enableCpuMemArena,!!i.enableMemPattern,a,!!i.enableProfiling,0,o,s,c,l),n===0&&D(`Can't create session options.`),i.executionProviders&&await Et(n,i,r),i.enableGraphCapture!==void 0){if(typeof i.enableGraphCapture!=`boolean`)throw Error(`enableGraphCapture must be a boolean value: ${i.enableGraphCapture}`);wt(n,`enableGraphCapture`,i.enableGraphCapture.toString(),r)}if(i.freeDimensionOverrides)for(let[e,a]of Object.entries(i.freeDimensionOverrides)){if(typeof e!=`string`)throw Error(`free dimension override name must be a string: ${e}`);if(typeof a!=`number`||!Number.isInteger(a)||a<0)throw Error(`free dimension override value must be a non-negative integer: ${a}`);let i=gt(e,r);t._OrtAddFreeDimensionOverride(n,i,a)!==0&&D(`Can't set a free dimension override: ${e} - ${a}.`)}return i.extra!==void 0&&_t(i.extra,``,/* @__PURE__ */ new WeakSet,(e,t)=>{wt(n,e,t,r)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&D(`Can't release session options.`),r.forEach(e=>t._free(e)),e}}}),kt,At,jt,Mt,Nt,Pt,Ft,It,Lt=l(()=>{kt=e=>{switch(e){case`int8`:return 3;case`uint8`:return 2;case`bool`:return 9;case`int16`:return 5;case`uint16`:return 4;case`int32`:return 6;case`uint32`:return 12;case`float16`:return 10;case`float32`:return 1;case`float64`:return 11;case`string`:return 8;case`int64`:return 7;case`uint64`:return 13;case`int4`:return 22;case`uint4`:return 21;default:throw Error(`unsupported data type: ${e}`)}},At=e=>{switch(e){case 3:return`int8`;case 2:return`uint8`;case 9:return`bool`;case 5:return`int16`;case 4:return`uint16`;case 6:return`int32`;case 12:return`uint32`;case 10:return`float16`;case 1:return`float32`;case 11:return`float64`;case 8:return`string`;case 7:return`int64`;case 13:return`uint64`;case 22:return`int4`;case 21:return`uint4`;default:throw Error(`unsupported data type: ${e}`)}},jt=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t==`number`?t:t.reduce((e,t)=>e*t,1);return n>0?Math.ceil(r*n):void 0},Mt=e=>{switch(e){case`float16`:return typeof Float16Array<`u`?Float16Array:Uint16Array;case`float32`:return Float32Array;case`uint8`:return Uint8Array;case`int8`:return Int8Array;case`uint16`:return Uint16Array;case`int16`:return Int16Array;case`int32`:return Int32Array;case`bool`:return Uint8Array;case`float64`:return Float64Array;case`uint32`:return Uint32Array;case`int64`:return BigInt64Array;case`uint64`:return BigUint64Array;default:throw Error(`unsupported type: ${e}`)}},Nt=e=>{switch(e){case`verbose`:return 0;case`info`:return 1;case`warning`:return 2;case`error`:return 3;case`fatal`:return 4;default:throw Error(`unsupported logging level: ${e}`)}},Pt=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,Ft=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint64`||e===`int8`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,It=e=>{switch(e){case`none`:return 0;case`cpu`:return 1;case`cpu-pinned`:return 2;case`texture`:return 3;case`gpu-buffer`:return 4;case`ml-tensor`:return 5;default:throw Error(`unsupported data location: ${e}`)}}}),Rt,zt=l(()=>{Be(),Rt=async e=>{if(typeof e==`string`){let t=await fetch(e);if(!t.ok)throw Error(`failed to load external data file: ${e}`);let n=t.headers.get(`Content-Length`),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw Error(`failed to load external data file: ${e}, no response body.`);let n=t.body.getReader(),i;try{i=new ArrayBuffer(r)}catch(e){if(e instanceof RangeError){let e=Math.ceil(r/65536);i=new WebAssembly.Memory({initial:e,maximum:e}).buffer}else throw e}let a=0;for(;;){let{done:e,value:t}=await n.read();if(e)break;let r=t.byteLength;new Uint8Array(i,a,r).set(t),a+=r}return new Uint8Array(i,0,r)}}return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}}),Bt,Vt=l(()=>{Lt(),Bt=(e,t)=>new(Mt(t))(e)}),Ht,Ut,Wt,Gt,Kt,qt,Jt,Yt=l(()=>{Lt(),Ht=[`V`,`I`,`W`,`E`,`F`],Ut=(e,t)=>{console.log(`[${Ht[e]},${(/* @__PURE__ */ new Date()).toISOString()}]${t}`)},Kt=(e,t)=>{Wt=e,Gt=t},qt=(e,t)=>{let n=Nt(e);n>=Nt(Wt)&&Ut(n,typeof t==`function`?t():t)},Jt=(...e)=>{Gt&&qt(...e)}}),Xt,Zt,Qt,$t,en,tn,nn,rn,an,on,sn,cn=l(()=>{Lt(),Yt(),Xt=/* @__PURE__ */ new Map([[`float32`,32],[`float16`,16],[`int32`,32],[`uint32`,32],[`int64`,64],[`uint64`,64],[`int8`,8],[`uint8`,8],[`int4`,4],[`uint4`,4]]),Zt=(e,t)=>{if(t===`int32`)return e;let n=Xt.get(t);if(!n)throw Error(`WebNN backend does not support data type: ${t}`);let r=n/8;if(e.byteLength%r!==0)throw Error(`Invalid Uint8Array length - must be a multiple of ${r}.`);let i=e.byteLength/r,a=new(Mt(t))(e.buffer,e.byteOffset,i);switch(t){case`int64`:case`uint64`:{let e=new Int32Array(i);for(let t=0;t2147483647n||n<-2147483648n)throw Error(`Can not convert int64 data to int32 - value out of range.`);e[t]=Number(n)}return new Uint8Array(e.buffer)}case`int8`:case`uint8`:case`uint32`:{if(t===`uint32`&&a.some(e=>e>2147483647))throw Error(`Can not convert uint32 data to int32 - value out of range.`);let e=Int32Array.from(a,Number);return new Uint8Array(e.buffer)}default:throw Error(`Unsupported data conversion from ${t} to 'int32'`)}},Qt=(e,t)=>{if(t===`int32`)return e;if(e.byteLength%4!=0)throw Error(`Invalid Uint8Array length - must be a multiple of 4 (int32).`);let n=e.byteLength/4,r=new Int32Array(e.buffer,e.byteOffset,n);switch(t){case`int64`:{let e=BigInt64Array.from(r,BigInt);return new Uint8Array(e.buffer)}case`uint64`:{if(r.some(e=>e<0))throw Error(`Can not convert int32 data to uin64 - negative value found.`);let e=BigUint64Array.from(r,BigInt);return new Uint8Array(e.buffer)}case`int8`:{if(r.some(e=>e<-128||e>127))throw Error(`Can not convert int32 data to int8 - value out of range.`);let e=Int8Array.from(r,Number);return new Uint8Array(e.buffer)}case`uint8`:if(r.some(e=>e<0||e>255))throw Error(`Can not convert int32 data to uint8 - value out of range.`);return Uint8Array.from(r,Number);case`uint32`:{if(r.some(e=>e<0))throw Error(`Can not convert int32 data to uint32 - negative value found.`);let e=Uint32Array.from(r,Number);return new Uint8Array(e.buffer)}default:throw Error(`Unsupported data conversion from 'int32' to ${t}`)}},$t=1,en=()=>$t++,tn=/* @__PURE__ */ new Map([[`int8`,`int32`],[`uint8`,`int32`],[`uint32`,`int32`],[`int64`,`int32`]]),nn=(e,t)=>{let n=Xt.get(e);if(!n)throw Error(`WebNN backend does not support data type: ${e}`);return t.length>0?Math.ceil(t.reduce((e,t)=>e*t)*n/8):0},rn=class{constructor(e){this.isDataConverted=!1;let{sessionId:t,context:n,tensor:r,dataType:i,shape:a,fallbackDataType:o}=e;this.sessionId=t,this.mlContext=n,this.mlTensor=r,this.dataType=i,this.tensorShape=a,this.fallbackDataType=o}get tensor(){return this.mlTensor}get type(){return this.dataType}get fallbackType(){return this.fallbackDataType}get shape(){return this.tensorShape}get byteLength(){return nn(this.dataType,this.tensorShape)}destroy(){Jt(`verbose`,()=>`[WebNN] TensorWrapper.destroy`),this.mlTensor.destroy()}write(e){this.mlContext.writeTensor(this.mlTensor,e)}async read(e){if(this.fallbackDataType){let t=await this.mlContext.readTensor(this.mlTensor),n=Qt(new Uint8Array(t),this.dataType);if(e){(e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)).set(n);return}return new Uint8Array(n).buffer}return e?this.mlContext.readTensor(this.mlTensor,e):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(e,t,n){return this.mlContext===e&&this.dataType===t&&this.tensorShape.length===n.length&&this.tensorShape.every((e,t)=>e===n[t])}setIsDataConverted(e){this.isDataConverted=e}},an=class{constructor(e,t){this.tensorManager=e,this.wrapper=t}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(e,t,n,r){let i=this.tensorManager.getMLContext(e),a=this.tensorManager.getMLOpSupportLimits(e),o;if(!a?.input.dataTypes.includes(t)){if(o=tn.get(t),!o||!a?.input.dataTypes.includes(o))throw Error(`WebNN backend does not support data type: ${t}`);Jt(`verbose`,()=>`[WebNN] TensorIdTracker.ensureTensor: fallback dataType from ${t} to ${o}`)}if(this.wrapper){if(this.wrapper.canReuseTensor(i,t,n))return this.wrapper.tensor;if(r){if(this.wrapper.byteLength!==nn(t,n))throw Error(`Unable to copy data to tensor with different size.`);this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let s=typeof MLTensorUsage>`u`?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(e,t,n,s,!0,!0,o),r&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(e){let t=e;if(this.wrapper){if(this.wrapper.fallbackType){if(this.wrapper.fallbackType===`int32`)t=Zt(e,this.wrapper.type),this.wrapper.setIsDataConverted(!0);else throw Error(`Unsupported fallback data type: ${this.wrapper.fallbackType}`)}if(e.byteLength===this.wrapper.byteLength){this.wrapper.write(t);return}Jt(`verbose`,()=>`Data size does not match tensor size. Releasing tensor.`),this.releaseTensor()}this.activeUpload?this.activeUpload.set(t):this.activeUpload=new Uint8Array(t)}async download(e){if(this.activeUpload){let t=this.wrapper?.isDataConverted?Qt(this.activeUpload,this.wrapper?.type):this.activeUpload;if(e){e instanceof ArrayBuffer?new Uint8Array(e).set(t):new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(t);return}return t.buffer}if(!this.wrapper)throw Error(`Tensor has not been created.`);return e?this.wrapper.read(e):this.wrapper.read()}},on=class{constructor(e){this.backend=e,this.tensorTrackersById=/* @__PURE__ */ new Map,this.freeTensors=[],this.externalTensors=/* @__PURE__ */ new Set}getMLContext(e){let t=this.backend.getMLContext(e);if(!t)throw Error(`MLContext not found for session.`);return t}getMLOpSupportLimits(e){return this.backend.getMLOpSupportLimits(e)}reserveTensorId(){let e=en();return this.tensorTrackersById.set(e,new an(this)),e}releaseTensorId(e){let t=this.tensorTrackersById.get(e);t&&(this.tensorTrackersById.delete(e),t.tensorWrapper&&this.releaseTensor(t.tensorWrapper))}async ensureTensor(e,t,n,r,i){Jt(`verbose`,()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${t}, dataType: ${n}, shape: ${r}, copyOld: ${i}}`);let a=this.tensorTrackersById.get(t);if(!a)throw Error(`Tensor not found.`);return a.ensureTensor(e,n,r,i)}upload(e,t){let n=this.tensorTrackersById.get(e);if(!n)throw Error(`Tensor not found.`);n.upload(t)}async download(e,t){Jt(`verbose`,()=>`[WebNN] TensorManager.download {tensorId: ${e}, dstBuffer: ${t?.byteLength}}`);let n=this.tensorTrackersById.get(e);if(!n)throw Error(`Tensor not found.`);return n.download(t)}releaseTensorsForSession(e){for(let t of this.freeTensors)t.sessionId===e&&t.destroy();this.freeTensors=this.freeTensors.filter(t=>t.sessionId!==e)}registerTensor(e,t,n,r){let i=this.getMLContext(e),a=en(),o=new rn({sessionId:e,context:i,tensor:t,dataType:n,shape:r});return this.tensorTrackersById.set(a,new an(this,o)),this.externalTensors.add(o),a}async getCachedTensor(e,t,n,r,i,a,o){let s=this.getMLContext(e);for(let[r,i]of this.freeTensors.entries())if(i.canReuseTensor(s,t,n)){Jt(`verbose`,()=>`[WebNN] Reusing tensor {dataType: ${t}, ${o?`fallbackDataType: ${o},`:``} shape: ${n}`);let i=this.freeTensors.splice(r,1)[0];return i.sessionId=e,i}Jt(`verbose`,()=>`[WebNN] MLContext.createTensor {dataType: ${t}, ${o?`fallbackDataType: ${o},`:``} shape: ${n}}`);let c=await s.createTensor({dataType:o??t,shape:n,dimensions:n,usage:r,writable:i,readable:a});return new rn({sessionId:e,context:s,tensor:c,dataType:t,shape:n,fallbackDataType:o})}releaseTensor(e){this.externalTensors.has(e)&&this.externalTensors.delete(e),this.freeTensors.push(e)}},sn=(...e)=>new on(...e)}),ln={};u(ln,{WebNNBackend:()=>fn});var un,dn,fn,pn=l(()=>{Lt(),ht(),Vt(),cn(),Yt(),un=/* @__PURE__ */ new Map([[1,`float32`],[10,`float16`],[6,`int32`],[12,`uint32`],[7,`int64`],[13,`uint64`],[22,`int4`],[21,`uint4`],[3,`int8`],[2,`uint8`],[9,`uint8`]]),dn=(e,t)=>{if(e===t)return!0;if(e===void 0||t===void 0)return!1;let n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((n,i)=>n===r[i]&&e[n]===t[n])},fn=class{constructor(e){this.tensorManager=sn(this),this.mlContextBySessionId=/* @__PURE__ */ new Map,this.sessionIdsByMLContext=/* @__PURE__ */ new Map,this.mlContextCache=[],this.sessionGraphInputs=/* @__PURE__ */ new Map,this.sessionGraphOutputs=/* @__PURE__ */ new Map,this.temporaryGraphInputs=[],this.temporaryGraphOutputs=[],this.temporarySessionTensorIds=/* @__PURE__ */ new Map,this.mlOpSupportLimitsBySessionId=/* @__PURE__ */ new Map,Kt(e.logLevel,!!e.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw Error(`No active session`);return this.activeSessionId}onRunStart(e){Jt(`verbose`,()=>`[WebNN] onRunStart {sessionId: ${e}}`),this.activeSessionId=e}onRunEnd(e){Jt(`verbose`,()=>`[WebNN] onRunEnd {sessionId: ${e}}`);let t=this.temporarySessionTensorIds.get(e);if(t){for(let e of t)Jt(`verbose`,()=>`[WebNN] releasing temporary tensor {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e);this.temporarySessionTensorIds.delete(e),this.activeSessionId=void 0}}async createMLContext(e){if(e instanceof GPUDevice){let t=this.mlContextCache.findIndex(t=>t.gpuDevice===e);if(t!==-1)return this.mlContextCache[t].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({gpuDevice:e,mlContext:t}),t}}if(e===void 0){let e=this.mlContextCache.findIndex(e=>e.options===void 0&&e.gpuDevice===void 0);if(e!==-1)return this.mlContextCache[e].mlContext;{let e=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:e}),e}}let t=this.mlContextCache.findIndex(t=>dn(t.options,e));if(t!==-1)return this.mlContextCache[t].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({options:e,mlContext:t}),t}}registerMLContext(e,t){this.mlContextBySessionId.set(e,t);let n=this.sessionIdsByMLContext.get(t);n||(n=/* @__PURE__ */ new Set,this.sessionIdsByMLContext.set(t,n)),n.add(e),this.mlOpSupportLimitsBySessionId.has(e)||this.mlOpSupportLimitsBySessionId.set(e,t.opSupportLimits()),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(e,this.temporaryGraphInputs),this.temporaryGraphInputs=[]),this.temporaryGraphOutputs.length>0&&(this.sessionGraphOutputs.set(e,this.temporaryGraphOutputs),this.temporaryGraphOutputs=[])}onReleaseSession(e){this.sessionGraphInputs.delete(e),this.sessionGraphOutputs.delete(e);let t=this.mlContextBySessionId.get(e);if(!t)return;this.tensorManager.releaseTensorsForSession(e),this.mlContextBySessionId.delete(e),this.mlOpSupportLimitsBySessionId.delete(e);let n=this.sessionIdsByMLContext.get(t);if(n.delete(e),n.size===0){this.sessionIdsByMLContext.delete(t);let e=this.mlContextCache.findIndex(e=>e.mlContext===t);e!==-1&&this.mlContextCache.splice(e,1)}}getMLContext(e){return this.mlContextBySessionId.get(e)}getMLOpSupportLimits(e){return this.mlOpSupportLimitsBySessionId.get(e)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(e){Jt(`verbose`,()=>`[WebNN] releaseTensorId {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e)}async ensureTensor(e,t,n,r,i){let a=un.get(n);if(!a)throw Error(`Unsupported ONNX data type: ${n}`);return this.tensorManager.ensureTensor(e??this.currentSessionId,t,a,r,i)}async createTemporaryTensor(e,t,n){Jt(`verbose`,()=>`[WebNN] createTemporaryTensor {onnxDataType: ${t}, shape: ${n}}`);let r=un.get(t);if(!r)throw Error(`Unsupported ONNX data type: ${t}`);let i=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(e,i,r,n,!1);let a=this.temporarySessionTensorIds.get(e);return a?a.push(i):this.temporarySessionTensorIds.set(e,[i]),i}uploadTensor(e,t){if(!E().shouldTransferToMLTensor)throw Error(`Trying to upload to a MLTensor while shouldTransferToMLTensor is false`);Jt(`verbose`,()=>`[WebNN] uploadTensor {tensorId: ${e}, data: ${t.byteLength}}`),this.tensorManager.upload(e,t)}async downloadTensor(e,t){return this.tensorManager.download(e,t)}createMLTensorDownloader(e,t){return async()=>{let n=await this.tensorManager.download(e);return Bt(n,t)}}registerMLTensor(e,t,n,r){let i=un.get(n);if(!i)throw Error(`Unsupported ONNX data type: ${n}`);let a=this.tensorManager.registerTensor(e,t,i,r);return Jt(`verbose`,()=>`[WebNN] registerMLTensor {tensor: ${t}, dataType: ${i}, dimensions: ${r}} -> {tensorId: ${a}}`),a}registerGraphInput(e){this.temporaryGraphInputs.push(e)}registerGraphOutput(e){this.temporaryGraphOutputs.push(e)}isGraphInput(e,t){let n=this.sessionGraphInputs.get(e);return n?n.includes(t):!1}isGraphOutput(e,t){let n=this.sessionGraphOutputs.get(e);return n?n.includes(t):!1}isGraphInputOutputTypeSupported(e,t,n=!0){let r=un.get(kt(t)),i=this.mlOpSupportLimitsBySessionId.get(e);return typeof r>`u`?!1:n?!!i?.input.dataTypes.includes(r):!!i?.output.dataTypes.includes(r)}flush(){}}}),mn,hn,gn,_n,vn,yn,bn,xn,Sn,Cn,wn,Tn,En,Dn=l(()=>{ze(),bt(),Ot(),Lt(),ht(),vt(),zt(),mn=(e,t)=>{E()._OrtInit(e,t)!==0&&D(`Can't initialize onnxruntime.`)},hn=async e=>{mn(e.wasm.numThreads,Nt(e.logLevel))},gn=async(e,t)=>{E().asyncInit?.();let n=e.webgpu.adapter;if(t===`webgpu`){if(typeof navigator>`u`||!navigator.gpu)throw Error(`WebGPU is not supported in current environment`);if(n){if(typeof n.limits!=`object`||typeof n.features!=`object`||typeof n.requestDevice!=`function`)throw Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let t=e.webgpu.powerPreference;if(t!==void 0&&t!==`low-power`&&t!==`high-performance`)throw Error(`Invalid powerPreference setting: "${t}"`);let r=e.webgpu.forceFallbackAdapter;if(r!==void 0&&typeof r!=`boolean`)throw Error(`Invalid forceFallbackAdapter setting: "${r}"`);if(n=await navigator.gpu.requestAdapter({powerPreference:t,forceFallbackAdapter:r}),!n)throw Error(`Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.`)}}if(t===`webnn`&&(typeof navigator>`u`||!navigator.ml))throw Error(`WebNN is not supported in current environment`);if(t===`webgpu`&&E().webgpuInit(t=>{e.webgpu.device=t}),t===`webnn`){let t=new(pn(),f(ln)).WebNNBackend(e);E().webnnInit([t,()=>t.reserveTensorId(),e=>t.releaseTensorId(e),async(e,n,r,i,a)=>t.ensureTensor(e,n,r,i,a),(e,n)=>{t.uploadTensor(e,n)},async(e,n)=>t.downloadTensor(e,n),(e,n)=>t.registerMLContext(e,n),!!e.trace])}},_n=/* @__PURE__ */ new Map,vn=e=>{let t=E(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetInputOutputCount(e,r,r+n)!==0&&D(`Can't get session input/output count.`);let i=n===4?`i32`:`i64`;return[Number(t.getValue(r,i)),Number(t.getValue(r+n,i))]}finally{t.stackRestore(n)}},yn=(e,t)=>{let n=E(),r=n.stackSave(),i=0;try{let r=n.PTR_SIZE,a=n.stackAlloc(2*r);n._OrtGetInputOutputMetadata(e,t,a,a+r)!==0&&D(`Can't get session input/output metadata.`);let o=Number(n.getValue(a,`*`));i=Number(n.getValue(a+r,`*`));let s=n.HEAP32[i/4];if(s===0)return[o,0];let c=n.HEAPU32[i/4+1],l=[];for(let e=0;e{let t=E(),n=t._malloc(e.byteLength);if(n===0)throw Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},xn=async(e,t)=>{let n,r,i=E();Array.isArray(e)?[n,r]=e:e.buffer===i.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=bn(e);let a=0,o=0,s=0,c=[],l=[],u=[];try{if([o,c]=await Dt(t),t?.externalData&&i.mountExternalData){let e=[];for(let n of t.externalData){let t=typeof n==`string`?n:n.path,r=typeof n==`string`?n:n.data;e.push(Rt(r).then(e=>{i.mountExternalData(t,e)}))}await Promise.all(e)}for(let e of t?.executionProviders??[])if((typeof e==`string`?e:e.name)===`webnn`){if(i.shouldTransferToMLTensor=!1,typeof e!=`string`){let t=e,n=t?.context,r=t?.gpuDevice,a=t?.deviceType,o=t?.powerPreference;i.currentContext=n||(r?await i.webnnCreateMLContext(r):await i.webnnCreateMLContext({deviceType:a,powerPreference:o}))}else i.currentContext=await i.webnnCreateMLContext();break}a=await i._OrtCreateSession(n,r,o),i.webgpuOnCreateSession?.(a),a===0&&D(`Can't create a session.`),i.jsepOnCreateSession?.(),i.currentContext&&(i.webnnRegisterMLContext(a,i.currentContext),i.currentContext=void 0,i.shouldTransferToMLTensor=!0);let[e,d]=vn(a),f=!!t?.enableGraphCapture,p=[],m=[],h=[],g=[],_=[];for(let t=0;te===`gpu-buffer`||e===`ml-tensor`||e===`ml-tensor-cpu-output`)&&(s=i._OrtCreateBinding(a),s===0&&D(`Can't create IO binding.`),v={handle:s,outputPreferredLocations:_,outputPreferredLocationsEncoded:_.map(e=>e===`ml-tensor-cpu-output`?`ml-tensor`:e).map(e=>It(e))}),_n.set(a,[a,l,u,v,f,!1]),[a,p,m,h,g]}catch(e){throw l.forEach(e=>i._OrtFree(e)),u.forEach(e=>i._OrtFree(e)),s!==0&&i._OrtReleaseBinding(s)!==0&&D(`Can't release IO binding.`),a!==0&&i._OrtReleaseSession(a)!==0&&D(`Can't release session.`),e}finally{i._free(n),o!==0&&i._OrtReleaseSessionOptions(o)!==0&&D(`Can't release session options.`),c.forEach(e=>i._free(e)),i.unmountExternalData?.()}},Sn=e=>{let t=E(),n=_n.get(e);if(!n)throw Error(`cannot release session. invalid session id: ${e}`);let[r,i,a,o,s]=n;o&&(s&&t._OrtClearBoundOutputs(o.handle)!==0&&D(`Can't clear bound outputs.`),t._OrtReleaseBinding(o.handle)!==0&&D(`Can't release IO binding.`)),t.jsepOnReleaseSession?.(e),t.webnnOnReleaseSession?.(e),t.webgpuOnReleaseSession?.(e),i.forEach(e=>t._OrtFree(e)),a.forEach(e=>t._OrtFree(e)),t._OrtReleaseSession(r)!==0&&D(`Can't release session.`),_n.delete(e)},Cn=async(e,t,n,r,i,a,o=!1)=>{if(!e){t.push(0);return}let s=E(),c=s.PTR_SIZE,l=e[0],u=e[1],d=e[3],f=d,p,m;if(l===`string`&&(d===`gpu-buffer`||d===`ml-tensor`))throw Error(`String tensor is not supported on GPU.`);if(o&&d!==`gpu-buffer`)throw Error(`External buffer must be provided for input/output index ${a} when enableGraphCapture is true.`);if(d===`gpu-buffer`){let t=e[2].gpuBuffer;m=jt(kt(l),u);{let e=s.webgpuRegisterBuffer;if(!e)throw Error(`Tensor location "gpu-buffer" is not supported without using WebGPU.`);p=e(t,r)}}else if(d===`ml-tensor`){let t=e[2].mlTensor;m=jt(kt(l),u);let n=s.webnnRegisterMLTensor;if(!n)throw Error(`Tensor location "ml-tensor" is not supported without using WebNN.`);p=n(r,t,kt(l),u)}else{let t=e[2];if(Array.isArray(t)){m=c*t.length,p=s._malloc(m),n.push(p);for(let e=0;es.setValue(g+t*c,e,c===4?`i32`:`i64`));let e=s._OrtCreateTensor(kt(l),p,m,g,u.length,It(f));e===0&&D(`Can't create tensor for input/output. session=${r}, index=${a}.`),t.push(e)}finally{s.stackRestore(h)}},wn=async(e,t,n,r,i,a)=>{let o=E(),s=o.PTR_SIZE,c=_n.get(e);if(!c)throw Error(`cannot run inference. invalid session id: ${e}`);let l=c[0],u=c[1],d=c[2],f=c[3],p=c[4],m=c[5],h=t.length,g=r.length,_=0,v=[],y=[],b=[],x=[],S=[],C=o.stackSave(),ee=o.stackAlloc(h*s),w=o.stackAlloc(h*s),te=o.stackAlloc(g*s),ne=o.stackAlloc(g*s);try{[_,v]=yt(a),De(`wasm prepareInputOutputTensor`);for(let r=0;re*t,1);u=At(a);let _=f?.outputPreferredLocations[r[t]];if(u===`string`){if(_===`gpu-buffer`||_===`ml-tensor`)throw Error(`String tensor is not supported on GPU.`);let e=[];for(let t=0;t0){let t=o.webgpuGetBuffer;if(!t)throw Error(`preferredLocation "gpu-buffer" is not supported without using WebGPU.`);let r=t(d),i=jt(a,g);if(i===void 0||!Pt(u))throw Error(`Unsupported data type: ${u}`);l=!0;{o.webgpuRegisterBuffer(r,e,d);let t=o.webgpuCreateDownloader(r,i,e);C.push([u,h,{gpuBuffer:r,download:async()=>{let e=await t();return new(Mt(u))(e)},dispose:()=>{o._OrtReleaseTensor(n)!==0&&D(`Can't release tensor.`)}},`gpu-buffer`])}}else if(_===`ml-tensor`&&g>0){let t=o.webnnEnsureTensor,r=o.webnnIsGraphInputOutputTypeSupported;if(!t||!r)throw Error(`preferredLocation "ml-tensor" is not supported without using WebNN.`);if(jt(a,g)===void 0||!Ft(u))throw Error(`Unsupported data type: ${u}`);if(!r(e,u,!1))throw Error(`preferredLocation "ml-tensor" for ${u} output is not supported by current WebNN Context.`);let i=await t(e,d,a,h,!1);l=!0,C.push([u,h,{mlTensor:i,download:o.webnnCreateMLTensorDownloader(d,u),dispose:()=>{o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n)}},`ml-tensor`])}else if(_===`ml-tensor-cpu-output`&&g>0){let e=o.webnnCreateMLTensorDownloader(d,u)(),t=C.length;l=!0,re.push((async()=>{let r=[t,await e];return o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n),r})()),C.push([u,h,[],`cpu`])}else{let e=new(Mt(u))(g);new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(o.HEAPU8.subarray(d,d+e.byteLength)),C.push([u,h,e,`cpu`])}}finally{o.stackRestore(a),u===`string`&&d&&o._free(d),l||o._OrtReleaseTensor(n)}}f&&!p&&(o._OrtClearBoundOutputs(f.handle)!==0&&D(`Can't clear bound outputs.`),_n.set(e,[l,u,d,f,p,!1]));for(let[e,t]of await Promise.all(re))C[e][2]=t;return Oe(`wasm ProcessOutputTensor`),C}finally{o.webnnOnRunEnd?.(l),o.stackRestore(C),n.forEach(e=>{e&&e[3]===`gpu-buffer`&&o.webgpuUnregisterBuffer(e[2].gpuBuffer)}),i.forEach(e=>{e&&e[3]===`gpu-buffer`&&o.webgpuUnregisterBuffer(e[2].gpuBuffer)}),y.forEach(e=>o._OrtReleaseTensor(e)),b.forEach(e=>o._OrtReleaseTensor(e)),x.forEach(e=>o._free(e)),_!==0&&o._OrtReleaseRunOptions(_),v.forEach(e=>o._free(e))}},Tn=e=>{let t=E(),n=_n.get(e);if(!n)throw Error(`invalid session id`);let r=n[0],i=t._OrtEndProfiling(r);i===0&&D(`Can't get an profile file name.`),t._OrtFree(i)},En=e=>{let t=[];for(let n of e){let e=n[2];!Array.isArray(e)&&`buffer`in e&&t.push(e.buffer)}return t}}),On,kn,An,jn,Mn,Nn,Pn,Fn,In,Ln,Rn,zn,Bn,Vn,Hn,Un,Wn,Gn,Kn=l(()=>{ze(),Dn(),ht(),ot(),On=()=>!!w.wasm.proxy&&typeof document<`u`,An=!1,jn=!1,Mn=!1,Fn=/* @__PURE__ */ new Map,In=(e,t)=>{let n=Fn.get(e);n?n.push(t):Fn.set(e,[t])},Ln=()=>{if(An||!jn||Mn||!kn)throw Error(`worker not ready`)},Rn=e=>{switch(e.data.type){case`init-wasm`:An=!1,e.data.err?(Mn=!0,Pn[1](e.data.err)):(jn=!0,Pn[0]()),Nn&&=(URL.revokeObjectURL(Nn),void 0);break;case`init-ep`:case`copy-from`:case`create`:case`release`:case`run`:case`end-profiling`:{let t=Fn.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}}},zn=async()=>{if(!jn){if(An)throw Error(`multiple calls to 'initWasm()' detected.`);if(Mn)throw Error(`previous call to 'initWasm()' failed.`);if(An=!0,On())return new Promise((e,t)=>{kn?.terminate(),rt().then(([n,r])=>{try{kn=r,kn.onerror=e=>t(e),kn.onmessage=Rn,Pn=[e,t];let i={type:`init-wasm`,in:w};if(!i.in.wasm.wasmPaths&&n){let e=Xe();e&&(i.in.wasm.wasmPaths=e)}kn.postMessage(i),Nn=n}catch(e){t(e)}},t)});try{await mt(w.wasm),await hn(w),jn=!0}catch(e){throw Mn=!0,e}finally{An=!1}}},Bn=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`init-ep`,[t,n]);let r={type:`init-ep`,in:{epName:e,env:w}};kn.postMessage(r)});await gn(w,e)},Vn=async e=>On()?(Ln(),new Promise((t,n)=>{In(`copy-from`,[t,n]);let r={type:`copy-from`,in:{buffer:e}};kn.postMessage(r,[e.buffer])})):bn(e),Hn=async(e,t)=>{if(On()){if(t?.preferredOutputLocation)throw Error(`session option "preferredOutputLocation" is not supported for proxy.`);return Ln(),new Promise((n,r)=>{In(`create`,[n,r]);let i={type:`create`,in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),kn.postMessage(i,a)})}return xn(e,t)},Un=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`release`,[t,n]);let r={type:`release`,in:e};kn.postMessage(r)});Sn(e)},Wn=async(e,t,n,r,i,a)=>{if(On()){if(n.some(e=>e[3]!==`cpu`))throw Error(`input tensor on GPU is not supported for proxy.`);if(i.some(e=>e))throw Error(`pre-allocated output tensor is not supported for proxy.`);return Ln(),new Promise((i,o)=>{In(`run`,[i,o]);let s=n,c={type:`run`,in:{sessionId:e,inputIndices:t,inputs:s,outputIndices:r,options:a}};kn.postMessage(c,En(s))})}return wn(e,t,n,r,i,a)},Gn=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`end-profiling`,[t,n]);let r={type:`end-profiling`,in:e};kn.postMessage(r)});Tn(e)}}),qn,Jn,Yn,Xn=l(()=>{ze(),Kn(),Lt(),Be(),zt(),qn=(e,t)=>{switch(e.location){case`cpu`:return[e.type,e.dims,e.data,`cpu`];case`gpu-buffer`:return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},`gpu-buffer`];case`ml-tensor`:return[e.type,e.dims,{mlTensor:e.mlTensor},`ml-tensor`];default:throw Error(`invalid data location: ${e.location} for ${t()}`)}},Jn=e=>{switch(e[3]){case`cpu`:return new xe(e[0],e[2],e[1]);case`gpu-buffer`:{let t=e[0];if(!Pt(t))throw Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:i}=e[2];return xe.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:i})}case`ml-tensor`:{let t=e[0];if(!Ft(t))throw Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:i}=e[2];return xe.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:i})}default:throw Error(`invalid data location: ${e[3]}`)}},Yn=class{async fetchModelAndCopyToWasmMemory(e){return Vn(await Rt(e))}async loadModel(e,t){Te();let n;n=typeof e==`string`?await this.fetchModelAndCopyToWasmMemory(e):e,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await Hn(n,t),Ee()}async dispose(){return Un(this.sessionId)}async run(e,t,n){Te();let r=[],i=[];Object.entries(e).forEach(e=>{let t=e[0],n=e[1],a=this.inputNames.indexOf(t);if(a===-1)throw Error(`invalid input '${t}'`);r.push(n),i.push(a)});let a=[],o=[];Object.entries(t).forEach(e=>{let t=e[0],n=e[1],r=this.outputNames.indexOf(t);if(r===-1)throw Error(`invalid output '${t}'`);a.push(n),o.push(r)});let s=r.map((e,t)=>qn(e,()=>`input "${this.inputNames[i[t]]}"`)),c=a.map((e,t)=>e?qn(e,()=>`output "${this.outputNames[o[t]]}"`):null),l=await Wn(this.sessionId,i,s,o,c,n),u={};for(let e=0;e$n,initializeFlags:()=>Qn,wasmBackend:()=>er});var Qn,$n,er,tr=l(()=>{ze(),Kn(),Xn(),Qn=()=>{(typeof w.wasm.initTimeout!=`number`||w.wasm.initTimeout<0)&&(w.wasm.initTimeout=0);let e=w.wasm.simd;if(typeof e!=`boolean`&&e!==void 0&&e!==`fixed`&&e!==`relaxed`&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${e}". Reset it to \`false\` and ignore SIMD feature checking.`),w.wasm.simd=!1),typeof w.wasm.proxy!=`boolean`&&(w.wasm.proxy=!1),typeof w.wasm.trace!=`boolean`&&(w.wasm.trace=!1),typeof w.wasm.numThreads!=`number`||!Number.isInteger(w.wasm.numThreads)||w.wasm.numThreads<=0){if(typeof self<`u`&&!self.crossOriginIsolated)w.wasm.numThreads=1;else{let e=typeof navigator>`u`?c(`node:os`).cpus().length:navigator.hardwareConcurrency;w.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}}},$n=class{async init(e){Qn(),await zn(),await Bn(e)}async createInferenceSessionHandler(e,t){let n=new Yn;return await n.loadModel(e,t),n}},er=new $n});ze(),ze(),ze();var nr=`1.31.0-dev.20260914-8d85527a0`,rr=Re;{let e=(tr(),f(Zn)).wasmBackend;h(`webgpu`,e,5),h(`webnn`,e,5),h(`cpu`,e,10),h(`wasm`,e,10)}Object.defineProperty(w.versions,"web",{value:nr,enumerable:!0});let ir=`warning`;Object.defineProperty({wasm:{},webgl:{},webgpu:{},versions:{common:`1.30.0`},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);ir=e}},get logLevel(){return ir}},"logLevel",{enumerable:!0});const ar=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t===void 0||t.format===void 0?`RGB`:t.format,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat===void 0||t.tensorFormat===void 0?`RGB`:t.tensorFormat,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,sr(o,s)}throw Error(`Can not access image data`)}else if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(sr(e.data,s))}});else throw Error(`Input data provided is not supported - aborted tensor creation`);if(o!==void 0)return sr(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},lr=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new yr({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ur=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yr({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},dr=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yr({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},fr=(e,t,n)=>new yr({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]}),pr=/* @__PURE__ */ new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),mr=/* @__PURE__ */ new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]);let hr=!1;const gr=()=>{if(!hr){hr=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=n!==void 0&&n.from;e&&(pr.set(`int64`,BigInt64Array),mr.set(BigInt64Array,`int64`)),t&&(pr.set(`uint64`,BigUint64Array),mr.set(BigUint64Array,`uint64`)),r?(pr.set(`float16`,n),mr.set(n,`float16`)):pr.set(`float16`,Uint16Array)}},_r=e=>{let t=1;for(let n=0;n{switch(e.location){case`cpu`:return new yr(e.type,e.data,t);case`cpu-pinned`:return new yr({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new yr({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new yr({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new yr({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}};var yr=class{constructor(e,t,n){gr();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=pr.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`){if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=pr.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray){if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`)}else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=mr.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=_r(i);if(this.cpuData&&a!==this.cpuData.length&&(r!==`uint4`&&r!==`int4`||Math.ceil(a/2)!==this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return cr(e,t)}static fromTexture(e,t){return lr(e,t)}static fromGpuBuffer(e,t){return ur(e,t)}static fromMLTensor(e,t){return dr(e,t)}static fromPinnedBuffer(e,t,n){return fr(e,t,n)}toDataURL(e){return ar(this,e)}toImageData(e){return or(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return vr(this,e)}};const br=yr;var xr=Object.defineProperty,Sr=(e,t)=>{for(var n in t)xr(e,n,{get:t[n],enumerable:!0})},Cr={},wr={},Tr={},Er=`4.3.0`,Dr=typeof self<`u`,Or=!Qr(Cr),kr=!Qr(wr),Ar=Dr&&`caches`in self,jr=globalThis.Deno!==void 0;globalThis.Bun;var Mr=jr&&Ar&&!Or,Nr=typeof process<`u`,Pr=Nr&&process?.release?.name===`node`&&!Mr,Fr=typeof window<`u`&&window.document!==void 0,Ir=Dr&&[`DedicatedWorkerGlobalScope`,`ServiceWorkerGlobalScope`,`SharedWorkerGlobalScope`].includes(self.constructor?.name),Lr=Fr||Ir||Mr,Rr=Pr||typeof navigator<`u`&&`gpu`in navigator,zr=typeof navigator<`u`&&`ml`in navigator,Br=typeof crypto<`u`&&typeof crypto.getRandomValues==`function`,Vr=typeof chrome<`u`&&chrome.runtime!==void 0&&typeof chrome.runtime.id==`string`,Hr=typeof ServiceWorkerGlobalScope<`u`&&Dr&&self instanceof ServiceWorkerGlobalScope,Ur=(()=>{if(typeof navigator>`u`)return!1;let e=navigator.userAgent;if(!((navigator.vendor||``).indexOf(`Apple`)>-1&&!e.match(/CriOS|FxiOS|EdgiOS|OPiOS|mercury|brave/i)&&!e.includes(`Chrome`)&&!e.includes(`Android`)))return!1;let t=e.match(/Version\/(\d+)/);return t?parseInt(t[1],10)<26:!1})(),O=Object.freeze({IS_BROWSER_ENV:Fr,IS_WEBWORKER_ENV:Ir,IS_WEB_ENV:Lr,IS_SERVICE_WORKER_ENV:Hr,IS_DENO_WEB_RUNTIME:Mr,IS_WEB_CACHE_AVAILABLE:Ar,IS_WEBGPU_AVAILABLE:Rr,IS_WEBNN_AVAILABLE:zr,IS_SAFARI_BELOW_26:Ur,IS_PROCESS_AVAILABLE:Nr,IS_NODE_ENV:Pr,IS_FS_AVAILABLE:Or,IS_PATH_AVAILABLE:kr,IS_CRYPTO_AVAILABLE:Br,IS_CHROME_AVAILABLE:Vr}),Wr=Or&&kr,Gr=`./`;if(Wr){let e=import.meta.url;e?Gr=wr.dirname(wr.dirname(Tr.fileURLToPath(e))):typeof __dirname<`u`&&(Gr=wr.dirname(__dirname))}var Kr=Wr?wr.join(Gr,`/.cache/`):null,qr=`/models/`,Jr=Wr?wr.join(Gr,qr):qr,Yr=typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):void 0,Xr=Object.freeze({DEBUG:10,INFO:20,WARNING:30,ERROR:40,NONE:50}),Zr=Xr.WARNING,k={version:Er,backends:{onnx:{}},get logLevel(){return Zr},set logLevel(e){Zr=e,k.backends.onnx?.setLogLevel?.(e)},allowRemoteModels:!0,remoteHost:`https://huggingface.co/`,remotePathTemplate:`{model}/resolve/{revision}/`,allowLocalModels:!(Fr||Ir||Mr),localModelPath:Jr,useFS:Or,useBrowserCache:Ar,useFSCache:Or,cacheDir:Kr,useCustomCache:!1,customCache:null,useWasmCache:Ar||Or,cacheKey:`transformers-cache`,experimental_useCrossOriginStorage:!1,fetch:Yr};function Qr(e){return Object.keys(e).length===0}var $r=class{constructor(){let e=function(...t){return e._call(...t)};return Object.setPrototypeOf(e,new.target.prototype)}_call(...e){throw Error(`Must implement _call method in subclass`)}};function ei(e,t){e&&e(t)}var ti=class extends $r{constructor(e,t){super(),this.callback=e,this.files_loading=t,this.loads=/* @__PURE__ */ new Map}_call(e){if(e.status===`progress`){this.files_loading[e.file]={loaded:e.loaded,total:e.total};let t=Object.values(this.files_loading).reduce((e,t)=>e+t.loaded,0),n=Object.values(this.files_loading).reduce((e,t)=>e+t.total,0),r=n>0?t/n*100:0;this.callback({status:`progress_total`,name:e.name,progress:r,loaded:t,total:n,files:structuredClone(this.files_loading)})}this.callback(e)}};function ni(e){return Number.isInteger(e)||typeof e==`bigint`}function ri(e){return e==null||e===-1}function ii(e){let t=[],n=e;for(;Array.isArray(n);)t.push(n.length),n=n[0];return t}function ai(...e){return Array.prototype.concat.apply([],e)}function oi(...e){return e.reduce((e,t)=>e.flatMap(e=>t.map(t=>[e,t])))}function si(e,t){return Math.abs((e+t)%(2*t)-t)}function ci(e,t){return Object.assign({},...t.map(t=>{if(e[t]!==void 0)return{[t]:e[t]}}))}function li(e,t){let n=0;for(let r of e)r===t&&++n;return n}var A={error(...e){k.logLevel<=Xr.ERROR&&console.error(...e)},warn(...e){k.logLevel<=Xr.WARNING&&console.warn(...e)},info(...e){k.logLevel<=Xr.INFO&&console.log(...e)},debug(...e){k.logLevel<=Xr.DEBUG&&console.log(...e)},log(...e){this.info(...e)}},ui=class{constructor(e){this.trie=this._build_trie(e)}_build_trie(e){let t=/* @__PURE__ */ Object.create(null);for(let n of e){let e=t;for(let t=0;tr&&t.push(e.slice(r,i)),t.push(o),i+=o.length,r=i):++i}return r{try{return new RegExp(e,t)}catch(n){if(!(n instanceof SyntaxError))throw n;let r=/* @__PURE__ */ new Map,i=e.replace(/(\\[pP])\{([^}=]+)\}/g,(t,n,i,a)=>{let o=0;for(let t=a-1;t>=0&&e[t]===`\\`;--t)++o;if(o%2==1)return t;let s=r.get(i);if(s===void 0){try{RegExp(`\\p{${i}}`,`u`),s=i}catch{s=`Script=${i}`}r.set(i,s)}return`${n}{${s}}`});if(i===e)throw n;try{return new RegExp(i,t)}catch{throw n}}},pi=e=>e.replace(/ \./g,`.`).replace(/ \?/g,`?`).replace(/ \!/g,`!`).replace(/ ,/g,`,`).replace(/ \' /g,`'`).replace(/ n't/g,`n't`).replace(/ 'm/g,`'m`).replace(/ 's/g,`'s`).replace(/ 've/g,`'ve`).replace(/ 're/g,`'re`),mi=(e,t=!0)=>{if(e.Regex!==void 0)return fi(Qi(Bi(e.Regex)),`gu`);if(e.String!==void 0){let n=$i(e.String);return new RegExp(t?n:`(${n})`,`gu`)}return console.warn(`Unknown pattern type:`,e),null},hi=`\\p{Alphabetic}\\p{M}\\p{Nd}\\p{Pc}`,gi=`${hi}\\u00B2\\u00B3\\u00B9\\u00BC-\\u00BE`,_i=`[${gi}]`,vi=`[^${gi}]`,yi=`(?:(?|[:=!>])/,ji=/^\\([pPxu])\{([^}]*)\}/,Mi=/^\{(\d+(?:,\d*)?|,\d+)\}/,Ni=/^\[:(\^?)(\p{Alphabetic}+):\]/u,Pi=/^\[:\^:\]/,Fi=/^\[(?:\.[^\]]*\.\]|=[^\]]*=\])/,Ii=/^(?:\\x[0-9A-Fa-f]{2}|\\u[0-9A-Fa-f]{4}|\\c[A-Za-z])/,Li=e=>e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`,Ri=(e,t)=>String.fromCodePoint(e.codePointAt(t)),zi=e=>{if(!/^[0-9A-Fa-f]{1,8}$/.test(e))return null;let t=Number.parseInt(e,16);if(t>127)return null;let n=String.fromCharCode(t);return Li(n)?`[${n.toLowerCase()}${n.toUpperCase()}]`:null},Bi=e=>e.replace(/\[\^\(\\s\|\[([^\]]+)\]\)\]/g,`[^()|\\s$1]`),Vi=`[\\s\\S]`,Hi=256,Ui=()=>({fragment:``,alternatives:[],tail:null,contains_complex_set:!1}),Wi=e=>{throw SyntaxError(`Unsupported range with a set-valued character-class operand at index ${e}`)},Gi=(e,t,n,r=!0)=>{e.tail===`range`&&Wi(n),e.alternatives.push(t),e.tail=`set`,e.contains_complex_set=e.contains_complex_set||r},Ki=(e,t,n=!1,r=-1)=>{if(n&&e.tail===`range`&&Wi(r),e.tail===`range`){e.fragment+=t,e.tail=`complete_range`;return}e.fragment+=t,e.tail=n?`set`:`scalar`,e.contains_complex_set=e.contains_complex_set||n},qi=(e,t,n)=>{let r=ji.exec(e.slice(t));if(r){let[e,i,a]=r;return i===`P`&&a===`Word`?Gi(n,`[^${hi}]`,t):Ki(n,i===`x`?`\\u{${a}}`:i===`p`&&a===`Word`?hi:e,i===`p`||i===`P`,t),t+e.length}let i=Ii.exec(e.slice(t));if(i)return Ki(n,i[0]),t+i[0].length;if(t+1>=e.length)throw SyntaxError(`Unterminated escape in character class at index ${t}`);let a=Ri(e,t+1),o=t+1+a.length,s=Di.get(a);if(s!==void 0)return Ki(n,s),o;let c=Ei.get(a);if(c!==void 0)return Gi(n,c,t),o;let l=Ti.get(a),u,d=!1;return l===void 0?u=/[A-Za-z0-9]/.test(a)||ki.includes(a)||a===`-`?`\\${a}`:a:(u=l,d=a!==`a`&&a!==`e`),Ki(n,u,d,t),o},Ji=e=>e.length===1?e[0]:`(?:(?=(?:${e.join(`|`)}))${Vi})`,Yi=e=>Ji(e.fragment.length===0?e.alternatives:[`[${e.fragment}]`,...e.alternatives]),Xi=e=>{let t=fi(`^(?:${e})$`,`u`),n=``;for(let e=0;e<26;++e){let r=String.fromCharCode(65+e),i=String.fromCharCode(97+e),a=t.test(r);a!==t.test(i)&&(n+=a?i:r)}return n},Zi=(e,t,n,r=!0,i=1)=>{if(i>Hi)throw SyntaxError(`Maximum character-class nesting depth of ${Hi} exceeded at index ${t}`);let a=t+1,o=e[a]===`^`;o&&++a;let s=a,c=[Ui()],l=c[0],u=!1;for(;a1?SyntaxError(`Malformed character-class intersection with an empty operand at index ${a}`):SyntaxError(`Empty character class at index ${t}`);let e=c.some(e=>e.contains_complex_set);if(o&&c.length>1&&u)throw SyntaxError(`Unsupported outer-negated character-class intersection with a nested negated class containing a Unicode property, POSIX class, or shorthand at index ${t}`);let i=Yi(c[0]),d=i;if(c.length>1){let e=``;for(let t=1;t0&&(f?(p+=e,d=`[${p}]`):d=Ji([d,`[${e}]`]))}return{atom:o?f?`[^${p}]`:`(?:(?!${d})${Vi})`:d,end:a+1,negated:o,contains_complex_set:e,contains_nested_negated_complex_set:u}}if(e.startsWith(`&&`,a)){if(l.tail===null)throw SyntaxError(`Malformed character-class intersection with an empty operand at index ${a}`);l=Ui(),c.push(l),a+=2;continue}if(d===`[`){let t=e.slice(a);if(Pi.test(t))throw SyntaxError(`Malformed empty negated POSIX character class at index ${a}`);let r=Ni.exec(t);if(r){let[,e,t]=r,i=Oi.get(t);if(i===void 0)throw SyntaxError(`Unsupported POSIX character class "${t}" at index ${a}`);if(n&&e&&(t===`lower`||t===`upper`))throw SyntaxError(`Unsupported negated POSIX ${t} class inside an inline case-insensitive group`);e?Gi(l,`[^${i}]`,a):Ki(l,i,!0,a),a+=r[0].length;continue}if(Fi.test(t))throw SyntaxError(`Unsupported POSIX collating or equivalence bracket expression at index ${a}`);let o=Zi(e,a,n,!1,i+1);Gi(l,o.atom,a,o.contains_complex_set),u||=o.contains_nested_negated_complex_set||o.negated&&o.contains_complex_set,a=o.end;continue}if(d===`-`){let t=e[a+1]===`]`||e.startsWith(`&&`,a+1);l.tail===`set`&&!t&&Wi(a),l.tail===null||l.tail===`range`||l.tail===`complete_range`||t?Ki(l,`\\-`):(l.fragment+=`-`,l.tail=`range`),++a;continue}Ki(l,d===`^`&&l.fragment.length===0?`\\^`:d),a+=d.length}throw SyntaxError(`${c.length>1?`Unterminated character-class intersection`:`Unterminated character class`} at index ${t}`)},Qi=e=>{let t=``,n=-1,r=!1,i=!1,a=[],o=e=>{n=t.length,t+=e,r=!1};for(let s=0;s=e.length){t+=c;break}let a=Ri(e,s+1);if(s+=1+a.length,a===`G`)continue;let l=Di.get(a);if(l!==void 0){o(l);continue}let u=wi.get(a),d;d=u===void 0?/[A-Za-z0-9]/.test(a)||ki.includes(a)?`\\${a}`:a:u,o(d);continue}switch(c){case`[`:{let t=Zi(e,s,i);o(t.atom),s=t.end;continue}case`]`:o(`\\]`),++s;continue;case`.`:o(`[^\\n]`),++s;continue;case`^`:o(xi),++s;continue;case`$`:o(Si),++s;continue;case`(`:{let n=e.startsWith(`(?i:`,s),o=n?`(?i:`:Ai.exec(e.slice(s))?.[0]??`(`,c=n||o===`(?>`?`(?:`:o;a.push([t.length,i]),n&&(i=!0),t+=c,r=!1,s+=o.length;continue}case`)`:t+=c,[n,i]=a.pop()??[-1,!1],r=!1,++s;continue;case`|`:t+=c,n=-1,r=!1,++s;continue;case`{`:{let i=Mi.exec(e.slice(s));if(!i||n<0){o(`\\{`),++s;continue}let a=i[1].startsWith(`,`)?`0${i[1]}`:i[1];s+=i[0].length;let c=e[s];c===`+`||c===`*`?(t=`${t.slice(0,n)}(?:${t.slice(n)}{${a}})${c}`,++s):t+=`{${a}}`,r=!0;continue}case`}`:o(`\\}`),++s;continue;case`+`:if(r){++s;continue}t+=c,r=!0,++s;continue;case`*`:case`?`:t+=c,r=!0,++s;continue;default:o(i&&Li(c)?`[${c.toLowerCase()}${c.toUpperCase()}]`:c),s+=c.length;continue}}return t},$i=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),ea=(e,t,n)=>{let r=[],i=0;for(;ie>=19968&&e<=40959||e>=13312&&e<=19903||e>=131072&&e<=173791||e>=173824&&e<=177983||e>=177984&&e<=178207||e>=178208&&e<=183983||e>=63744&&e<=64255||e>=194560&&e<=195103,na=e=>Number.isInteger(e)||typeof e==`bigint`,ra=e=>{let t=0;for(let n of e)++t;return t},ia=e=>ca(e.toLowerCase()),aa=(...e)=>Array.prototype.concat.apply([],e),oa=e=>new Map(Object.entries(e)),sa=(e,t)=>{let n=[],r=0;for(let i of e.matchAll(t)){let t=i[0];r0&&n.push(t),r=i.index+t.length}return re.replace(/\p{M}/gu,``),la=(e,t,n=[])=>{if(!e||Array.isArray(e)||typeof e!=`object`)return`${t} must be a valid object`;for(let r of n)if(!(r in e))return`${t} must contain a "${r}" property`;return null},ua=e=>e.match(/\S+/g)||[],da=class{constructor(){let e=function(...t){return e._call(...t)};return Object.setPrototypeOf(e,new.target.prototype)}},fa=class extends da{constructor(e){super(),this.config=e}_call(e){return this.normalize(e)}},pa=class extends fa{tokenize_chinese_chars(e){let t=[];for(let n=0;ne.normalize(`NFKC`)).join(`~`):e.normalize(`NFKC`),e}},ha=class extends fa{constructor(e){super(e),this.normalizers=(e.normalizers??[]).map(e=>Da(e))}normalize(e){return this.normalizers.reduce((e,t)=>t?t.normalize(e):e,e)}},ga=class extends fa{constructor(e){super(e),this.pattern=mi(this.config.pattern??{})}normalize(e){return this.pattern===null?e:e.replaceAll(this.pattern,this.config.content??``)}},_a=class extends fa{constructor(){super(...arguments),this.form=`NFC`}normalize(e){return e=e.normalize(this.form),e}},va=class extends _a{constructor(){super(...arguments),this.form=`NFC`}},ya=class extends _a{constructor(){super(...arguments),this.form=`NFD`}},ba=class extends _a{constructor(){super(...arguments),this.form=`NFKC`}},xa=class extends _a{constructor(){super(...arguments),this.form=`NFKD`}},Sa=class extends fa{normalize(e){return this.config.strip_left&&this.config.strip_right?e=e.trim():(this.config.strip_left&&(e=e.trimStart()),this.config.strip_right&&(e=e.trimEnd())),e}},Ca=class extends fa{normalize(e){return ca(e)}},wa=class extends fa{normalize(e){return e.toLowerCase()}},Ta=class extends fa{normalize(e){return e=this.config.prepend+e,e}};function Ea(e){if(e===null)return null;switch(e.type){case`BertNormalizer`:return new pa(e);case`Precompiled`:return new ma(e);case`Sequence`:return new ha(e);case`Replace`:return new ga(e);case`NFC`:return new va(e);case`NFD`:return new ya(e);case`NFKC`:return new ba(e);case`NFKD`:return new xa(e);case`Strip`:return new Sa(e);case`StripAccents`:return new Ca(e);case`Lowercase`:return new wa(e);case`Prepend`:return new Ta(e);default:throw Error(`Unknown Normalizer type: ${e.type}`)}}var Da=Ea,Oa=class extends da{pre_tokenize(e,t){return(Array.isArray(e)?e.map(e=>this.pre_tokenize_text(e,t)):this.pre_tokenize_text(e,t)).flat()}_call(e,t){return this.pre_tokenize(e,t)}},ka=(()=>{let e=[...Array.from({length:94},(e,t)=>t+33),...Array.from({length:12},(e,t)=>t+161),...Array.from({length:82},(e,t)=>t+174)],t=e.slice(),n=0;for(let r=0;r<256;++r)e.includes(r)||(e.push(r),t.push(256+n),n+=1);let r=t.map(e=>String.fromCharCode(e));return Object.fromEntries(e.map((e,t)=>[e,r[t]]))})(),Aa=(e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[t,e])))(ka),ja=`\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E`,Ma=class extends Oa{constructor(e){super(),this.config=e,this.add_prefix_space=this.config.add_prefix_space??!1,this.trim_offsets=this.config.trim_offsets??!1,this.use_regex=this.config.use_regex??!0,this.pattern=/'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu,this.byte_encoder=ka,this.text_encoder=new TextEncoder}pre_tokenize_text(e,t){return this.add_prefix_space&&!e.startsWith(` `)&&(e=` `+e),(this.use_regex?e.match(this.pattern)||[]:[e]).map(e=>Array.from(this.text_encoder.encode(e),e=>this.byte_encoder[e]).join(``))}},Na=class extends Oa{pre_tokenize_text(e,t){return e.match(/\w+|[^\w\s]+/g)||[]}},Pa=class extends Oa{constructor(e){super(),this.replacement=e.replacement??`▁`,this.str_rep=e.str_rep||this.replacement,this.prepend_scheme=e.prepend_scheme??`always`}pre_tokenize_text(e,t){let{section_index:n=void 0}=t??{},r=e.replaceAll(` `,this.str_rep);return!r.startsWith(this.replacement)&&(this.prepend_scheme===`always`||this.prepend_scheme===`first`&&n===0)&&(r=this.str_rep+r),[r]}},Fa=class extends Oa{constructor(e){super(),this.config=e,this.pattern=mi(this.config.pattern??{},this.config.invert??!0)}pre_tokenize_text(e){return this.pattern===null?[]:this.config.invert?(e.match(this.pattern)||[]).filter(e=>e):this.config.behavior?.toLowerCase()===`removed`?e.split(this.pattern).filter(e=>e):sa(e,this.pattern)}},Ia=class extends Oa{constructor(e){super(),this.config=e,this.pattern=RegExp(`[^${ja}]+|[${ja}]+`,`gu`)}pre_tokenize_text(e){return e.match(this.pattern)||[]}},La=class extends Oa{constructor(e){super(),this.config=e;let t=`[^\\d]+|\\d${this.config.individual_digits?``:`+`}`;this.pattern=new RegExp(t,`gu`)}pre_tokenize_text(e){return e.match(this.pattern)||[]}},Ra=class extends Oa{constructor(){super(),this.pattern=RegExp(`[^\\s${ja}]+|[${ja}]`,`gu`)}pre_tokenize_text(e,t){return e.trim().match(this.pattern)||[]}},za=class extends Oa{constructor(e){super(),this.config=e,this.pattern=mi(this.config.pattern??{}),this.content=this.config.content??``}pre_tokenize_text(e){return this.pattern===null?[e]:[e.replaceAll(this.pattern,this.config.content??``)]}},Ba=class extends Oa{constructor(e){super(),this.tokenizers=(e.pretokenizers??[]).map(e=>Wa(e))}pre_tokenize_text(e,t){return this.tokenizers.reduce((e,n)=>n?n.pre_tokenize(e,t):e,[e])}},Va=class extends Oa{pre_tokenize_text(e){return ua(e)}},Ha=class extends Oa{constructor(e){super(),this.config=e,this._length=e.length}pre_tokenize_text(e){let t=[];for(let n=0;nthis.max_input_chars_per_word){t.push(this.unk_token);continue}let r=!1,i=0,a=[];for(;i0&&(r=this.config.continuing_subword_prefix+r),this.tokens_to_ids.has(r)){n=r;break}--t}if(n===null){r=!0;break}a.push(n),i=t}r?t.push(this.unk_token):t.push(...a)}return t}},qa=class e{constructor(e,t){this.is_leaf=e,this.children=t}static default(){return new e(!1,/* @__PURE__ */ new Map)}},Ja=class{constructor(){this.root=qa.default()}extend(e){for(let t of e)this.push(t)}push(e){let t=this.root;for(let n of e){let e=t.children.get(n);e===void 0&&(e=qa.default(),t.children.set(n,e)),t=e}t.is_leaf=!0}*common_prefix_search(e,t=0){let n=this.root;if(n===void 0)return;let r=``;for(let i=t;i[]),this.end_nodes=Array.from({length:this.len+1},()=>[]);let r=new Ya(this.bos_token_id??0,0,0,0,0),i=new Ya(this.eos_token_id??0,1,this.len,0,0);this.nodes.push(r.clone()),this.nodes.push(i.clone()),this.begin_nodes[this.len].push(i),this.end_nodes[0].push(r)}insert(e,t,n,r){let i=this.nodes.length,a=new Ya(r,i,e,t,n);this.begin_nodes[e].push(a),this.end_nodes[e+t].push(a),this.nodes.push(a)}viterbi(){let e=this.len,t=0;for(;t<=e;){if(this.begin_nodes[t].length==0)return[];for(let e of this.begin_nodes[t]){e.prev=null;let n=0,r=null;for(let i of this.end_nodes[t]){let t=i.backtrace_score+e.score;(r===null||t>n)&&(r=i.clone(),n=t)}if(r!==null)e.prev=r,e.backtrace_score=n;else return[]}++t}let n=[],r=this.begin_nodes[e][0].prev;if(r===null)return[];let i=r.clone();for(;i.prev!==null;)n.push(i.clone()),i=i.clone().prev.clone();return n.reverse(),n}piece(e){return this.chars.slice(e.pos,e.pos+e.length).join(``)}tokens(){return this.viterbi().map(e=>this.piece(e))}token_ids(){return this.viterbi().map(e=>e.token_id)}};function Za(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;r[e,t])),this.bos_token=` `,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=t,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.unk_token=this.vocab[this.unk_token_id],this.min_score=Za(this.scores)[0],this.unk_score=this.min_score-10,this.scores[this.unk_token_id]=this.unk_score,this.trie=new Ja,this.trie.extend(this.vocab),this.fuse_unk=!0}populate_nodes(e){let t=e.chars,n=0;for(;ne>t,t=1/0){this._heap=[],this._comparator=e,this._max_size=t}get size(){return this._heap.length}is_empty(){return this.size===0}peek(){return this._heap[0]}push(...e){return this.extend(e)}extend(e){for(let t of e)if(this.size0&&this._swap(0,t),this._heap.pop(),this._sift_down(),e}replace(e){let t=this.peek();return this._heap[0]=e,this._sift_down(),t}_parent(e){return(e+1>>>1)-1}_left(e){return(e<<1)+1}_right(e){return e+1<<1}_greater(e,t){return this._comparator(this._heap[e],this._heap[t])}_swap(e,t){let n=this._heap[e];this._heap[e]=this._heap[t],this._heap[t]=n}_sift_up(){this._sift_up_from(this.size-1)}_sift_up_from(e){for(;e>0&&this._greater(e,this._parent(e));)this._swap(e,this._parent(e)),e=this._parent(e)}_sift_down(){let e=0;for(;this._left(e)this.capacity&&this.cache.delete(this.cache.keys().next().value)}clear(){this.cache.clear()}},to=class extends Ga{constructor(e){super(e),this.tokens_to_ids=oa(e.vocab),this.unk_token_id=this.tokens_to_ids.get(e.unk_token),this.unk_token=e.unk_token,this.vocab=Array(this.tokens_to_ids.size);for(let[e,t]of this.tokens_to_ids)this.vocab[t]=e;let t=Array.isArray(e.merges[0]);this.merges=t?e.merges:e.merges.map(e=>e.split(` `,2)),this.bpe_ranks=new Map(this.merges.map((e,t)=>[JSON.stringify(e),t])),this.end_of_word_suffix=e.end_of_word_suffix,this.continuing_subword_suffix=e.continuing_subword_suffix??null,this.byte_fallback=this.config.byte_fallback??!1,this.byte_fallback&&(this.text_encoder=new TextEncoder),this.ignore_merges=this.config.ignore_merges??!1,this.max_length_to_cache=256,this.cache_capacity=1e4,this.cache=new eo(this.cache_capacity)}clear_cache(){this.cache.clear()}bpe(e){if(e.length===0)return[];let t=this.cache.get(e);if(t!==void 0)return t;let n=Array.from(e);this.end_of_word_suffix&&(n[n.length-1]+=this.end_of_word_suffix);let r=[];if(n.length>1){let e=new $a((e,t)=>e.score`<0x${e.toString(16).toUpperCase().padStart(2,`0`)}>`);e.every(e=>this.tokens_to_ids.has(e))?t.push(...e):this.unk_token!=null&&t.push(this.unk_token)}else this.unk_token!=null&&t.push(this.unk_token)}return t}},no=class extends Ga{constructor(e,t){super(e);let n=e.vocab;this.tokens_to_ids=oa(t.target_lang?n[t.target_lang]:n),this.bos_token=t.bos_token,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=t.eos_token,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.pad_token=t.pad_token,this.pad_token_id=this.tokens_to_ids.get(this.pad_token),this.unk_token=t.unk_token,this.unk_token_id=this.tokens_to_ids.get(this.unk_token),this.vocab=Array(this.tokens_to_ids.size);for(let[e,t]of this.tokens_to_ids)this.vocab[t]=e}encode(e){return e}};function ro(e,t){switch(e.type){case`WordPiece`:return new Ka(e);case`Unigram`:return new Qa(e,t.eos_token);case`BPE`:return new to(e);default:if(e.vocab)return Array.isArray(e.vocab)?new Qa(e,t.eos_token):Object.hasOwn(e,`continuing_subword_prefix`)&&Object.hasOwn(e,`unk_token`)?Object.hasOwn(e,`merges`)?new to(e):new Ka(e):new no(e,{target_lang:t.target_lang,bos_token:t.bos_token,eos_token:t.eos_token,pad_token:t.pad_token,unk_token:t.unk_token});throw Error(`Unknown TokenizerModel type: ${e?.type}`)}}var io=ro,ao=class extends da{constructor(e){super(),this.config=e}_call(e,...t){return this.post_process(e,...t)}},oo=class extends ao{post_process(e,t=null,n=!0){let r=t===null?this.config.single:this.config.pair,i=[],a=[];for(let o of r)`SpecialToken`in o?n&&(i.push(o.SpecialToken.id),a.push(o.SpecialToken.type_id)):`Sequence`in o&&(o.Sequence.id===`A`?(i=aa(i,e),a=aa(a,Array(e.length).fill(o.Sequence.type_id))):o.Sequence.id===`B`&&(i=aa(i,t),a=aa(a,Array(t.length).fill(o.Sequence.type_id))));return{tokens:i,token_type_ids:a}}},so=class extends ao{post_process(e,t=null){return{tokens:e,tokens_pair:t}}},co=class extends ao{constructor(e){super(e),this.sep=e.sep,this.cls=e.cls}post_process(e,t=null,n=!0){n&&(e=aa([this.cls[0]],e,[this.sep[0]]));let r=Array(e.length).fill(0);if(t){let i=[],a=n?[this.sep[0]]:[];e=aa(e,i,t,a),r=aa(r,Array(t.length+i.length+a.length).fill(1))}return{tokens:e,token_type_ids:r}}},lo=class extends ao{constructor(e){super(e),this.sep=e.sep,this.cls=e.cls}post_process(e,t,n=!0){n&&(e=aa([this.cls[0]],e,[this.sep[0]]));let r=Array(e.length).fill(0);if(t){let i=n?[this.sep[0]]:[],a=n?[this.sep[0]]:[];e=aa(e,i,t,a),r=aa(r,Array(t.length+i.length+a.length).fill(1))}return{tokens:e,token_type_ids:r}}},uo=class extends ao{constructor(e){super(e),this.processors=(e.processors??[]).map(e=>po(e))}post_process(e,t=null,n=!0){let r={tokens:e,tokens_pair:t};for(let e of this.processors)r=e.post_process(r.tokens,r.tokens_pair,n);return r}};function fo(e){if(e===null)return null;switch(e.type){case`TemplateProcessing`:return new oo(e);case`ByteLevel`:return new so(e);case`BertProcessing`:return new co(e);case`RobertaProcessing`:return new lo(e);case`Sequence`:return new uo(e);default:throw Error(`Unknown PostProcessor type: ${e.type}`)}}var po=fo,mo=class extends da{constructor(e){super(),this.config=e,this.added_tokens=[],this.end_of_word_suffix=null,this.trim_offsets=`trim_offsets`in e&&e.trim_offsets}_call(e){return this.decode(e)}decode(e){return this.decode_chain(e).join(``)}},ho=class extends mo{constructor(e){super(e),this.byte_decoder=Aa,this.text_decoder=new TextDecoder(`utf-8`,{fatal:!1,ignoreBOM:!0}),this.end_of_word_suffix=null}convert_tokens_to_string(e){let t=e.join(``),n=new Uint8Array([...t].map(e=>this.byte_decoder[e]));return this.text_decoder.decode(n)}decode_chain(e){let t=[],n=[];for(let r of e)this.added_tokens.find(e=>e.content===r)===void 0?n.push(r):(n.length>0&&(t.push(this.convert_tokens_to_string(n)),n=[]),t.push(r));return n.length>0&&t.push(this.convert_tokens_to_string(n)),t}},go=class extends mo{constructor(e){super(e),this.cleanup=e.cleanup}decode_chain(e){return e.map((e,t)=>{if(t!==0){let t=this.config.prefix;e=t&&e.startsWith(t)?e.replace(t,``):` `+e}return this.cleanup&&(e=pi(e)),e})}},_o=class extends mo{constructor(e){super(e),this.replacement=e.replacement??`▁`}decode_chain(e){let t=[];for(let n=0;nt.replaceAll(this.suffix,n===e.length-1?``:` `))}},yo=class extends mo{constructor(e){super(e),this.pad_token=e.pad_token??``,this.word_delimiter_token=e.word_delimiter_token??``,this.cleanup=e.cleanup}convert_tokens_to_string(e){if(e.length===0)return``;let t=[e[0]];for(let n=1;ne!==this.pad_token).join(``);return this.cleanup&&(n=pi(n).replaceAll(this.word_delimiter_token,` `).trim()),n}decode_chain(e){return[this.convert_tokens_to_string(e)]}},bo=class extends mo{constructor(e){super(e),this.decoders=(e.decoders??[]).map(e=>Eo(e))}decode_chain(e){return this.decoders.reduce((e,t)=>t.decode_chain(e),e)}},xo=class extends mo{constructor(e){super(e),this.pattern=mi(this.config.pattern)}decode_chain(e){let t=this.config.content??``,n=this.pattern;return n===null?e:e.map(e=>e.replaceAll(n,t))}},So=class extends mo{decode_chain(e){return[e.join(``)]}},Co=class extends mo{constructor(e){super(e),this.content=e.content??``,this.start=e.start??0,this.stop=e.stop??0}decode_chain(e){return e.map(e=>{let t=0;for(let n=0;n`)){let t=parseInt(r.slice(3,5),16);isNaN(t)||(e=t)}if(e!==null)n.push(e);else{if(n.length>0){let e=this.text_decoder.decode(Uint8Array.from(n));t.push(e),n=[]}t.push(r)}}if(n.length>0){let e=this.text_decoder.decode(Uint8Array.from(n));t.push(e),n=[]}return t}};function To(e){if(e===null)return null;switch(e.type){case`ByteLevel`:return new ho(e);case`WordPiece`:return new go(e);case`Metaspace`:return new _o(e);case`BPEDecoder`:return new vo(e);case`CTC`:return new yo(e);case`Sequence`:return new bo(e);case`Replace`:return new xo(e);case`Fuse`:return new So(e);case`Strip`:return new Co(e);case`ByteFallback`:return new wo(e);default:throw Error(`Unknown Decoder type: ${e.type}`)}}var Eo=To,Do=class{constructor(e,t){let n=la(e,`Tokenizer`,[`model`,`decoder`,`post_processor`,`pre_tokenizer`,`normalizer`]);if(n)throw Error(n);let r=la(t,`Config`);if(r)throw Error(r);this.tokenizer=e,this.config=t,this.normalizer=Da(this.tokenizer.normalizer),this.pre_tokenizer=Wa(this.tokenizer.pre_tokenizer),this.model=io(this.tokenizer.model,this.config),this.post_processor=po(this.tokenizer.post_processor),this.decoder=Eo(this.tokenizer.decoder),this.special_tokens=[],this.all_special_ids=[],this.added_tokens=[];let i=[],a=[];this.added_tokens_map=/* @__PURE__ */ new Map;for(let e of this.tokenizer.added_tokens){let t=new di(e);if(this.added_tokens.push(t),this.model.tokens_to_ids.set(t.content,t.id),this.model.vocab[t.id]=t.content,t.special&&(this.special_tokens.push(t.content),this.all_special_ids.push(t.id)),this.added_tokens_map.set(t.content,t),t.normalized&&this.normalizer!==null){let e=this.normalizer(t.content);a.push(e),this.added_tokens_map.set(e,t)}else i.push(t.content)}(this.config.additional_special_tokens??[]).forEach(e=>{this.special_tokens.includes(e)||this.special_tokens.push(e)}),this.decoder&&(this.decoder.added_tokens=this.added_tokens,this.decoder.end_of_word_suffix=this.model.end_of_word_suffix),this.splitter_unnormalized=new ui(i),this.splitter_normalized=new ui(a),this.remove_space=this.config.remove_space,this.clean_up_tokenization_spaces=this.config.clean_up_tokenization_spaces??!0,this.do_lowercase_and_remove_accent=this.config.do_lowercase_and_remove_accent??!1}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{tokens:i,token_type_ids:a}=this.tokenize_helper(e,{text_pair:t,add_special_tokens:n}),o=i.map(e=>this.added_tokens_map.get(e)?.id??this.model.tokens_to_ids.get(e)??this.model.unk_token_id),s={ids:o,tokens:i,attention_mask:Array(o.length).fill(1)};return r&&a&&(s.token_type_ids=a),s}decode(e,t={}){if(!Array.isArray(e)||e.length===0||!na(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);let n=e.map(e=>this.model.vocab[Number(e)]??this.model.unk_token);t.skip_special_tokens&&(n=n.filter(e=>!this.special_tokens.includes(e)));let r=this.decoder?this.decoder(n):n.join(` `);return this.decoder&&this.decoder.end_of_word_suffix&&(r=r.replaceAll(this.decoder.end_of_word_suffix,` `),t.skip_special_tokens&&(r=r.trim())),(t.clean_up_tokenization_spaces??this.clean_up_tokenization_spaces)&&(r=pi(r)),r}tokenize(e,{text_pair:t=null,add_special_tokens:n=!1}={}){return this.tokenize_helper(e,{text_pair:t,add_special_tokens:n}).tokens}encode_text(e){if(e===null)return null;let t=this.splitter_unnormalized.split(e);return t.forEach((e,n)=>{let r=this.added_tokens_map.get(e);r&&(r.lstrip&&n>0&&(t[n-1]=t[n-1].trimEnd()),r.rstrip&&n{if(e.length===0)return[];if(this.added_tokens_map.has(e))return[e];if(this.remove_space===!0&&(e=e.trim().split(/\s+/).join(` `)),this.do_lowercase_and_remove_accent&&(e=ia(e)),this.normalizer!==null&&(e=this.normalizer(e)),e.length===0)return[];let n=this.splitter_normalized.split(e);return n.forEach((e,t)=>{let r=this.added_tokens_map.get(e);r&&(r.lstrip&&t>0&&(n[t-1]=n[t-1].trimEnd()),r.rstrip&&t{if(e.length===0)return[];if(this.added_tokens_map.has(e))return[e];let n=this.pre_tokenizer===null?[e]:this.pre_tokenizer(e,{section_index:t});return this.model(n)})})}tokenize_helper(e,{text_pair:t=null,add_special_tokens:n=!0}){let r=this.encode_text(e),i=this.encode_text(t||null);return this.post_processor?this.post_processor(r,i,n):{tokens:aa(r??[],i??[])}}token_to_id(e){return this.model.tokens_to_ids.get(e)}id_to_token(e){return this.model.vocab[e]}get_added_tokens_decoder(){let e=/* @__PURE__ */ new Map;for(let t of this.added_tokens)e.set(t.id,t);return e}get_vocab(e=!0){let t=/* @__PURE__ */ new Map;for(let n=0;nt in e?Oo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ao=(e,t,n)=>(ko(e,typeof t==`symbol`?t:t+``,n),n),j=Object.freeze({Text:`Text`,NumericLiteral:`NumericLiteral`,StringLiteral:`StringLiteral`,Identifier:`Identifier`,Equals:`Equals`,OpenParen:`OpenParen`,CloseParen:`CloseParen`,OpenStatement:`OpenStatement`,CloseStatement:`CloseStatement`,OpenExpression:`OpenExpression`,CloseExpression:`CloseExpression`,OpenSquareBracket:`OpenSquareBracket`,CloseSquareBracket:`CloseSquareBracket`,OpenCurlyBracket:`OpenCurlyBracket`,CloseCurlyBracket:`CloseCurlyBracket`,Comma:`Comma`,Dot:`Dot`,Colon:`Colon`,Pipe:`Pipe`,CallOperator:`CallOperator`,AdditiveBinaryOperator:`AdditiveBinaryOperator`,MultiplicativeBinaryOperator:`MultiplicativeBinaryOperator`,ExponentiationBinaryOperator:`ExponentiationBinaryOperator`,ComparisonBinaryOperator:`ComparisonBinaryOperator`,UnaryOperator:`UnaryOperator`,Comment:`Comment`}),jo=class{constructor(e,t){this.value=e,this.type=t}};function Mo(e){return/\w/.test(e)}function No(e){return/[0-9]/.test(e)}function Po(e){return/\s/.test(e)}var Fo=[[`{%`,j.OpenStatement],[`%}`,j.CloseStatement],[`{{`,j.OpenExpression],[`}}`,j.CloseExpression],[`(`,j.OpenParen],[`)`,j.CloseParen],[`{`,j.OpenCurlyBracket],[`}`,j.CloseCurlyBracket],[`[`,j.OpenSquareBracket],[`]`,j.CloseSquareBracket],[`,`,j.Comma],[`.`,j.Dot],[`:`,j.Colon],[`|`,j.Pipe],[`<=`,j.ComparisonBinaryOperator],[`>=`,j.ComparisonBinaryOperator],[`==`,j.ComparisonBinaryOperator],[`!=`,j.ComparisonBinaryOperator],[`<`,j.ComparisonBinaryOperator],[`>`,j.ComparisonBinaryOperator],[`+`,j.AdditiveBinaryOperator],[`-`,j.AdditiveBinaryOperator],[`~`,j.AdditiveBinaryOperator],[`**`,j.ExponentiationBinaryOperator],[`*`,j.MultiplicativeBinaryOperator],[`//`,j.MultiplicativeBinaryOperator],[`/`,j.MultiplicativeBinaryOperator],[`%`,j.MultiplicativeBinaryOperator],[`=`,j.Equals]],Io=/* @__PURE__ */ new Map([[`n`,` -`],[`t`,` `],[`r`,`\r`],[`b`,`\b`],[`f`,`\f`],[`v`,`\v`],[`'`,`'`],[`"`,`"`],[`\\`,`\\`]]);function Lo(e,t={}){return e.endsWith(` -`)&&(e=e.slice(0,-1)),t.lstrip_blocks&&(e=e.replace(/^[ \t]*({[#%-])/gm,`$1`)),t.trim_blocks&&(e=e.replace(/([#%-]})\n/g,`$1`)),e.replace(/(\s*){%(-?)\s*(?:end)?generation\s*(-?)%}(\s*)/gs,(e,t,n,r,i)=>(n?``:t)+(r?``:i))}function Ro(e,t={}){let n=[],r=Lo(e,t),i=0,a=0,o=e=>{let t=``;for(;e(r[i]);){if(r[i]===`\\`){if(++i,i>=r.length)throw SyntaxError(`Unexpected end of input`);let e=r[i++],n=Io.get(e);if(n===void 0)throw SyntaxError(`Unexpected escaped character: ${e}`);t+=n;continue}if(t+=r[i++],i>=r.length)throw SyntaxError(`Unexpected end of input`)}return t},s=()=>{let e=n.at(-1);e&&e.type===j.Text&&(e.value=e.value.trimEnd(),e.value===``&&n.pop())},c=()=>{for(;i0){n.push(new jo(e,j.Text));continue}}if(r[i]===`{`&&r[i+1]===`#`){i+=2;let e=r[i]===`-`;e&&++i;let t=``;for(;r[i]!==`#`||r[i+1]!==`}`;){if(i+2>=r.length)throw SyntaxError(`Missing end of comment tag`);t+=r[i++]}let a=t.endsWith(`-`);a&&(t=t.slice(0,-1)),e&&s(),n.push(new jo(t,j.Comment)),i+=2,a&&c();continue}if(r.slice(i,i+3)===`{%-`){s(),n.push(new jo(`{%`,j.OpenStatement)),i+=3;continue}if(r.slice(i,i+3)===`{{-`){s(),n.push(new jo(`{{`,j.OpenExpression)),a=0,i+=3;continue}if(o(Po),r.slice(i,i+3)===`-%}`){n.push(new jo(`%}`,j.CloseStatement)),i+=3,c();continue}if(r.slice(i,i+3)===`-}}`){n.push(new jo(`}}`,j.CloseExpression)),i+=3,c();continue}let t=r[i];if(t===`-`||t===`+`){let e=n.at(-1)?.type;if(e===j.Text||e===void 0)throw SyntaxError(`Unexpected character: ${t}`);switch(e){case j.Identifier:case j.NumericLiteral:case j.StringLiteral:case j.CloseParen:case j.CloseSquareBracket:break;default:{++i;let e=o(No);if(e.length>0&&r[i]===`.`&&No(r[i+1])){++i;let t=o(No);e=`${e}.${t}`}n.push(new jo(`${t}${e}`,e.length>0?j.NumericLiteral:j.UnaryOperator));continue}}}for(let[e,t]of Fo)if(!(e===`}}`&&a>0)&&r.slice(i,i+e.length)===e){n.push(new jo(e,t)),t===j.OpenExpression?a=0:t===j.OpenCurlyBracket?++a:t===j.CloseCurlyBracket&&--a,i+=e.length;continue main}if(t===`'`||t===`"`){++i;let e=o(e=>e!==t);n.push(new jo(e,j.StringLiteral)),++i;continue}if(No(t)){let e=o(No);if(n.at(-1)?.type!==j.Dot&&r[i]===`.`&&No(r[i+1])){++i;let t=o(No);e=`${e}.${t}`}n.push(new jo(e,j.NumericLiteral));continue}if(Mo(t)){let e=o(Mo);n.push(new jo(e,j.Identifier));continue}throw SyntaxError(`Unexpected character: ${t}`)}return n}var zo=class{type=`Statement`},Bo=class extends zo{constructor(e){super(),this.body=e}type=`Program`},Vo=class extends zo{constructor(e,t,n){super(),this.test=e,this.body=t,this.alternate=n}type=`If`},Ho=class extends zo{constructor(e,t,n,r){super(),this.loopvar=e,this.iterable=t,this.body=n,this.defaultBlock=r}type=`For`},Uo=class extends zo{type=`Break`},Wo=class extends zo{type=`Continue`},Go=class extends zo{constructor(e,t,n){super(),this.assignee=e,this.value=t,this.body=n}type=`Set`},Ko=class extends zo{constructor(e,t,n){super(),this.name=e,this.args=t,this.body=n}type=`Macro`},qo=class extends zo{constructor(e){super(),this.value=e}type=`Comment`},Jo=class extends zo{type=`Expression`},Yo=class extends Jo{constructor(e,t,n){super(),this.object=e,this.property=t,this.computed=n}type=`MemberExpression`},Xo=class extends Jo{constructor(e,t){super(),this.callee=e,this.args=t}type=`CallExpression`},Zo=class extends Jo{constructor(e){super(),this.value=e}type=`Identifier`},Qo=class extends Jo{constructor(e){super(),this.value=e}type=`Literal`},$o=class extends Qo{type=`IntegerLiteral`},es=class extends Qo{type=`FloatLiteral`},ts=class extends Qo{type=`StringLiteral`},ns=class extends Qo{type=`ArrayLiteral`},rs=class extends Qo{type=`TupleLiteral`},is=class extends Qo{type=`ObjectLiteral`},as=class extends Jo{constructor(e,t,n){super(),this.operator=e,this.left=t,this.right=n}type=`BinaryExpression`},os=class extends Jo{constructor(e,t){super(),this.operand=e,this.filter=t}type=`FilterExpression`},ss=class extends zo{constructor(e,t){super(),this.filter=e,this.body=t}type=`FilterStatement`},cs=class extends Jo{constructor(e,t){super(),this.lhs=e,this.test=t}type=`SelectExpression`},ls=class extends Jo{constructor(e,t,n){super(),this.operand=e,this.negate=t,this.test=n}type=`TestExpression`},us=class extends Jo{constructor(e,t){super(),this.operator=e,this.argument=t}type=`UnaryExpression`},ds=class extends Jo{constructor(e=void 0,t=void 0,n=void 0){super(),this.start=e,this.stop=t,this.step=n}type=`SliceExpression`},fs=class extends Jo{constructor(e,t){super(),this.key=e,this.value=t}type=`KeywordArgumentExpression`},ps=class extends Jo{constructor(e){super(),this.argument=e}type=`SpreadExpression`},ms=class extends Jo{constructor(e){super(),this.argument=e}type=`KeywordSpreadExpression`},hs=class extends zo{constructor(e,t,n){super(),this.call=e,this.callerArgs=t,this.body=n}type=`CallStatement`},gs=class extends Jo{constructor(e,t,n){super(),this.condition=e,this.trueExpr=t,this.falseExpr=n}type=`Ternary`};function _s(e){let t=new Bo([]),n=0;function r(t,r){let i=e[n++];if(!i||i.type!==t)throw Error(`Parser Error: ${r}. ${i.type} !== ${t}.`);return i}function i(e){if(!c(e))throw SyntaxError(`Expected ${e}`);++n}function a(){switch(e[n].type){case j.Comment:return new qo(e[n++].value);case j.Text:return l();case j.OpenStatement:return u();case j.OpenExpression:return d();default:throw SyntaxError(`Unexpected token type: ${e[n].type}`)}}function o(...t){return n+t.length<=e.length&&t.every((t,r)=>t===e[n+r].type)}function s(...t){return e[n]?.type===j.OpenStatement&&e[n+1]?.type===j.Identifier&&t.includes(e[n+1]?.value)}function c(...t){return n+t.length<=e.length&&t.every((t,r)=>e[n+r].type===`Identifier`&&t===e[n+r].value)}function l(){return new ts(r(j.Text,`Expected text token`).value)}function u(){if(r(j.OpenStatement,`Expected opening statement token`),e[n].type!==j.Identifier)throw SyntaxError(`Unknown statement, got ${e[n].type}`);let t=e[n].value,c;switch(t){case`set`:++n,c=f();break;case`if`:++n,c=p(),r(j.OpenStatement,`Expected {% token`),i(`endif`),r(j.CloseStatement,`Expected %} token`);break;case`macro`:++n,c=m(),r(j.OpenStatement,`Expected {% token`),i(`endmacro`),r(j.CloseStatement,`Expected %} token`);break;case`for`:++n,c=g(),r(j.OpenStatement,`Expected {% token`),i(`endfor`),r(j.CloseStatement,`Expected %} token`);break;case`call`:{++n;let e=null;o(j.OpenParen)&&(e=te(`parameters`));let t=ue();if(t.type!==`Identifier`)throw SyntaxError(`Expected identifier following call statement`);let l=te(`call`);r(j.CloseStatement,`Expected closing statement token`);let u=[];for(;!s(`endcall`);)u.push(a());r(j.OpenStatement,`Expected '{%'`),i(`endcall`),r(j.CloseStatement,`Expected closing statement token`),c=new hs(new Xo(t,l),e,u);break}case`break`:++n,r(j.CloseStatement,`Expected closing statement token`),c=new Uo;break;case`continue`:++n,r(j.CloseStatement,`Expected closing statement token`),c=new Wo;break;case`filter`:{++n;let e=ue();e instanceof Zo&&o(j.OpenParen)&&(e=w(e)),r(j.CloseStatement,`Expected closing statement token`);let t=[];for(;!s(`endfilter`);)t.push(a());r(j.OpenStatement,`Expected '{%'`),i(`endfilter`),r(j.CloseStatement,`Expected '%}'`),c=new ss(e,t);break}default:throw SyntaxError(`Unknown statement type: ${t}`)}return c}function d(){r(j.OpenExpression,`Expected opening expression token`);let e=_();return r(j.CloseExpression,`Expected closing expression token`),e}function f(){let e=h(),t=null,c=[];if(o(j.Equals))++n,t=h();else{for(r(j.CloseStatement,`Expected %} token`);!s(`endset`);)c.push(a());r(j.OpenStatement,`Expected {% token`),i(`endset`)}return r(j.CloseStatement,`Expected closing statement token`),new Go(e,t,c)}function p(){let e=_();r(j.CloseStatement,`Expected closing statement token`);let t=[],i=[];for(;!s(`elif`,`else`,`endif`);)t.push(a());if(s(`elif`)){++n,++n;let e=p();i.push(e)}else if(s(`else`))for(++n,++n,r(j.CloseStatement,`Expected closing statement token`);!s(`endif`);)i.push(a());return new Vo(e,t,i)}function m(){let e=ue();if(e.type!==`Identifier`)throw SyntaxError(`Expected identifier following macro statement`);let t=te(`parameters`);r(j.CloseStatement,`Expected closing statement token`);let n=[];for(;!s(`endmacro`);)n.push(a());return new Ko(e,t,n)}function h(e=!1){let t=e?ue:_,r=[t()],i=o(j.Comma);for(;i&&(++n,r.push(t()),o(j.Comma)););return i?new rs(r):r[0]}function g(){let e=h(!0);if(!(e instanceof Zo||e instanceof rs))throw SyntaxError(`Expected identifier/tuple for the loop variable, got ${e.type} instead`);if(!c(`in`))throw SyntaxError("Expected `in` keyword following loop variable");++n;let t=_();r(j.CloseStatement,`Expected closing statement token`);let i=[];for(;!s(`endfor`,`else`);)i.push(a());let o=[];if(s(`else`))for(++n,++n,r(j.CloseStatement,`Expected closing statement token`);!s(`endfor`);)o.push(a());return new Ho(e,t,i,o)}function _(){return v()}function v(){let e=y();if(c(`if`)){++n;let t=y();return c(`else`)?(++n,new gs(t,e,v())):new cs(e,t)}return e}function y(){let t=b();for(;c(`or`);){let r=e[n];++n;let i=b();t=new as(r,t,i)}return t}function b(){let t=x();for(;c(`and`);){let r=e[n];++n;let i=x();t=new as(r,t,i)}return t}function x(){let t;for(;c(`not`);){let r=e[n];++n,t=new us(r,x())}return t??S()}function S(){let t=C();for(;;){let r;if(c(`not`,`in`))r=new jo(`not in`,j.Identifier),n+=2;else if(c(`in`))r=e[n++];else if(o(j.ComparisonBinaryOperator))r=e[n++];else break;let i=C();t=new as(r,t,i)}return t}function C(){let t=ae();for(;o(j.AdditiveBinaryOperator);){let r=e[n];++n;let i=ae();t=new as(r,t,i)}return t}function ee(){let e=ie(ue());return o(j.OpenParen)?w(e):e}function w(e){let t=new Xo(e,te(`call`));return t=ie(t),o(j.OpenParen)&&(t=w(t)),t}function te(e){r(j.OpenParen,`Expected opening parenthesis for arguments list`);let t=ne(e);return r(j.CloseParen,`Expected closing parenthesis for arguments list`),t}function ne(t){let r=[],i=/* @__PURE__ */ new Set,a=!1,s=!1;for(;!o(j.CloseParen);){let c=o(j.ExponentiationBinaryOperator),l=o(j.MultiplicativeBinaryOperator)&&e[n].value===`*`;if(t===`parameters`&&(c||l))throw SyntaxError(`Argument unpacking is not allowed in parameter declarations`);if(c){if(++n,r.push(new ms(_())),o(j.Comma)&&++n,!o(j.CloseParen))throw SyntaxError("Expected closing parenthesis: `**` must be applied to the final argument");break}let u;if(l){if(s)throw SyntaxError("Only one `*` argument unpacking is allowed");s=!0,++n,u=new ps(_())}else{if(u=_(),o(j.Equals)){if(++n,!(u instanceof Zo))throw SyntaxError(t===`parameters`?`Expected identifier for parameter declaration`:`Expected identifier for keyword argument`);let e=_();u=new fs(u,e)}if(t===`parameters`){if(!(u instanceof Zo||u instanceof fs))throw SyntaxError(`Expected identifier for parameter declaration`);let e=u instanceof Zo?u.value:u.key.value;if(i.has(e))throw SyntaxError(`Duplicate parameter name: ${e}`);i.add(e)}if(u instanceof fs)a=!0;else if(a)throw SyntaxError(t===`call`?`Positional arguments must come before keyword arguments`:`Non-default argument follows default argument`);else if(s)throw SyntaxError("Positional arguments must not follow `*` argument unpacking")}r.push(u),o(j.Comma)&&++n}return r}function re(){let e=[],t=!1;for(;!o(j.CloseSquareBracket);)o(j.Colon)?(e.push(void 0),++n,t=!0):(e.push(_()),o(j.Colon)&&(++n,t=!0));if(e.length===0)throw SyntaxError(`Expected at least one argument for member/slice expression`);if(t){if(e.length>3)throw SyntaxError(`Expected 0-3 arguments for slice expression`);return new ds(...e)}return e[0]}function ie(t){for(;o(j.Dot)||o(j.OpenSquareBracket);){let i=e[n];++n;let a,o=i.type===j.OpenSquareBracket;if(o)a=re(),r(j.CloseSquareBracket,`Expected closing square bracket`);else if(a=ue(),a.type!==`Identifier`&&a.type!==`IntegerLiteral`)throw SyntaxError(`Expected identifier or integer following dot operator`);t=new Yo(t,a,o)}return t}function ae(){let t=oe();for(;o(j.MultiplicativeBinaryOperator);){let r=e[n++],i=oe();t=new as(r,t,i)}return t}function oe(){let t=se();for(;o(j.ExponentiationBinaryOperator);){let r=e[n++],i=se();t=new as(r,t,i)}return t}function se(){let e=ce();for(;c(`is`);){++n;let t=c(`not`);t&&++n;let r=ue();if(!(r instanceof Zo))throw SyntaxError(`Expected identifier for the test`);e=new ls(e,t,r)}return e}function ce(){let e=le();for(;o(j.Pipe);){++n;let t=ue();if(!(t instanceof Zo))throw SyntaxError(`Expected identifier for the filter`);o(j.OpenParen)&&(t=w(t)),e=new os(e,t)}return e}function le(){let t=e[n];if(t&&(t.type===j.UnaryOperator||t.type===j.AdditiveBinaryOperator)&&(t.value===`-`||t.value===`+`)){let t=e[n++];return new us(t,le())}return ee()}function ue(){let t=e[n++];switch(t.type){case j.NumericLiteral:{let e=t.value;return e.includes(`.`)?new es(Number(e)):new $o(Number(e))}case j.StringLiteral:{let r=t.value;for(;o(j.StringLiteral);)r+=e[n++].value;return new ts(r)}case j.Identifier:return new Zo(t.value);case j.OpenParen:{let e=h();return r(j.CloseParen,"Expected closing parenthesis, got ${tokens[current].type} instead."),e}case j.OpenSquareBracket:{let e=[];for(;!o(j.CloseSquareBracket);)e.push(_()),o(j.Comma)&&++n;return++n,new ns(e)}case j.OpenCurlyBracket:{let e=/* @__PURE__ */ new Map;for(;!o(j.CloseCurlyBracket);){let t=_();r(j.Colon,`Expected colon between key and value in object literal`);let i=_();e.set(t,i),o(j.Comma)&&++n}return++n,new is(e)}default:throw SyntaxError(`Unexpected token: ${t.type}`)}}for(;n0)for(let i=e;it;i+=n)r.push(i);return r}function ys(e,t,n,r=1){let i=Math.sign(r);i>=0?(t=(t??=0)<0?Math.max(e.length+t,0):Math.min(t,e.length),n=(n??=e.length)<0?Math.max(e.length+n,0):Math.min(n,e.length)):(t=(t??=e.length-1)<0?Math.max(e.length+t,-1):Math.min(t,e.length-1),n=(n??=-1)<-1?Math.max(e.length+n,-1):Math.min(n,e.length-1));let a=[];for(let o=t;i*oe.toUpperCase())}function xs(e){return Ss(/* @__PURE__ */ new Date,e)}function Ss(e,t){let n=new Intl.DateTimeFormat(void 0,{month:`long`}),r=new Intl.DateTimeFormat(void 0,{month:`short`}),i=e=>e<10?`0`+e:e.toString();return t.replace(/%[YmdbBHM%]/g,t=>{switch(t){case`%Y`:return e.getFullYear().toString();case`%m`:return i(e.getMonth()+1);case`%d`:return i(e.getDate());case`%b`:return r.format(e);case`%B`:return n.format(e);case`%H`:return i(e.getHours());case`%M`:return i(e.getMinutes());case`%%`:return`%`;default:return t}})}function Cs(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ws(e,t,n,r){if(r===0)return e;let i=r==null||r<0?1/0:r,a=t.length===0?/* @__PURE__ */ RegExp(`(?=)`,`gu`):new RegExp(Cs(t),`gu`);return e.replaceAll(a,e=>i>0?(--i,n):e)}var Ts=class extends Error{},Es=class extends Error{},Ds=/* @__PURE__ */ new Map,Os=class{type=`RuntimeValue`;value;get builtins(){return Ds}constructor(e=void 0){this.value=e}__bool__(){return new F(!!this.value)}toString(){return String(this.value)}},M=class extends Os{type=`IntegerValue`},N=class extends Os{type=`FloatValue`;toString(){return Object.is(this.value,-0)?`-0.0`:this.value%1==0?this.value.toFixed(1):this.value.toString()}},P=class extends Os{type=`StringValue`;_builtins;get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`upper`,new L(()=>new P(this.value.toUpperCase()))],[`lower`,new L(()=>new P(this.value.toLowerCase()))],[`strip`,new L(()=>new P(this.value.trim()))],[`title`,new L(()=>new P(bs(this.value)))],[`capitalize`,new L(()=>new P(this.value.charAt(0).toUpperCase()+this.value.slice(1)))],[`length`,new M(this.value.length)],[`rstrip`,new L(()=>new P(this.value.trimEnd()))],[`lstrip`,new L(()=>new P(this.value.trimStart()))],[`startswith`,new L(e=>{if(e.length===0)throw Error(`startswith() requires at least one argument`);let t=e[0];if(t instanceof P)return new F(this.value.startsWith(t.value));if(t instanceof I){for(let e of t.value){if(!(e instanceof P))throw Error(`startswith() tuple elements must be strings`);if(this.value.startsWith(e.value))return new F(!0)}return new F(!1)}throw Error(`startswith() argument must be a string or tuple of strings`)})],[`endswith`,new L(e=>{if(e.length===0)throw Error(`endswith() requires at least one argument`);let t=e[0];if(t instanceof P)return new F(this.value.endsWith(t.value));if(t instanceof I){for(let e of t.value){if(!(e instanceof P))throw Error(`endswith() tuple elements must be strings`);if(this.value.endsWith(e.value))return new F(!0)}return new F(!1)}throw Error(`endswith() argument must be a string or tuple of strings`)})],[`split`,new L(e=>{let t=e[0]??new R;if(!(t instanceof P||t instanceof R))throw Error(`sep argument must be a string or null`);let n=e[1]??new M(-1);if(!(n instanceof M))throw Error(`maxsplit argument must be a number`);let r=[];if(t instanceof R){let e=this.value.trimStart();for(let{0:t,index:i}of e.matchAll(/\S+/g)){if(n.value!==-1&&r.length>=n.value&&i!==void 0){r.push(t+e.slice(i+t.length));break}r.push(t)}}else{if(t.value===``)throw Error(`empty separator`);r=this.value.split(t.value),n.value!==-1&&r.length>n.value&&r.push(r.splice(n.value).join(t.value))}return new I(r.map(e=>new P(e)))})],[`replace`,new L(e=>{if(e.length<2)throw Error(`replace() requires at least two arguments`);let t=e[0],n=e[1];if(!(t instanceof P&&n instanceof P))throw Error(`replace() arguments must be strings`);let r;if(r=e.length>2?e[2].type===`KeywordArgumentsValue`?e[2].value.get(`count`)??new R:e[2]:new R,!(r instanceof M||r instanceof R))throw Error(`replace() count argument must be a number or null`);return new P(ws(this.value,t.value,n.value,r.value))})]])}},F=class extends Os{type=`BooleanValue`},ks=/[\x7f-\uffff]/g;function As(e){return e.replace(ks,e=>`\\u`+e.charCodeAt(0).toString(16).padStart(4,`0`))}function js(e,t={},n=0,r=!0){let{indent:i=null,ensureAscii:a=!1,separators:o=null,sortKeys:s=!1}=t,c,l;switch(o?[c,l]=o:i?(c=`,`,l=`: `):(c=`, `,l=`: `),e.type){case`NullValue`:return`null`;case`UndefinedValue`:return r?`null`:`undefined`;case`IntegerValue`:case`FloatValue`:case`BooleanValue`:return JSON.stringify(e.value);case`StringValue`:{let t=JSON.stringify(e.value);return a&&(t=As(t)),t}case`ArrayValue`:case`NamespaceValue`:case`ObjectValue`:{let o=i?` `.repeat(i):``,u=` -`+o.repeat(n),d=u+o;if(e.type===`ArrayValue`){let a=e.value.map(e=>js(e,t,n+1,r));return i?`[${d}${a.join(`${c}${d}`)}${u}]`:`[${a.join(c)}]`}{let o=Array.from(e.value.entries());s&&(o=o.sort(([e],[t])=>e.localeCompare(t)));let f=o.map(([e,o])=>{let s=JSON.stringify(e);a&&(s=As(s));let c=`${s}${l}${js(o,t,n+1,r)}`;return i?`${d}${c}`:c});return i?`{${f.join(c)}${u}}`:`{${f.join(c)}}`}}default:throw Error(`Cannot convert to JSON: ${e.type}`)}}var Ms=class extends Os{type=`ObjectValue`;_builtins;__bool__(){return new F(this.value.size>0)}get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`get`,new L(([e,t])=>{if(!(e instanceof P))throw Error(`Object key must be a string: got ${e.type}`);return this.value.get(e.value)??t??new R})],[`items`,new L(()=>this.items())],[`keys`,new L(()=>this.keys())],[`values`,new L(()=>this.values())],[`dictsort`,new L(e=>{let t=/* @__PURE__ */ new Map,n=e.filter(e=>e instanceof Ns?(t=e.value,!1):!0),r=n.at(0)??t.get(`case_sensitive`)??new F(!1);if(!(r instanceof F))throw Error(`case_sensitive must be a boolean`);let i=n.at(1)??t.get(`by`)??new P(`key`);if(!(i instanceof P))throw Error(`by must be a string`);if(![`key`,`value`].includes(i.value))throw Error(`by must be either 'key' or 'value'`);let a=n.at(2)??t.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);return new I(Array.from(this.value.entries()).map(([e,t])=>new I([new P(e),t])).sort((e,t)=>{let n=i.value===`key`?0:1,o=e.value[n],s=t.value[n],c=Ws(o,s,r.value);return a.value?-c:c}))})]])}items(){return new I(Array.from(this.value.entries()).map(([e,t])=>new I([new P(e),t])))}keys(){return new I(Array.from(this.value.keys()).map(e=>new P(e)))}values(){return new I(Array.from(this.value.values()))}toString(){return js(this,{},0,!1)}},Ns=class extends Ms{type=`KeywordArgumentsValue`},Ps=class extends Os{type=`NamespaceValue`;toString(){return js(this,{},0,!1)}},I=class extends Os{type=`ArrayValue`;_builtins;get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`length`,new M(this.value.length)]])}__bool__(){return new F(this.value.length>0)}toString(){return js(this,{},0,!1)}},Fs=class extends I{type=`TupleValue`},L=class extends Os{type=`FunctionValue`},R=class extends Os{type=`NullValue`},z=class extends Os{type=`UndefinedValue`};function Is(e){let t;if(e instanceof I?t=e.value:e instanceof P&&(t=Array.from(e.value,e=>new P(e))),!t||t.length!==2)throw Error(`namespace expected an object or an iterable of [key, value] pairs`);let[n,r]=t;if(!(n instanceof P))throw Error(`namespace keys must be strings`);return[n,r]}var Ls=class{constructor(e){this.parent=e}variables=/* @__PURE__ */ new Map([[`namespace`,new L(e=>{let t=e.slice(),n;if(t.at(-1)instanceof Ns&&(n=t.pop()),t.length>1)throw Error(`namespace expected at most 1 argument, got ${t.length}`);let r=/* @__PURE__ */ new Map;if(t.length===1){let e=t[0];if(e instanceof Ms)for(let[t,n]of e.value)r.set(t,n);else if(e instanceof I)for(let t of e.value){let[e,n]=Is(t);r.set(e.value,n)}else throw Error(`'${e.type}' object is not iterable`)}if(n)for(let[e,t]of n.value)r.set(e,t);return new Ps(r)})]]);tests=Ls.TESTS;set(e,t){return this.declareVariable(e,Ys(t))}declareVariable(e,t){if(this.variables.has(e))throw SyntaxError(`Variable already declared: ${e}`);return this.variables.set(e,t),t}setVariable(e,t){return this.variables.set(e,t),t}resolve(e){if(this.variables.has(e))return this;if(this.parent)return this.parent.resolve(e);throw Error(`Unknown variable: ${e}`)}lookupVariable(e){try{return this.resolve(e).variables.get(e)??new z}catch{return new z}}},Rs=Ls;Ao(Rs,`TESTS`,/* @__PURE__ */ new Map([[`boolean`,e=>e.type===`BooleanValue`],[`callable`,e=>e instanceof L],[`odd`,e=>{if(!(e instanceof M))throw Error(`cannot odd on ${e.type}`);return e.value%2!=0}],[`even`,e=>{if(!(e instanceof M))throw Error(`cannot even on ${e.type}`);return e.value%2==0}],[`false`,e=>e.type===`BooleanValue`&&!e.value],[`true`,e=>e.type===`BooleanValue`&&e.value],[`none`,e=>e.type===`NullValue`],[`string`,e=>e.type===`StringValue`],[`number`,e=>e instanceof M||e instanceof N],[`integer`,e=>e instanceof M],[`iterable`,e=>e.type===`ArrayValue`||e.type===`StringValue`],[`mapping`,e=>e instanceof Ms],[`sequence`,e=>e instanceof I||e instanceof Ms||e instanceof P],[`lower`,e=>{let t=e.value;return e.type===`StringValue`&&t===t.toLowerCase()}],[`upper`,e=>{let t=e.value;return e.type===`StringValue`&&t===t.toUpperCase()}],[`none`,e=>e.type===`NullValue`],[`defined`,e=>e.type!==`UndefinedValue`],[`undefined`,e=>e.type===`UndefinedValue`],[`equalto`,(e,t)=>e.value===t.value],[`eq`,(e,t)=>e.value===t.value]]));function zs(e){e.set(`false`,!1),e.set(`true`,!0),e.set(`none`,null),e.set(`raise_exception`,e=>{throw Error(e)}),e.set(`range`,vs),e.set(`strftime_now`,xs),e.set(`True`,!0),e.set(`False`,!1),e.set(`None`,null)}function Bs(e){return e instanceof Ms||e instanceof Ps}function Vs(e){return e instanceof M||e instanceof N||e instanceof F}function Hs(e){return e instanceof F?Number(e.value):e.value}function Us(e,t){let n=t.split(`.`),r=e;for(let e of n)if(Bs(r))r=r.value.get(e)??new z;else if(r instanceof I){let t=parseInt(e,10);if(!isNaN(t)&&t>=0&&tr)}if(e.type!==t.type)throw Error(`Cannot compare different types: ${e.type} and ${t.type}`);switch(e.type){case`StringValue`:{let r=e.value,i=t.value;return n||(r=r.toLowerCase(),i=i.toLowerCase()),ri)}default:throw Error(`Cannot compare type: ${e.type}`)}}function Gs(e){if(e.type===`Identifier`)return{name:e.value};let t=e;return{name:t.key.value,defaultValue:t.value}}function Ks(e){return e===`kwargs`||e===`varargs`}function qs(e,t){let n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set,i=e=>{Ks(e)&&n.add(e)},a=e=>{if(e.type===`Identifier`)i(e.value);else if(e.type===`TupleLiteral`)for(let t of e.value)a(t)},o=e=>{i(Gs(e).name)},s=e=>{for(let t of e){let e=Gs(t);e.defaultValue&&l(e.defaultValue)}},c=e=>{e.type===`CallExpression`&&l(e.args)},l=e=>{if(Array.isArray(e)){for(let t of e)l(t);return}if(e instanceof Map){for(let[t,n]of e)l(t),l(n);return}if(e instanceof zo)switch(e.type){case`For`:{let t=e;if(a(t.loopvar),t.iterable.type===`SelectExpression`){let e=t.iterable;l(e.lhs),l(t.body),l(t.defaultBlock),l(e.test);return}l(t.iterable),l(t.body),l(t.defaultBlock);return}case`Set`:{let t=e;a(t.assignee),l(t.value),l(t.body);return}case`Macro`:{let t=e;for(let e of t.args)o(e);s(t.args),l(t.body);return}case`CallStatement`:{let t=e;l(t.call);for(let e of t.callerArgs??[])o(e);s(t.callerArgs??[]),l(t.body);return}case`FilterStatement`:{let t=e;l(t.body),c(t.filter);return}case`Identifier`:{let t=e.value;Ks(t)&&!n.has(t)&&r.add(t);return}case`MemberExpression`:{let t=e;l(t.object),t.computed&&l(t.property);return}case`FilterExpression`:{let t=e;l(t.operand),c(t.filter);return}case`TestExpression`:l(e.operand);return;case`SelectExpression`:{let t=e;l(t.test),l(t.lhs);return}case`KeywordArgumentExpression`:l(e.value);return;default:for(let t of Object.values(e))l(t)}};for(let t of e)o(t);return l(t),r}var Js=class{global;constructor(e){this.global=e??new Rs}run(e){return this.evaluate(e,this.global)}evaluateBinaryExpression(e,t){let n=this.evaluate(e.left,t);switch(e.operator.value){case`and`:return n.__bool__().value?this.evaluate(e.right,t):n;case`or`:return n.__bool__().value?n:this.evaluate(e.right,t)}let r=this.evaluate(e.right,t);switch(e.operator.value){case`==`:return new F(n.value==r.value);case`!=`:return new F(n.value!=r.value)}if(n instanceof z||r instanceof z){if(r instanceof z&&[`in`,`not in`].includes(e.operator.value))return new F(e.operator.value===`not in`);throw Error(`Cannot perform operation ${e.operator.value} on undefined values`)}if(n instanceof R||r instanceof R)throw Error(`Cannot perform operation on null values`);if(e.operator.value===`~`)return new P(n.value.toString()+r.value.toString());if(e.operator.value===`**`&&Vs(n)&&Vs(r)){let e=Hs(n),t=Hs(r);if(e===0&&t<0)throw Error(`0.0 cannot be raised to a negative power`);let i=e**t;if(!Number.isFinite(i))throw Error(`Exponentiation result is not a finite real number`);return n instanceof N||r instanceof N||t<0?new N(i):new M(i)}if((n instanceof M||n instanceof N)&&(r instanceof M||r instanceof N)){let t=n.value,i=r.value;switch(e.operator.value){case`+`:case`-`:case`*`:{let a=e.operator.value===`+`?t+i:e.operator.value===`-`?t-i:t*i;return n instanceof N||r instanceof N?new N(a):new M(a)}case`/`:return new N(t/i);case`//`:{let e=Math.floor(t/i);return n instanceof N||r instanceof N?new N(e):new M(e)}case`%`:{let e=t%i;return n instanceof N||r instanceof N?new N(e):new M(e)}case`<`:return new F(t`:return new F(t>i);case`>=`:return new F(t>=i);case`<=`:return new F(t<=i)}}else if(n instanceof I&&r instanceof I)switch(e.operator.value){case`+`:return new I(n.value.concat(r.value))}else if(r instanceof I){let t=r.value.find(e=>e.value===n.value)!==void 0;switch(e.operator.value){case`in`:return new F(t);case`not in`:return new F(!t)}}if(n instanceof P||r instanceof P)switch(e.operator.value){case`+`:return new P(n.value.toString()+r.value.toString())}if(n instanceof P&&r instanceof P)switch(e.operator.value){case`in`:return new F(r.value.includes(n.value));case`not in`:return new F(!r.value.includes(n.value))}if(n instanceof P&&r instanceof Ms)switch(e.operator.value){case`in`:return new F(r.value.has(n.value));case`not in`:return new F(!r.value.has(n.value))}throw SyntaxError(`Unknown operator "${e.operator.value}" between ${n.type} and ${r.type}`)}evaluateArguments(e,t){let n=[],r=/* @__PURE__ */ new Map,i=(e,t)=>{if(r.has(e))throw Error(`Got multiple values for keyword argument '${e}'`);r.set(e,t)};for(let r of e)if(r.type===`SpreadExpression`){let e=r,i=this.evaluate(e.argument,t);if(!(i instanceof I))throw Error(`Cannot unpack non-iterable type: ${i.type}`);for(let e of i.value)n.push(e)}else r.type!==`KeywordArgumentExpression`&&r.type!==`KeywordSpreadExpression`&&n.push(this.evaluate(r,t));for(let n of e)if(n.type===`KeywordArgumentExpression`){let e=n;i(e.key.value,this.evaluate(e.value,t))}else if(n.type===`KeywordSpreadExpression`){let e=n,r=this.evaluate(e.argument,t);if(!(r instanceof Ms))throw Error(`Argument after ** must be a mapping, not ${r.type}`);for(let[e,t]of r.value)i(e,t)}return[n,r]}applyFilter(e,t,n){if(t.type===`Identifier`){let r=t;if(r.value===`safe`)return e;if(r.value===`tojson`)return new P(js(e,{}));if(e instanceof I)switch(r.value){case`list`:return e;case`first`:return e.value[0];case`last`:return e.value[e.value.length-1];case`length`:return new M(e.value.length);case`reverse`:return new I(e.value.slice().reverse());case`sort`:return new I(e.value.slice().sort((e,t)=>Ws(e,t,!1)));case`join`:return new P(e.value.map(e=>e.value).join(``));case`string`:return new P(js(e,{},0,!1));case`unique`:{let t=/* @__PURE__ */ new Set,n=[];for(let r of e.value)t.has(r.value)||(t.add(r.value),n.push(r));return new I(n)}default:throw Error(`Unknown ArrayValue filter: ${r.value}`)}else if(e instanceof P)switch(r.value){case`length`:case`upper`:case`lower`:case`title`:case`capitalize`:{let t=e.builtins.get(r.value);if(t instanceof L)return t.value([],n);if(t instanceof M)return t;throw Error(`Unknown StringValue filter: ${r.value}`)}case`trim`:return new P(e.value.trim());case`indent`:return new P(e.value.split(` -`).map((e,t)=>t===0||e.length===0?e:` `+e).join(` -`));case`join`:case`string`:return e;case`int`:{let t=parseInt(e.value,10);return new M(isNaN(t)?0:t)}case`float`:{let t=parseFloat(e.value);return new N(isNaN(t)?0:t)}default:throw Error(`Unknown StringValue filter: ${r.value}`)}else if(e instanceof M||e instanceof N)switch(r.value){case`abs`:return e instanceof M?new M(Math.abs(e.value)):new N(Math.abs(e.value));case`int`:return new M(Math.floor(e.value));case`float`:return new N(e.value);case`string`:return new P(e.toString());default:throw Error(`Unknown NumericValue filter: ${r.value}`)}else if(e instanceof Ms)switch(r.value){case`items`:return new I(Array.from(e.value.entries()).map(([e,t])=>new I([new P(e),t])));case`length`:return new M(e.value.size);default:{let t=e.builtins.get(r.value);if(t)return t instanceof L?t.value([],n):t;throw Error(`Unknown ObjectValue filter: ${r.value}`)}}else if(e instanceof F)switch(r.value){case`bool`:return new F(e.value);case`int`:return new M(+!!e.value);case`float`:return new N(+!!e.value);case`string`:return new P(e.value?`true`:`false`);default:throw Error(`Unknown BooleanValue filter: ${r.value}`)}throw Error(`Cannot apply filter "${r.value}" to type: ${e.type}`)}if(t.type===`CallExpression`){let r=t;if(r.callee.type!==`Identifier`)throw Error(`Unknown filter: ${r.callee.type}`);let i=r.callee.value;if(i===`tojson`){let[,t]=this.evaluateArguments(r.args,n),i=t.get(`indent`)??new R;if(!(i instanceof M||i instanceof R))throw Error(`If set, indent must be a number`);let a=t.get(`ensure_ascii`)??new F(!1);if(!(a instanceof F))throw Error(`If set, ensure_ascii must be a boolean`);let o=t.get(`sort_keys`)??new F(!1);if(!(o instanceof F))throw Error(`If set, sort_keys must be a boolean`);let s=t.get(`separators`)??new R,c=null;if(s instanceof I||s instanceof Fs){if(s.value.length!==2)throw Error(`separators must be a tuple of two strings`);let[e,t]=s.value;if(!(e instanceof P)||!(t instanceof P))throw Error(`separators must be a tuple of two strings`);c=[e.value,t.value]}else if(!(s instanceof R))throw Error(`If set, separators must be a tuple of two strings`);return new P(js(e,{indent:i.value,ensureAscii:a.value,sortKeys:o.value,separators:c}))}if(i===`join`){let t;if(e instanceof P)t=Array.from(e.value);else if(e instanceof I)t=e.value.map(e=>e.value);else throw Error(`Cannot apply filter "${i}" to type: ${e.type}`);let[a,o]=this.evaluateArguments(r.args,n),s=a.at(0)??o.get(`separator`)??new P(``);if(!(s instanceof P))throw Error(`separator must be a string`);return new P(t.join(s.value))}if(i===`int`||i===`float`){let[t,a]=this.evaluateArguments(r.args,n),o=t.at(0)??a.get(`default`)??(i===`int`?new M(0):new N(0));if(e instanceof P){let t=i===`int`?parseInt(e.value,10):parseFloat(e.value);return isNaN(t)?o:i===`int`?new M(t):new N(t)}if(e instanceof M||e instanceof N)return e;if(e instanceof F)return i===`int`?new M(+!!e.value):new N(+!!e.value);throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}if(i==="default"){let[t,i]=this.evaluateArguments(r.args,n),a=t[0]??new P(``),o=t[1]??i.get(`boolean`)??new F(!1);if(!(o instanceof F))throw Error("`default` filter flag must be a boolean");return e instanceof z||o.value&&!e.__bool__().value?a:e}if(e instanceof I){switch(i){case`sort`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);let o=t.at(1)??i.get(`case_sensitive`)??new F(!1);if(!(o instanceof F))throw Error(`case_sensitive must be a boolean`);let s=t.at(2)??i.get(`attribute`)??new R;if(!(s instanceof P||s instanceof M||s instanceof R))throw Error(`attribute must be a string, integer, or null`);let c=e=>s instanceof R?e:Us(e,s instanceof M?String(s.value):s.value);return new I(e.value.slice().sort((e,t)=>{let n=Ws(c(e),c(t),o.value);return a.value?-n:n}))}case`selectattr`:case`rejectattr`:{let t=i===`selectattr`;if(e.value.some(e=>!Bs(e)))throw Error(`\`${i}\` can only be applied to array of objects`);if(r.args.some(e=>e.type!==`StringLiteral`))throw Error(`arguments of \`${i}\` must be strings`);let[a,o,s]=r.args.map(e=>this.evaluate(e,n)),c;if(o){let e=n.tests.get(o.value);if(!e)throw Error(`Unknown test: ${o.value}`);c=e}else c=(...e)=>e[0].__bool__().value;return new I(e.value.filter(e=>{let n=e.value.get(a.value),r=n?c(n,s):!1;return t?r:!r}))}case`map`:{let[,t]=this.evaluateArguments(r.args,n);if(t.has(`attribute`)){let n=t.get(`attribute`);if(!(n instanceof P))throw Error(`attribute must be a string`);let r=t.get(`default`);return new I(e.value.map(e=>{if(!Bs(e))throw Error(`items in map must be an object`);let t=Us(e,n.value);return t instanceof z?r??new z:t}))}throw Error("`map` expressions without `attribute` set are not currently supported.")}}throw Error(`Unknown ArrayValue filter: ${i}`)}if(e instanceof P){switch(i){case`indent`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`width`)??new M(4);if(!(a instanceof M))throw Error(`width must be a number`);let o=t.at(1)??i.get(`first`)??new F(!1),s=t.at(2)??i.get(`blank`)??new F(!1),c=e.value.split(` -`),l=` `.repeat(a.value);return new P(c.map((e,t)=>!o.value&&t===0||!s.value&&e.length===0?e:l+e).join(` -`))}case`replace`:{let t=e.builtins.get(`replace`);if(!(t instanceof L))throw Error(`replace filter not available`);let[i,a]=this.evaluateArguments(r.args,n);return t.value([...i,new Ns(a)],n)}}throw Error(`Unknown StringValue filter: ${i}`)}if(e instanceof Ms){let t=e.builtins.get(i);if(t&&t instanceof L){let[e,i]=this.evaluateArguments(r.args,n);return i.size>0&&e.push(new Ns(i)),t.value(e,n)}throw Error(`Unknown ObjectValue filter: ${i}`)}throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}throw Error(`Unknown filter: ${t.type}`)}evaluateFilterExpression(e,t){let n=this.evaluate(e.operand,t);return this.applyFilter(n,e.filter,t)}evaluateTestExpression(e,t){let n=this.evaluate(e.operand,t),r=t.tests.get(e.test.value);if(!r)throw Error(`Unknown test: ${e.test.value}`);let i=r(n);return new F(e.negate?!i:i)}evaluateSelectExpression(e,t){return this.evaluate(e.test,t).__bool__().value?this.evaluate(e.lhs,t):new z}evaluateUnaryExpression(e,t){let n=this.evaluate(e.argument,t);switch(e.operator.value){case`not`:return new F(!n.value);case`+`:case`-`:{let t=e.operator.value===`-`?-1:1;if(n instanceof M||n instanceof N||n instanceof F){let e=t*(n instanceof F?+!!n.value:n.value);return n instanceof N?new N(e):new M(e)}throw SyntaxError(`Unknown operator "${e.operator.value}" for ${n.type}`)}default:throw SyntaxError(`Unknown operator: ${e.operator.value}`)}}evaluateTernaryExpression(e,t){return this.evaluate(e.condition,t).__bool__().value?this.evaluate(e.trueExpr,t):this.evaluate(e.falseExpr,t)}evalProgram(e,t){return this.evaluateBlock(e.body,t)}evaluateBlock(e,t){let n=``;for(let r of e){let e=this.evaluate(r,t);e.type!==`NullValue`&&e.type!==`UndefinedValue`&&(n+=e.toString())}return new P(n)}evaluateIdentifier(e,t){return t.lookupVariable(e.value)}evaluateCallExpression(e,t){let[n,r]=this.evaluateArguments(e.args,t);r.size>0&&n.push(new Ns(r));let i=this.evaluate(e.callee,t);if(i.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${i.type}`);return i.value(n,t)}evaluateSliceExpression(e,t,n){if(!(e instanceof I||e instanceof P))throw Error(`Slice object must be an array or string`);let r=this.evaluate(t.start,n),i=this.evaluate(t.stop,n),a=this.evaluate(t.step,n);if(!(r instanceof M||r instanceof z))throw Error(`Slice start must be numeric or undefined`);if(!(i instanceof M||i instanceof z))throw Error(`Slice stop must be numeric or undefined`);if(!(a instanceof M||a instanceof z))throw Error(`Slice step must be numeric or undefined`);return e instanceof I?new I(ys(e.value,r.value,i.value,a.value)):new P(ys(Array.from(e.value),r.value,i.value,a.value).join(``))}evaluateMemberExpression(e,t){let n=this.evaluate(e.object,t),r;if(e.computed){if(e.property.type===`SliceExpression`)return this.evaluateSliceExpression(n,e.property,t);r=this.evaluate(e.property,t)}else r=e.property.type===`IntegerLiteral`?new M(e.property.value):new P(e.property.value);let i;if(Bs(n)){if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.value.get(r.value)??(n instanceof Ms?n.builtins.get(r.value):void 0)}else if(n instanceof I||n instanceof P){if(r instanceof M)i=n.value.at(r.value),n instanceof P&&(i=new P(n.value.at(r.value)));else if(r instanceof P)i=n.builtins.get(r.value);else throw Error(`Cannot access property with non-string/non-number: got ${r.type}`)}else{if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.builtins.get(r.value)}return i instanceof Os?i:new z}evaluateSet(e,t){let n=e.value?this.evaluate(e.value,t):this.evaluateBlock(e.body,t);if(e.assignee.type===`Identifier`){let r=e.assignee.value;t.setVariable(r,n)}else if(e.assignee.type===`TupleLiteral`){let r=e.assignee;if(!(n instanceof I))throw Error(`Cannot unpack non-iterable type in set: ${n.type}`);let i=n.value;if(i.length!==r.value.length)throw Error(`Too ${r.value.length>i.length?`few`:`many`} items to unpack in set`);for(let e=0;et.setVariable(e.loopvar.value,c);else if(e.loopvar.type===`TupleLiteral`){let t=e.loopvar;if(c.type!==`ArrayValue`)throw Error(`Cannot unpack non-iterable type: ${c.type}`);let n=c;if(t.value.length!==n.value.length)throw Error(`Too ${t.value.length>n.value.length?`few`:`many`} items to unpack`);l=e=>{for(let r=0;r0?a[t-1]:new z],[`nextitem`,t0)throw Error(`macro ${e} takes no keyword argument '${o.keys().next().value}'`);if(n.has(`varargs`))i.setVariable(`varargs`,new I(a.slice(t.length)));else if(a.length>t.length)throw Error(`macro ${e} takes not more than ${t.length} argument(s)`);for(let[e,t]of s)i.setVariable(e,this.evaluate(t,i))}evaluateMacro(e,t){let n=qs(e.args,e.body);return t.setVariable(e.name.value,new L((t,r)=>{let i=new Rs(r);return this.bindMacroArguments(`'${e.name.value}'`,e.args,n,t,i),this.evaluateBlock(e.body,i)})),new R}evaluateCallStatement(e,t){let n=e.callerArgs??[],r=qs(n,e.body),i=new L(i=>{let a=new Rs(t);return this.bindMacroArguments(`None`,n,r,i,a),this.evaluateBlock(e.body,a)}),[a,o]=this.evaluateArguments(e.call.args,t);a.push(new Ns(o));let s=this.evaluate(e.call.callee,t);if(s.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${s.type}`);let c=new Rs(t);return c.setVariable(`caller`,i),s.value(a,c)}evaluateFilterStatement(e,t){let n=this.evaluateBlock(e.body,t);return this.applyFilter(n,e.filter,t)}evaluate(e,t){if(!e)return new z;switch(e.type){case`Program`:return this.evalProgram(e,t);case`Set`:return this.evaluateSet(e,t);case`If`:return this.evaluateIf(e,t);case`For`:return this.evaluateFor(e,t);case`Macro`:return this.evaluateMacro(e,t);case`CallStatement`:return this.evaluateCallStatement(e,t);case`Break`:throw new Ts;case`Continue`:throw new Es;case`IntegerLiteral`:return new M(e.value);case`FloatLiteral`:return new N(e.value);case`StringLiteral`:return new P(e.value);case`ArrayLiteral`:return new I(e.value.map(e=>this.evaluate(e,t)));case`TupleLiteral`:return new Fs(e.value.map(e=>this.evaluate(e,t)));case`ObjectLiteral`:{let n=/* @__PURE__ */ new Map;for(let[r,i]of e.value){let e=this.evaluate(r,t);if(!(e instanceof P))throw Error(`Object keys must be strings: got ${e.type}`);n.set(e.value,this.evaluate(i,t))}return new Ms(n)}case`Identifier`:return this.evaluateIdentifier(e,t);case`CallExpression`:return this.evaluateCallExpression(e,t);case`MemberExpression`:return this.evaluateMemberExpression(e,t);case`UnaryExpression`:return this.evaluateUnaryExpression(e,t);case`BinaryExpression`:return this.evaluateBinaryExpression(e,t);case`FilterExpression`:return this.evaluateFilterExpression(e,t);case`FilterStatement`:return this.evaluateFilterStatement(e,t);case`TestExpression`:return this.evaluateTestExpression(e,t);case`SelectExpression`:return this.evaluateSelectExpression(e,t);case`Ternary`:return this.evaluateTernaryExpression(e,t);case`Comment`:return new R;default:throw SyntaxError(`Unknown node type: ${e.type}`)}}};function Ys(e){switch(typeof e){case`number`:return Number.isInteger(e)?new M(e):new N(e);case`string`:return new P(e);case`boolean`:return new F(e);case`undefined`:return new z;case`object`:return e===null?new R:Array.isArray(e)?new I(e.map(Ys)):new Ms(new Map(Object.entries(e).map(([e,t])=>[e,Ys(t)])));case`function`:return new L((t,n)=>Ys(e(...t.map(e=>e.value))??null));default:throw Error(`Cannot convert to runtime value: ${e}`)}}var Xs=` -`,Zs=`{%- `,Qs=` -%}`,$s=Object.freeze({CONDITIONAL:0,LOGICAL_OR:1,LOGICAL_AND:2,LOGICAL_NOT:3,COMPARISON:4,ADDITIVE:5,MULTIPLICATIVE:6,EXPONENTIATION:7,TEST:8,FILTER:9,UNARY_SIGN:10,ATOM:11});function ec(e){switch(e.operator.type){case`ExponentiationBinaryOperator`:return $s.EXPONENTIATION;case`MultiplicativeBinaryOperator`:return $s.MULTIPLICATIVE;case`AdditiveBinaryOperator`:return $s.ADDITIVE;case`ComparisonBinaryOperator`:return $s.COMPARISON;case`Identifier`:return e.operator.value===`and`?$s.LOGICAL_AND:e.operator.value===`in`||e.operator.value===`not in`?$s.COMPARISON:$s.LOGICAL_OR}return $s.LOGICAL_OR}function tc(e){switch(e.type){case`SelectExpression`:case`Ternary`:return $s.CONDITIONAL;case`BinaryExpression`:return ec(e);case`UnaryExpression`:return e.operator.value===`not`?$s.LOGICAL_NOT:$s.UNARY_SIGN;case`TestExpression`:return $s.TEST;case`FilterExpression`:return $s.FILTER;default:return $s.ATOM}}function nc(e,t){let n=B(e);return tc(e)sc(e,t,n)).join(Xs)}function oc(e){return e.map(e=>B(e)).join(`, `)}function sc(e,t,n){let r=n.repeat(t);switch(e.type){case`Program`:return ac(e.body,t,n);case`If`:return cc(e,t,n);case`For`:return lc(e,t,n);case`Set`:return uc(e,t,n);case`Macro`:return dc(e,t,n);case`Break`:return r+ic(`break`);case`Continue`:return r+ic(`continue`);case`CallStatement`:return fc(e,t,n);case`FilterStatement`:return pc(e,t,n);case`Comment`:return r+`{# `+e.value+` #}`;default:return r+`{{- `+B(e)+` -}}`}}function cc(e,t,n){let r=n.repeat(t),i=[],a=e;for(;a&&(i.push({test:a.test,body:a.body}),a.alternate.length===1&&a.alternate[0].type===`If`);)a=a.alternate[0];let o=r+ic(`if`,B(i[0].test))+Xs+ac(i[0].body,t+1,n);for(let e=1;e0&&(o+=Xs+r+ic(`else`)+Xs+ac(a.alternate,t+1,n)),o+=Xs+r+ic(`endif`),o}function lc(e,t,n){let r=n.repeat(t),i=``;if(e.iterable.type===`SelectExpression`){let t=e.iterable;i=`${B(t.lhs)} if ${B(t.test)}`}else i=B(e.iterable);let a=r+ic(`for`,B(e.loopvar),`in`,i)+Xs+ac(e.body,t+1,n);return e.defaultBlock.length>0&&(a+=Xs+r+ic(`else`)+Xs+ac(e.defaultBlock,t+1,n)),a+=Xs+r+ic(`endfor`),a}function uc(e,t,n){let r=n.repeat(t),i=B(e.assignee),a=e.value?B(e.value):``,o=r+ic(`set`,`${i}${e.value?` = `+a:``}`);return e.body.length===0?o:o+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endset`)}function dc(e,t,n){let r=n.repeat(t),i=oc(e.args);return r+ic(`macro`,`${e.name.value}(${i})`)+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endmacro`)}function fc(e,t,n){let r=n.repeat(t),i=e.callerArgs&&e.callerArgs.length>0?`(${oc(e.callerArgs)})`:``,a=B(e.call),o=r+ic(`call${i}`,a)+Xs;return o+=ac(e.body,t+1,n)+Xs,o+=r+ic(`endcall`),o}function pc(e,t,n){let r=n.repeat(t),i=r+ic(`filter`,e.filter.type===`Identifier`?e.filter.value:B(e.filter))+Xs;return i+=ac(e.body,t+1,n)+Xs,i+=r+ic(`endfilter`),i}function B(e){switch(e.type){case`SpreadExpression`:return`*${B(e.argument)}`;case`KeywordSpreadExpression`:return`**${B(e.argument)}`;case`Identifier`:return e.value;case`IntegerLiteral`:return`${e.value}`;case`FloatLiteral`:{let t=e.value;return Object.is(t,-0)?`-0.0`:t%1==0?t.toFixed(1):t.toString()}case`StringLiteral`:return JSON.stringify(e.value);case`BinaryExpression`:{let t=e,n=ec(t),r=nc(t.left,n),i=nc(t.right,n+1);return`${r} ${t.operator.value} ${i}`}case`UnaryExpression`:{let t=e,n=t.argument.type===`UnaryExpression`?tc(t):$s.ATOM;return t.operator.value+(t.operator.value===`not`?` `:``)+nc(t.argument,n)}case`CallExpression`:{let t=e,n=oc(t.args);return`${B(t.callee)}(${n})`}case`MemberExpression`:{let t=e,n=nc(t.object,$s.ATOM),r=B(t.property);return!t.computed&&t.property.type!==`Identifier`&&t.property.type!==`IntegerLiteral`&&(r=`(${r})`),t.computed?`${n}[${r}]`:`${n}.${r}`}case`FilterExpression`:{let t=e,n=nc(t.operand,$s.FILTER);return t.filter.type===`CallExpression`?`${n} | ${B(t.filter)}`:`${n} | ${t.filter.value}`}case`SelectExpression`:{let t=e;return`${nc(t.lhs,$s.LOGICAL_OR)} if ${nc(t.test,$s.LOGICAL_OR)}`}case`TestExpression`:{let t=e;return`${nc(t.operand,$s.TEST)} is${t.negate?` not`:``} ${t.test.value}`}case`ArrayLiteral`:case`TupleLiteral`:{let t=oc(e.value),n=e.type===`ArrayLiteral`?`[]`:`()`;return`${n[0]}${t}${n[1]}`}case`ObjectLiteral`:return`{${Array.from(e.value.entries()).map(([e,t])=>`${B(e)}: ${B(t)}`).join(`, `)}}`;case`SliceExpression`:{let t=e;return`${t.start?B(t.start):``}:${t.stop?B(t.stop):``}${t.step?`:${B(t.step)}`:``}`}case`KeywordArgumentExpression`:{let t=e;return`${t.key.value}=${B(t.value)}`}case`Ternary`:{let t=e;return`${nc(t.trueExpr,$s.LOGICAL_OR)} if ${nc(t.condition,$s.LOGICAL_OR)} else ${nc(t.falseExpr,$s.CONDITIONAL)}`}default:throw Error(`Unknown expression type: ${e.type}`)}}var mc=class{parsed;constructor(e){let t=Ro(e,{lstrip_blocks:!0,trim_blocks:!0});this.parsed=_s(t)}render(e){let t=new Rs;if(zs(t),e)for(let[n,r]of Object.entries(e))t.set(n,r);return new Js(t).run(this.parsed).value}format(e){return rc(this.parsed,e?.indent||` `)}},hc={txt:`text/plain`,html:`text/html`,css:`text/css`,js:`text/javascript`,json:`application/json`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`},gc=class e{constructor(e){if(this.filePath=e,this.headers=new Headers,this.exists=Cr.existsSync(e),this.exists){this.status=200,this.statusText=`OK`;let t=Cr.statSync(e);this.headers.set(`content-length`,t.size.toString()),this.updateContentType();let n=Cr.createReadStream(e);this.body=new ReadableStream({start(e){n.on(`data`,t=>e.enqueue(t)),n.on(`end`,()=>e.close()),n.on(`error`,t=>e.error(t))},cancel(){n.destroy()}})}else this.status=404,this.statusText=`Not Found`,this.body=null}updateContentType(){let e=this.filePath.toString().split(`.`).pop().toLowerCase();this.headers.set(`content-type`,hc[e]??`application/octet-stream`)}clone(){let t=new e(this.filePath);return t.exists=this.exists,t.status=this.status,t.statusText=this.statusText,t.headers=new Headers(this.headers),t}async arrayBuffer(){return(await Cr.promises.readFile(this.filePath)).buffer}async blob(){let e=await Cr.promises.readFile(this.filePath);return new Blob([e],{type:this.headers.get(`content-type`)})}async text(){return await Cr.promises.readFile(this.filePath,`utf8`)}async json(){return JSON.parse(await this.text())}},_c=class{constructor(e){this._mt=/* @__PURE__ */ new Uint32Array(624),this._idx=625,this._gauss_next=null,this._random_fn=this.random.bind(this),this.seed(e)}seed(e){if(e==null){if(O.IS_CRYPTO_AVAILABLE){let t=/* @__PURE__ */ new Uint32Array(1);crypto.getRandomValues(t),e=t[0]}else e=Date.now()>>>0}let t=this._mt,n=(e,t)=>Math.imul(e,t)>>>0,r=[];for(let t=e||0;t>0;t=Math.floor(t/4294967296))r.push(t&4294967295);r.length||r.push(0),t[0]=19650218;for(let e=1;e<624;++e)t[e]=n(1812433253,t[e-1]^t[e-1]>>>30)+e>>>0;let i=1,a=0;for(let e=Math.max(624,r.length);e>0;--e,++i,++a)i>=624&&(t[0]=t[623],i=1),a>=r.length&&(a=0),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1664525))+r[a]+a>>>0;for(let e=623;e>0;--e,++i)i>=624&&(t[0]=t[623],i=1),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1566083941))-i>>>0;t[0]=2147483648,this._idx=624,this._gauss_next=null}_int32(){let e=this._mt;if(this._idx>=624){for(let t=0;t<624;++t){let n=e[t]&2147483648|e[(t+1)%624]&2147483647;e[t]=(e[(t+397)%624]^n>>>1^(n&1?2567483615:0))>>>0}this._idx=0}let t=e[this._idx++];return t^=t>>>11,t^=t<<7&2636928640,t^=t<<15&4022730752,t^=t>>>18,t>>>0}random(){return((this._int32()>>>5)*67108864+(this._int32()>>>6))/9007199254740992}gauss(e=0,t=1){let n=this._gauss_next;if(this._gauss_next=null,n===null){let e=this.random()*2*Math.PI,t=Math.sqrt(-2*Math.log(1-this.random()));n=Math.cos(e)*t,this._gauss_next=Math.sin(e)*t}return e+n*t}shuffle(e){for(let t=e.length-1;t>0;--t){let n=32-Math.clz32(t+1),r=this._int32()>>>32-n;for(;r>t;)r=this._int32()>>>32-n;let i=e[t];e[t]=e[r],e[r]=i}}choices(e,t){return e[vc(this._random_fn,t)]}};function vc(e,t){let n=0;for(let e=0;evc(bc.random,e),Sc=new _c,Cc=class{constructor(e){this.path=e}async match(e){let t=new gc(wr.join(this.path,e));if(t.exists)return t}async put(e,t,n=void 0){let r=wr.join(this.path,e),i=r+`.tmp.${O.IS_PROCESS_AVAILABLE?process.pid:Date.now()}.${Sc._int32().toString(36)}`;try{let e=t.headers.get(`Content-Length`),a=parseInt(e??`0`),o=0;await Cr.promises.mkdir(wr.dirname(r),{recursive:!0});let s=Cr.createWriteStream(i),c=t.body.getReader();for(;;){let{done:e,value:t}=await c.read();if(e)break;await new Promise((e,n)=>{s.write(t,t=>{if(t){n(t);return}e()})}),o+=t.length;let r=a?o/a*100:0;n?.({progress:r,loaded:o,total:a})}await new Promise((e,t)=>{s.close(n=>n?t(n):e())}),await Cr.promises.rename(i,r)}catch(e){try{await Cr.promises.unlink(i)}catch{}throw e}}async delete(e){let t=wr.join(this.path,e);try{return await Cr.promises.unlink(t),!0}catch{return!1}}},wc={400:`Bad request error occurred while trying to load file`,401:`Unauthorized access to file`,403:`Forbidden access to file`,404:`Could not locate file`,408:`Request timeout error occurred while trying to load file`,500:`Internal server error error occurred while trying to load file`,502:`Bad gateway error occurred while trying to load file`,503:`Service unavailable error occurred while trying to load file`,504:`Gateway timeout error occurred while trying to load file`},Tc=100,Ec=/^(\b[\w\-.]+\b\/)?\b[\w\-.]{1,96}\b$/;function Dc(...e){return e=e.map((t,n)=>(n&&(t=t.replace(/* @__PURE__ */ RegExp(`^/`),``)),n!==e.length-1&&(t=t.replace(/* @__PURE__ */ RegExp(`/$`),``)),t)),e.join(`/`)}function Oc(e,t=null,n=null){let r;try{r=new URL(e)}catch{return!1}return!(t&&!t.includes(r.protocol)||n&&!n.includes(r.hostname))}function kc(e){return!(!Ec.test(e)||e.includes(`..`)||e.includes(`--`)||e.endsWith(`.git`)||e.endsWith(`.ipynb`))}function Ac(e,t={},...n){return JSON.stringify([e,t.revision??`main`,t.cache_dir??null,t.local_files_only??!1,...n])}var jc=class extends Error{constructor(e,{status:t=null}={}){super(e),this.name=`ModelFileNotFoundError`,this.status=t}},Mc=/* @__PURE__ */ new Set([401,403,404]);function Nc(e,t,n){if(!n)return null;let r=`${wc[e]??`Error (${e}) occurred while trying to load file`}: "${t}".`;throw Mc.has(e)?new jc(r,{status:e}):Error(r)}async function Pc(e,t,n){let r=e.headers.get(`Content-Length`),i=r?parseInt(r,10):n??0;r===null&&!n&&A.warn(`Unable to determine content-length from response headers. Will expand buffer when needed.`);let a=new Uint8Array(i),o=0,s=e.body.getReader();async function c(){let{done:e,value:n}=await s.read();if(e)return;let r=o+n.length;if(r>i){i=r;let e=new Uint8Array(i);e.set(a),a=e}return a.set(n,o),o=r,t({progress:o/i*100,loaded:o,total:i}),c()}return await c(),a}function Fc(e){return Oc(e,[`blob:`])}function Ic(e,{allowUnresolved:t=!1}={}){let n;if(typeof location<`u`&&location.href)n=location.href;else if(import.meta.url)n=import.meta.url;else return e;try{return new URL(e,n).href}catch(n){if(!t)throw n;return e}}var Lc=`SHA-256`,Rc=`experimental_transformers-hash-cache`,zc=e=>({algorithm:Lc,value:e}),Bc=class{#e=null;_getHashCache=()=>(this.#e??=caches.open(Rc),this.#e);static isAvailable=()=>typeof navigator<`u`&&`crossOriginStorage`in navigator;match=async e=>{let t=await this._getFileHash(e);if(t)try{let e=await(await navigator.crossOriginStorage.requestFileHandle(zc(t))).getFile();return new Response(e,{headers:{"Content-Length":String(e.size)}})}catch{return}};put=async(e,t)=>{let n=await this._getFileHash(e);if(n){let e=await t.blob();await this._storeBlobInCOS(e,n)}else this._processAndStore(e,t.body)};_storeBlobInCOS=async(e,t)=>{let n=await(await navigator.crossOriginStorage.requestFileHandle(zc(t),{create:!0,origins:`*`})).createWritable();await n.write(e),await n.close()};_processAndStore=async(e,t)=>{try{let n=[];for await(let e of t)n.push(e);let r=new Blob(n),i=await this._getBlobHash(r);await this._storeBlobInCOS(r,i);try{await(await this._getHashCache()).put(e,new Response(i))}catch{}}catch{}};delete=async e=>{try{return await(await this._getHashCache()).delete(e)}catch{return!1}};_getFileHash=async e=>{try{let t=await this._getHashCache(),n=await t.match(e);if(n)return n.text();let r=await this._getLfsFileHash(e);return r?(await t.put(e,new Response(r)),r):null}catch{return null}};_getLfsFileHash=async e=>{if(!e.includes(`/resolve/`))return null;let t=e.replace(`/resolve/`,`/raw/`);try{let e=(await fetch(t).then(e=>e.text())).match(/^oid sha256:([0-9a-f]+)$/m);return e?e[1]:null}catch{return null}};_getBlobHash=async e=>{let t=await e.arrayBuffer(),n=await crypto.subtle.digest(Lc,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}};async function Vc(e=null){let t=null;if(k.useCustomCache){if(!k.customCache)throw Error("`env.useCustomCache=true`, but `env.customCache` is not defined.");if(!k.customCache.match||!k.customCache.put)throw Error("`env.customCache` must be an object which implements the `match` and `put` functions of the Web Cache API. For more information, see https://developer.mozilla.org/en-US/docs/Web/API/Cache");t=k.customCache}if(!t&&k.experimental_useCrossOriginStorage&&Bc.isAvailable()&&(t=new Bc),!t&&k.useBrowserCache){if(typeof caches>`u`)throw Error(`Browser cache is not available in this environment.`);try{t=await caches.open(k.cacheKey)}catch(e){A.warn(`An error occurred while opening the browser cache:`,e)}}if(!t&&k.useFSCache){if(!O.IS_FS_AVAILABLE)throw Error(`File System Cache is not available in this environment.`);t=new Cc(e??k.cacheDir)}return t}async function Hc(e,...t){for(let n of t)try{let t=await e.match(n);if(t)return t}catch{continue}}var Uc=new class{#e;#t;constructor(e){this.#e=e,this.#t=/* @__PURE__ */ new Map}get(e){if(!this.#t.has(e))return;let t=this.#t.get(e);return this.#t.delete(e),this.#t.set(e,t),t}put(e,t){this.#t.has(e)&&this.#t.delete(e),this.#t.set(e,t),this.#t.size>this.#e&&this.#t.delete(this.#t.keys().next().value)}delete(e){return this.#t.delete(e)}clear(){this.#t.clear()}}(100);function Wc(e,t){let n=Uc.get(e);if(n!==void 0)return n;let r=t().then(e=>e,t=>(Uc.delete(e),Promise.reject(t)));return Uc.put(e,r),r}async function Gc(e){if(!Oc(e,[`http:`,`https:`]))return null;let t=Yc(e);return t.set(`Range`,`bytes=0-0`),k.fetch(e,{method:`GET`,headers:t,cache:`no-store`})}function Kc(e,t,n={}){return Wc(Ac(e,n,t),()=>qc(e,t,n))}async function qc(e,t,n){let r=await Vc(n?.cache_dir),{localPath:i,remoteURL:a,proposedCacheKey:o,validModelId:s}=Xc(e,t,n,r),c=await Zc(r,i,o);if(c!==void 0&&typeof c!=`string`){let e=c.headers.get(`content-length`),t=c.headers.get(`content-type`);return{exists:!0,size:e?parseInt(e,10):void 0,contentType:t||void 0,fromCache:!0}}if(k.allowLocalModels&&!Oc(i,[`http:`,`https:`]))try{let e=await Jc(i);if(typeof e!=`string`&&e.status!==404){let t=e.headers.get(`content-length`),n=e.headers.get(`content-type`);return{exists:!0,size:t?parseInt(t,10):void 0,contentType:n||void 0,fromCache:!1}}}catch{}if(k.allowRemoteModels&&!n.local_files_only&&s){let e=await Gc(a);if(e&&e.status>=200&&e.status<300){let t,n=e.headers.get(`content-type`);if(e.status===206){let n=e.headers.get(`content-range`);if(n){let e=n.match(/bytes \d+-\d+\/(\d+)/);e&&(t=parseInt(e[1],10))}}else if(e.status===200)try{await e.body?.cancel()}catch{}if(t===void 0){let n=e.headers.get(`content-length`);t=n?parseInt(n,10):void 0}return{exists:!0,size:t,contentType:n||void 0,fromCache:!1}}e&&e.status!==404&&e.status!==416&&Nc(e.status,a,!0)}return{exists:!1,fromCache:!1}}async function Jc(e){return k.useFS&&!Oc(e,[`http:`,`https:`,`blob:`])?new gc(e instanceof URL?e.protocol===`file:`?e.pathname:e.toString():e):k.fetch(e,{headers:Yc(e)})}function Yc(e){let t=typeof process<`u`&&process?.release?.name===`node`,n=new Headers;if(t){let t=!!{}.TESTING_REMOTELY,r=k.version;if(n.set(`User-Agent`,`transformers.js/${r}; is_ci/${t};`),Oc(e,[`http:`,`https:`],[`huggingface.co`,`hf.co`])){let e={}.HF_TOKEN??{}.HF_ACCESS_TOKEN;e&&n.set(`Authorization`,`Bearer ${e}`)}}return n}function Xc(e,t,n={},r=null){let i=n.revision??`main`,a=Dc(e,t),o=kc(e),s=o?Dc(k.localModelPath,a):a,c=Dc(k.remoteHost,k.remotePathTemplate.replaceAll(`{model}`,e).replaceAll(`{revision}`,encodeURIComponent(i)),t);return{requestURL:a,localPath:s,remoteURL:c,proposedCacheKey:r instanceof Cc?i===`main`?a:Dc(e,i,t):c,validModelId:o}}async function Zc(e,t,n){if(e)return await Hc(e,t,n)}async function Qc(e,t,n,r,i,a,o={}){if(await n.match(r)===void 0&&!(typeof Cache<`u`&&n instanceof Cache&&!Oc(Ic(r,{allowUnresolved:!0}),[`http:`,`https:`]))){if(!a){let a=o.progress_callback?n=>ei(o.progress_callback,{status:`progress`,name:e,file:t,...n}):void 0;await n.put(r,i,a)}else if(typeof i!=`string`){let e=new Headers(i.headers);e.set(`content-length`,a.byteLength.toString()),await n.put(r,new Response(a,{headers:e})).catch(e=>{A.warn(`Unable to add response to browser cache: ${e}.`)})}}}async function $c(e,t,n=!0,r={},i=!1,a=null){let{requestURL:o,localPath:s,remoteURL:c,proposedCacheKey:l,validModelId:u}=Xc(e,t,r,a),d,f=!1,p;p=await Zc(a,s,l);let m=p!==void 0;if(m)d=l;else{if(k.allowLocalModels){if(!Oc(o,[`http:`,`https:`]))try{p=await Jc(s),d=s}catch(e){A.warn(`Unable to load from local path "${s}": "${e}"`)}else if(r.local_files_only)throw Error(`\`local_files_only=true\`, but attempted to load a remote file from: ${o}.`);else if(!k.allowRemoteModels)throw Error(`\`env.allowRemoteModels=false\`, but attempted to load a remote file from: ${o}.`)}if(p===void 0||typeof p!=`string`&&p.status===404){if(r.local_files_only||!k.allowRemoteModels){if(n)throw new jc(`\`local_files_only=true\` or \`env.allowRemoteModels=false\` and file was not found locally at "${s}".`);return null}if(!u)throw new jc(`Local file missing at "${s}" and download aborted due to invalid model ID "${e}".`);if(p=await Jc(c),p.status!==200)return Nc(p.status,c,n);d=l}f=a&&typeof Response<`u`&&p instanceof Response&&p.status===200}ei(r.progress_callback,{status:`download`,name:e,file:t});let h;if(!(O.IS_NODE_ENV&&i)){let n;if(typeof p!=`string`){if(!r.progress_callback)n=new Uint8Array(await p.arrayBuffer());else if(m&&typeof navigator<`u`&&/firefox/i.test(navigator.userAgent))n=new Uint8Array(await p.arrayBuffer()),ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n.length,total:n.length});else{let i,a=p.headers.get(`content-length`);if(a)i=parseInt(a,10);else try{let n=await Kc(e,t,r);n.size&&(i=n.size)}catch{}n=await Pc(p,n=>{ei(r.progress_callback,{status:`progress`,name:e,file:t,...n})},i)}}h=n}if(f&&d&&typeof p!=`string`&&await Qc(e,t,a,d,p,h,r),O.IS_NODE_ENV&&i&&r.progress_callback&&typeof p!=`string`){let n=parseInt(p.headers.get(`content-length`),10)||0;ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n,total:n})}if(ei(r.progress_callback,{status:`done`,name:e,file:t}),h){if(!O.IS_NODE_ENV&&i)throw Error(`Cannot return path in a browser environment.`);return h}if(p instanceof gc)return p.filePath;let g=await a?.match(d);if(g instanceof gc)return g.filePath;if(g instanceof Response)return new Uint8Array(await g.arrayBuffer());if(typeof g==`string`)return g;throw Error(`Unable to get model file path or buffer.`)}var el=/* @__PURE__ */ new Map;async function tl(e,t,n=!0,r={},i=!1){if(!k.allowLocalModels){if(r.local_files_only)throw Error("Invalid configuration detected: local models are disabled (`env.allowLocalModels=false`) but you have requested to only use local models (`local_files_only=true`).");if(!k.allowRemoteModels)throw Error("Invalid configuration detected: both local and remote models are disabled. Fix by setting `env.allowLocalModels` or `env.allowRemoteModels` to `true`.")}let a=Ac(e,r,t,n,i),{progress_callback:o}=r,s=o instanceof ti?o.loads:el,c=s.get(a);return c||(ei(o,{status:`initiate`,name:e,file:t}),c=Vc(r.cache_dir).then(a=>$c(e,t,n,r,i,a)),s===el&&(c=c.finally(()=>el.delete(a))),s.set(a,c)),await c}async function nl(e,t,n=!0,r={}){let i=await tl(e,t,n,r,!1);return i===null?null:new TextDecoder(`utf-8`).decode(i)}async function rl(e,t,n=!0,r={}){let i=await nl(e,t,n,r);return i===null?{}:JSON.parse(i)}function il(e,[t,n,r],[i,a],o=`bilinear`,s=!1){let c=a/r,l=i/n,u=new e.constructor(i*a*t),d=n*r,f=i*a;for(let o=0;o=0;--e)i[e]=a,r[e]=t[n[e]],a*=r[e];let a=n.map((e,t)=>i[n.indexOf(t)]),o=new e.constructor(e.length);for(let n=0;n=0;--e)r+=i%t[e]*a[e],i=Math.floor(i/t[e]);o[r]=e[n]}return[o,r]}function ol(e){let t=ll(e)[0],n=e.map(e=>Math.exp(e-t)),r=n.reduce((e,t)=>e+t,0);return n.map(e=>e/r)}function sl(e){let t=ll(e)[0],n=0;for(let r=0;re-t-r)}function cl(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;rt&&(t=e[r],n=r);return[t,n]}function ul(e){return e>0&&!(e&e-1)}var dl=class{constructor(e){if(this.size=e|0,this.size<=1||!ul(this.size))throw Error(`FFT size must be a power of two larger than 1`);this._csize=e<<1,this.table=new Float64Array(this.size*2);for(let e=0;ee;e<<=1)++t;this._width=t%2==0?t-1:t,this._bitrev=new Int32Array(1<>>t&3)<>>1);for(let t=0;t>>1]=e[t];return n}toComplexArray(e,t){let n=t||this.createComplexArray();for(let t=0;t>>1],n[t+1]=0;return n}transform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,1)}realTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._realTransform4(e,t,1)}inverseTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,-1);for(let t=0;t>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>2;for(o=0;o>>1,i>>>1)}else for(o=0,s=0;o>>1,i>>>1,n)}let l=this.table;for(i>>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>1,s=t>>>1,c=s>>>1;for(o=0;o>>1;for(let t=2;t>1;++t){let n=(t+1-e)**2/2,r=Math.sqrt(s**2+c**2)**n,o=n*Math.atan2(c,s),l=2*t;i[l]=r*Math.cos(o),i[l+1]=r*Math.sin(o),a[l]=i[l],a[l+1]=-i[l+1]}this._slicedChirpBuffer=i.subarray(t,n),this._f=new dl(r>>1),this._f.transform(this._chirpBuffer,a)}_transform(e,t,n){let r=this._buffer1,i=this._buffer2,a=this._outBuffer1,o=this._outBuffer2,s=this._chirpBuffer,c=this._slicedChirpBuffer,l=this._a;if(n)for(let e=0;e>1];r[e]=i*c[e],r[n]=i*c[n]}else for(let e=0;e=e.length&&(i=2*(e.length-1)-i),r[a++]=e[i]}r.sort(),n[t]=r[i]}return n}function hl(e,t){let n=10**t;return Math.round(e*n)/n}function gl(e){let t=Math.round(e);return Math.abs(e)%1==.5?t%2==0?t:t-1:t}function _l(e){let t=e.length,n=e[0].length,r=[t+1,n+1],i=Array.from({length:r[0]},()=>Array(r[1]).fill(1/0));i[0][0]=0;let a=Array.from({length:r[0]},()=>Array(r[1]).fill(-1));for(let t=1;t0||s>0;)switch(c.push(o-1),l.push(s-1),a[o][s]){case 0:--o,--s;break;case 1:--o;break;case 2:--s;break;default:throw Error(`Internal error in dynamic time warping. Unexpected trace[${o}, ${s}]. Please file a bug report.`)}return c.reverse(),l.reverse(),[c,l]}var vl=/* @__PURE__ */ (function(){let e=null;return function(t){if(!e){e=/* @__PURE__ */ new Float32Array(65536);let t=/* @__PURE__ */ new ArrayBuffer(4),n=new Uint32Array(t),r=new Float32Array(t);for(let t=0;t>10,s=t&1023;if(o===31)i=a|2139095040|s<<13;else if(o===0){if(s===0)i=a;else{let e=113;for(;!(s&1024);)s<<=1,--e;s&=-1025,i=a|e<<23|s<<13}}else i=a|o+112<<23|s<<13;n[0]=i,e[t]=r[0]}}let n=t.length,r=e,i=new Float32Array(n);for(let e=0;e[`webgpu`,`cuda`,`dml`,`webnn-gpu`].includes(e))}if(El.includes(e))return[Cl[e]??e];throw Error(`Unsupported device: "${e}". Should be one of: ${El.join(`, `)}.`)}var Ml=Promise.resolve(),Nl=null;async function Pl(){if(Nl)return Nl;if(!(k.useWasmCache&&typeof zl?.wasm?.wasmPaths==`object`&&zl?.wasm?.wasmPaths?.wasm&&zl?.wasm?.wasmPaths?.mjs)){if(O.IS_DENO_WEB_RUNTIME)throw Error(`env.useWasmCache=false is not supported in Deno's web runtime. Remove the useWasmCache override.`);return Nl=Promise.resolve(),Nl}return Nl=(async()=>{let e=zl.wasm.wasmPaths,t=!1;await Promise.all([e.wasm&&!Fc(e.wasm)?(async()=>{try{let n=await xl(Ic(e.wasm));n&&(zl.wasm.wasmBinary=n,t=!0)}catch(e){A.warn(`Failed to pre-load WASM binary:`,e)}})():Promise.resolve(),e.mjs&&!Fc(e.mjs)?(async()=>{try{let t=await Sl(Ic(e.mjs));t&&(zl.wasm.wasmPaths.mjs=t)}catch(e){A.warn(`Failed to pre-load WASM factory:`,e)}})():Promise.resolve()]),t||(zl.wasm.wasmPaths.mjs=e.mjs)})(),Nl}async function Fl(e,t,n){await Pl();let r=wl(k.logLevel??Xr.WARNING),i=()=>Al.create(e,{logSeverityLevel:r,...t}),a=await(O.IS_WEB_ENV?Ml=Ml.then(i):i());return a.config=n,a}var Il=Promise.resolve();async function Ll(e,t){let n=()=>e.run(t);return O.IS_WEB_ENV?Il=Il.then(n):n()}function Rl(e){return e instanceof Ol.Tensor}var zl=Ol?.env;function Bl(){return zl?.wasm?.proxy}if(zl){let e=function(e){zl.logLevel=Tl[wl(e)]};if(zl.wasm){if(!(typeof ServiceWorkerGlobalScope<`u`&&self instanceof ServiceWorkerGlobalScope)&&zl.versions?.web&&!zl.wasm.wasmPaths){let e=`https://cdn.jsdelivr.net/npm/onnxruntime-web@${zl.versions.web}/dist/`,t=`.asyncify`;O.IS_SAFARI_BELOW_26&&!O.IS_WEBGPU_AVAILABLE&&(t=``),zl.wasm.wasmPaths={mjs:`${e}ort-wasm-simd-threaded${t}.mjs`,wasm:`${e}ort-wasm-simd-threaded${t}.wasm`}}zl.wasm.proxy=!1}zl.webgpu&&(zl.webgpu.powerPreference=`high-performance`),e(k.logLevel??Xr.WARNING),k.backends.onnx={...zl,setLogLevel:e}}var Vl=async(e,t,n)=>{let r=await Fl(new Uint8Array(e),t);return(async e=>{let t=Bl(),i=Object.fromEntries(Object.entries(e).map(([e,n])=>[e,(t?n.clone():n).ort_tensor])),a=await Ll(r,i);return Array.isArray(n)?n.map(e=>new V(a[e])):new V(a[n])})},Hl=class{static session_options={};static get nearest_interpolate_4d(){return this._nearest_interpolate_4d||=Vl([8,10,18,0,58,129,1,10,41,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,18,10,4,109,111,100,101,34,7,110,101,97,114,101,115,116,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,21],this.session_options,`y`),this._nearest_interpolate_4d}static get bilinear_interpolate_4d(){return this._bilinear_interpolate_4d||=Vl([8,9,18,0,58,128,1,10,40,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,17,10,4,109,111,100,101,34,6,108,105,110,101,97,114,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bilinear_interpolate_4d}static get bicubic_interpolate_4d(){return this._bicubic_interpolate_4d||=Vl([8,9,18,0,58,127,10,39,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,16,10,4,109,111,100,101,34,5,99,117,98,105,99,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bicubic_interpolate_4d}static get matmul(){return this._matmul||=Vl([8,9,18,0,58,55,10,17,10,1,97,10,1,98,18,1,99,34,6,77,97,116,77,117,108,18,1,114,90,9,10,1,97,18,4,10,2,8,1,90,9,10,1,98,18,4,10,2,8,1,98,9,10,1,99,18,4,10,2,8,1,66,2,16,20],this.session_options,`c`),this._matmul}static get stft(){return this._stft||=Vl([8,7,18,0,58,148,1,10,38,10,1,115,10,1,106,10,1,119,10,1,108,18,1,111,34,4,83,84,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,115,90,26,10,1,115,18,21,10,19,8,1,18,15,10,3,18,1,98,10,3,18,1,115,10,3,18,1,99,90,11,10,1,106,18,6,10,4,8,7,18,0,90,16,10,1,119,18,11,10,9,8,1,18,5,10,3,18,1,119,90,11,10,1,108,18,6,10,4,8,7,18,0,98,31,10,1,111,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,102,10,3,18,1,100,10,3,18,1,99,66,2,16,17],this.session_options,`o`),this._stft}static get rfft(){return this._rfft||=Vl([8,9,58,93,10,33,10,1,120,10,0,10,1,97,18,1,121,34,3,68,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,100,90,19,10,1,120,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,1,90,11,10,1,97,18,6,10,4,8,7,18,0,98,19,10,1,121,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,2,66,2,16,20],this.session_options,`y`),this._rfft}static get top_k(){return this._top_k||=Vl([8,10,18,0,58,73,10,18,10,1,120,10,1,107,18,1,118,18,1,105,34,4,84,111,112,75,18,1,116,90,9,10,1,120,18,4,10,2,8,1,90,15,10,1,107,18,10,10,8,8,7,18,4,10,2,8,1,98,9,10,1,118,18,4,10,2,8,1,98,9,10,1,105,18,4,10,2,8,7,66,2,16,21],this.session_options,[`v`,`i`]),this._top_k}static get slice(){return this._slice||=Vl([8,7,18,0,58,96,10,25,10,1,120,10,1,115,10,1,101,10,1,97,10,1,116,18,1,121,34,5,83,108,105,99,101,18,1,114,90,9,10,1,120,18,4,10,2,8,1,90,9,10,1,115,18,4,10,2,8,7,90,9,10,1,101,18,4,10,2,8,7,90,9,10,1,97,18,4,10,2,8,7,90,9,10,1,116,18,4,10,2,8,7,98,9,10,1,121,18,4,10,2,8,1,66,2,16,13],this.session_options,`y`),this._slice}},Ul=Object.freeze({auto:`auto`,gpu:`gpu`,cpu:`cpu`,wasm:`wasm`,webgpu:`webgpu`,cuda:`cuda`,dml:`dml`,coreml:`coreml`,webnn:`webnn`,"webnn-npu":`webnn-npu`,"webnn-gpu":`webnn-gpu`,"webnn-cpu":`webnn-cpu`}),Wl=O.IS_NODE_ENV?`cpu`:`wasm`;function Gl(e,t,{warn:n}={}){return e?typeof e==`string`?e:e.hasOwnProperty(t)?e[t]:(n&&n(`device not specified for "${t}". Using the default device (${Wl}).`),Wl):Wl}var Kl=/* @__PURE__ */ (function(){let e;return async function(){if(e===void 0){if(!O.IS_WEBGPU_AVAILABLE)e=!1;else try{e=(await navigator.gpu.requestAdapter()).features.has(`shader-f16`)}catch{e=!1}}return e}})(),ql=Object.freeze({auto:`auto`,fp32:`fp32`,fp16:`fp16`,q8:`q8`,int8:`int8`,uint8:`uint8`,q4:`q4`,bnb4:`bnb4`,q4f16:`q4f16`,q2:`q2`,q2f16:`q2f16`,q1:`q1`,q1f16:`q1f16`}),Jl=ql.fp32,Yl=Object.freeze({[Ul.wasm]:ql.q8}),Xl=Object.freeze({[ql.fp32]:``,[ql.fp16]:`_fp16`,[ql.int8]:`_int8`,[ql.uint8]:`_uint8`,[ql.q8]:`_quantized`,[ql.q4]:`_q4`,[ql.q2]:`_q2`,[ql.q1]:`_q1`,[ql.q4f16]:`_q4f16`,[ql.q2f16]:`_q2f16`,[ql.q1f16]:`_q1f16`,[ql.bnb4]:`_bnb4`});function Zl(e,t,n,{configDtype:r=null,warn:i}={}){let a,o=!1;e&&typeof e!=`string`?e.hasOwnProperty(t)?a=e[t]:(a=null,o=!0):a=e;let s;if(a===ql.auto){if(r){let e=typeof r==`string`?r:r?.[t];if(e&&e!==ql.auto&&ql.hasOwnProperty(e))return e}s=Yl[n]??Jl}else s=a&&ql.hasOwnProperty(a)?a:Yl[n]??Jl;return o&&i&&i(`dtype not specified for "${t}". Using the default dtype (${s}) for this device (${n}).`),s}var Ql=Object.freeze({float32:Float32Array,float16:typeof Float16Array<`u`?Float16Array:Uint16Array,float64:Float64Array,string:Array,int8:Int8Array,uint8:Uint8Array,int16:Int16Array,uint16:Uint16Array,int32:Int32Array,uint32:Uint32Array,int64:BigInt64Array,uint64:BigUint64Array,bool:Uint8Array,uint4:Uint8Array,int4:Int8Array}),V=class e{get dims(){return this.ort_tensor.dims}set dims(e){this.ort_tensor.dims=e}get type(){return this.ort_tensor.type}get data(){return this.ort_tensor.data}get size(){return this.ort_tensor.size}get location(){return this.ort_tensor.location}ort_tensor;constructor(...e){return this.ort_tensor=Rl(e[0])?e[0]:new br(e[0],e[1],e[2]),new Proxy(this,{get:(e,t)=>{if(typeof t==`string`){let n=Number(t);if(Number.isInteger(n))return e._getitem(n)}return e[t]},set:(e,t,n)=>e[t]=n})}dispose(){this.ort_tensor.dispose()}*[Symbol.iterator](){let[e,...t]=this.dims;if(t.length>0){let n=t.reduce((e,t)=>e*t);for(let r=0;r0){let e=r.reduce((e,t)=>e*t);return this._subarray(t,e,r)}return new e(this.type,[this.data[t]],r)}_subarray(t,n,r){let i=t*n,a=(t+1)*n,o=`subarray`in this.data?this.data.subarray(i,a):this.data.slice(i,a);return new e(this.type,o,r)}item(){let e=this.data;if(e.length!==1)throw Error(`a Tensor with ${e.length} elements cannot be converted to Scalar`);return e[0]}tolist(){return $l(this.data,this.dims)}sigmoid(){return this.clone().sigmoid_()}sigmoid_(){let e=this.data;for(let t=0;t0||r>0&&n<0?r+n:r}return this}clone(){return new e(this.type,this.data.slice(),this.dims.slice())}slice(...t){let n=[],r=[];for(let e=0;ea)throw Error(`Invalid slice: ${i}`);let o=[Math.max(t,0),Math.min(a,this.dims[e])];r.push(o),n.push(o[1]-o[0])}else throw Error(`Invalid slice: ${i}`)}let i=r.map(([e,t])=>t-e),a=i.reduce((e,t)=>e*t),o=this.data,s=new o.constructor(a),c=this.stride(),l=!0;for(let e=1;e=0;--n){let e=i[n];t+=(a%e+r[n][0])*c[n],a=Math.floor(a/e)}s[e]=o[t]}return new e(this.type,s,n)}permute(...e){return eu(this,e)}transpose(...e){return this.permute(...e)}sum(e=null,t=!1){return this.norm(1,e,t)}norm(t=`fro`,n=null,r=!1){if(t===`fro`)t=2;else if(typeof t==`string`)throw Error(`Unsupported norm: ${t}`);let i=this.data,a=i instanceof BigInt64Array||i instanceof BigUint64Array;if(a&&t!==1)throw Error(`Expected a floating point tensor as input. Got ${this.type}`);let o,s;if(a?(o=(e,t)=>e+t,s=0n):(o=(e,n)=>e+n**t,s=0),n===null){let n=i.reduce(o,s);return t!==1&&(n**=1/t),new e(this.type,[n],[])}let[c,l,u]=fu(o,this,n,r);if(t!==1)for(let e=0;e=0;--r){let e=this.dims[r];if(r!==t){let t=i%e;n+=t*a,a*=this.dims[r]}i=Math.floor(i/e)}r[e]/=i[n]}return this}normalize(e=2,t=1){return this.clone().normalize_(e,t)}stride(){return hu(this.dims)}squeeze(t=null){return new e(this.type,this.data,cu(this.dims,t))}squeeze_(e=null){return this.dims=cu(this.dims,e),this}unsqueeze(t){return new e(this.type,this.data,lu(this.dims,t))}unsqueeze_(e){return this.dims=lu(this.dims,e),this}flatten_(e=0,t=-1){t=(t+this.dims.length)%this.dims.length;let n=this.dims.slice(0,e),r=this.dims.slice(e,t+1),i=this.dims.slice(t+1);return this.dims=[...n,r.reduce((e,t)=>e*t,1),...i],this}flatten(e=0,t=-1){return this.clone().flatten_(e,t)}view(...t){let n=-1;for(let e=0;er===n?e:e*t,1);t[n]=r.length/e}return new e(this.type,r,t)}neg_(){let e=this.data;for(let t=0;tt);return new e(`bool`,n,this.dims)}lt(t){let n=new Uint8Array(this.data.length),r=this.data;for(let e=0;eMath.min(e,t),this,t,n,1/0);return new e(r,i,a)}max(t=null,n=!1){if(t===null){let t=ll(this.data)[0];return new e(this.type,[t],[])}let[r,i,a]=fu((e,t)=>Math.max(e,t),this,t,n,-1/0);return new e(r,i,a)}argmin(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=cl(this.data)[1];return new e(`int64`,[BigInt(r)],[])}argmax(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=ll(this.data)[1];return new e(`int64`,[BigInt(r)],[])}repeat(...t){if(t.lengthe===1)){if(t.length===this.dims.length)return this.clone();let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims);return new e(this.type,this.data.slice(),r)}let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims),i=r.map((e,n)=>e*t[n]),a=i.reduce((e,t)=>e*t,1),o=this.data,s=new o.constructor(a),c=hu(r),l=hu(i);for(let e=0;eBigInt(Math.floor(e)):BigInt;else if(this.type===`float16`&&t==`float32`&&this.data instanceof Uint16Array)return new e(t,vl(this.data),this.dims);return new e(t,Ql[t].from(this.data,n),this.dims)}};function $l(e,t){let n=e.length;if(n!==(t.length===0?1:t.reduce((e,t)=>e*t)))throw Error(`cannot reshape array of size ${n} into shape (${t})`);let r=e;for(let e=t.length-1;e>=0;e--)r=r.reduce((n,r)=>{let i=n[n.length-1];return i.lengthnew V(`int64`,e,[e.length]);async function ou(e,t,n,r,i){return await(await Hl.slice)({x:e,s:au(t),e:au(n),a:au(r),t:au(i??Array(r.length).fill(1))})}function su(e,t){let n=e.data,r=t.data,i=[e.dims[0],e.dims[2]],a=new n.constructor(i[0]*i[1]),[o,s,c]=e.dims,l=0;for(let e=0;ee!==1):typeof t==`number`?e[t]===1&&e.splice(t,1):Array.isArray(t)&&(e=e.filter((e,n)=>e!==1||!t.includes(n))),e}function lu(e,t){return t=uu(t,e.length+1),e=e.slice(),e.splice(t,0,1),e}function uu(e,t,n=null,r=!0){if(e<-t||e>=t){if(r)throw Error(`IndexError: index ${e} is out of bounds for dimension${n===null?``:` `+n} with size ${t}`);return e<-t?0:t}return e<0&&(e=(e%t+t)%t),e}function H(e,t=0){t=uu(t,e[0].dims.length);let n=e[0].dims.slice();n[t]=e.reduce((e,n)=>e+n.dims[t],0);let r=n.reduce((e,t)=>e*t,1),i=new e[0].data.constructor(r),a=e[0].type;if(t===0){let t=0;for(let n of e){let e=n.data;i.set(e,t),t+=e.length}}else{let r=0;for(let a=0;a=0;--i){let e=s[i],l=o%e;i===t&&(l+=r),a+=l*c,c*=n[i],o=Math.floor(o/e)}i[a]=o[e]}r+=s[t]}}return new V(a,i,n)}function du(e,t=0){return H(e.map(e=>e.unsqueeze(t)),t)}function fu(e,t,n,r=!1,i=null){let a=t.data,o=t.dims;n=uu(n,o.length);let s=o.slice();s[n]=1;let c=new a.constructor(a.length/o[n]);i!==null&&c.fill(i);for(let t=0;t=0;--e){let t=o[e];if(e!==n){let n=i%t;r+=n*a,a*=s[e]}i=Math.floor(i/t)}c[r]=e(c[r],a[t],t,r)}return r||s.splice(n,1),[t.type,c,s]}function pu(e,t=null,n=1,r=!1){let i=e.data,a=e.dims;if(t===null){let t=i.reduce((e,t)=>e+t,0)/i.length,r=Math.sqrt(i.reduce((e,n)=>e+(n-t)**2,0)/(i.length-n)),a=new V(e.type,[t],[]);return[new V(e.type,[r],[]),a]}t=uu(t,a.length);let o=mu(e,t,r),s=o.data,[c,l,u]=fu((e,t,n,r)=>e+(t-s[r])**2,e,t,r);for(let e=0;ee+t,0);return new V(e.type,[t/i.length],[])}t=uu(t,r.length);let[a,o,s]=fu((e,t)=>e+t,e,t,n);if(r[t]!==1)for(let e=0;e=0;--n)t[n]=r,r*=e[n];return t}function gu(e,t,n,r){return new V(n,new r(e.reduce((e,t)=>e*t,1)).fill(t),e)}function _u(e,t){let n,r;if(typeof t==`number`)n=`float32`,r=Float32Array;else if(typeof t==`bigint`)n=`int64`,r=BigInt64Array;else if(typeof t==`boolean`)n=`bool`,r=Uint8Array;else throw Error(`Unsupported data type: ${typeof t}`);return gu(e,t,n,r)}function vu(e,t){return _u(e.dims,t)}function yu(e){return gu(e,1n,`int64`,BigInt64Array)}function bu(e){return yu(e.dims)}function xu(e){return gu(e,0n,`int64`,BigInt64Array)}function Su(e){return xu(e.dims)}function Cu(e){let t=e.reduce((e,t)=>e*t,1);return new V(`float32`,Float32Array.from({length:t},()=>bc.gauss()),e)}function wu(e,t){if(e.dims.length!==2)throw Error(`The tensor must have 2 dimensions`);if(e.dims.at(-1)%8!=0)throw Error(`The last dimension of the tensor must be a multiple of 8`);if(![`binary`,`ubinary`].includes(t))throw Error(`The precision must be either 'binary' or 'ubinary'`);let n=t===`binary`,r=n?`int8`:`uint8`,i=n?Int8Array:Uint8Array,a=e.data,o=new i(a.length/8);for(let e=0;e0),r=Math.floor(e/8),i=e%8;o[r]|=t<<7-i,n&&i===0&&(o[r]-=128)}return new V(r,o,[e.dims[0],e.dims[1]/8])}async function Tu(e){if(!e)throw Error(`modelId is required for get_tokenizer_files`);return(await Kc(e,`tokenizer_config.json`,{})).exists?[`tokenizer.json`,`tokenizer_config.json`]:[]}async function Eu(e,t){let n=await Tu(e);return await Promise.all(n.map(n=>rl(e,n,!0,t)))}function Du(e){let t=e.dims;switch(t.length){case 1:return e.tolist();case 2:if(t[0]!==1)throw Error("Unable to decode tensor with `batch size !== 1`. Use `tokenizer.batch_decode(...)` for batched inputs.");return e.tolist()[0];default:throw Error(`Expected tensor to have 1-2 dimensions, got ${t.length}.`)}}var Ou=[`bos_token`,`eos_token`,`unk_token`,`sep_token`,`pad_token`,`cls_token`,`mask_token`];function ku(e,t,n,r){for(let i of Object.keys(e)){let a=t-e[i].length,o=n(i),s=Array(a).fill(o);e[i]=r===`right`?ai(e[i],s):ai(s,e[i])}}function Au(e,t){for(let n of Object.keys(e))e[n].length=t}function ju(e,...t){for(let n of t){if(!Object.hasOwn(e,n))continue;let t=e[n];if(t){if(typeof t==`object`){if(t.__type===`AddedToken`)return t.content;throw Error(`Unknown token: ${t}`)}return t}}return null}function Mu(e){let t=[];for(let n of e.get_added_tokens_decoder().values())n.special&&t.push(n);return t}var U=class extends $r{return_token_type_ids=!1;padding_side=`right`;constructor(e,t){if(super(),this._tokenizerJSON=e,this._tokenizerConfig=t,this._tokenizer=new Do(e,t),this.config=t,this.padding_side=t.padding_side??this.padding_side,this.mask_token=ju(t,`mask_token`),this.mask_token_id=this._tokenizer.token_to_id(this.mask_token),this.pad_token=ju(t,`pad_token`,`eos_token`),this.pad_token_id=this._tokenizer.token_to_id(this.pad_token),this.sep_token=ju(t,`sep_token`),this.sep_token_id=this._tokenizer.token_to_id(this.sep_token),this.unk_token=ju(t,`unk_token`),this.unk_token_id=this._tokenizer.token_to_id(this.unk_token),this.bos_token=ju(t,`bos_token`),this.bos_token_id=this._tokenizer.token_to_id(this.bos_token),this.eos_token=ju(t,`eos_token`),this.eos_token_id=this._tokenizer.token_to_id(this.eos_token),this.chat_template=t.chat_template??null,Array.isArray(this.chat_template)){let e=/* @__PURE__ */ Object.create(null);for(let{name:t,template:n}of this.chat_template){if(typeof t!=`string`||typeof n!=`string`)throw Error(`Chat template must be a list of objects with "name" and "template" properties`);e[t]=n}this.chat_template=e}this._compiled_template_cache=/* @__PURE__ */ new Map;let n=Mu(this._tokenizer);this.all_special_ids=n.map(e=>e.id),this.all_special_tokens=n.map(e=>e.content)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let o=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a});return new this(...o)}get_vocab(){return this._tokenizer.get_vocab()}get model_max_length(){return this._tokenizerConfig.model_max_length??1/0}get add_eos_token(){return this._tokenizerConfig.add_eos_token}get add_bos_token(){return this._tokenizerConfig.add_bos_token}convert_tokens_to_ids(e){return typeof e==`string`?this._tokenizer.token_to_id(e):e.map(e=>this._tokenizer.token_to_id(e))}_call(e,t={}){let{text_pair:n=null,add_special_tokens:r=!0,padding:i=!1,return_token_type_ids:a=null}=t,{truncation:o=null,max_length:s=null}=t,c=t.return_tensor??!0,l=Array.isArray(e),u;if(l){if(e.length===0)throw Error(`text array must be non-empty`);if(n!==null){if(!Array.isArray(n))throw Error(`text_pair must also be an array`);if(e.length!==n.length)throw Error(`text and text_pair must have the same length`);u=e.map((e,t)=>this._encode_plus(e,{text_pair:n[t],add_special_tokens:r,return_token_type_ids:a}))}else u=e.map(e=>this._encode_plus(e,{add_special_tokens:r,return_token_type_ids:a}))}else{if(e==null)throw Error(`text may not be null or undefined`);if(Array.isArray(n))throw Error("When specifying `text_pair`, since `text` is a string, `text_pair` must also be a string (i.e., not an array).");u=[this._encode_plus(e,{text_pair:n,add_special_tokens:r,return_token_type_ids:a})]}if(s===null?s=this.model_max_length:o===null&&(i===!0?(A.warn("`max_length` is ignored when `padding: true` and there is no truncation strategy. To pad to max length, use `padding: 'max_length'`."),s=this.model_max_length):i===!1&&(A.warn("Truncation was not explicitly activated but `max_length` is provided a specific value, please use `truncation: true` to explicitly truncate examples to max length."),o=!0)),i===!0&&(s=Math.min(ll(u.map(e=>e.input_ids.length))[0],s??1/0)),s=Math.min(s,this.model_max_length??1/0),i||o)for(let e=0;es?o&&Au(u[e],s):i&&ku(u[e],s,e=>e===`input_ids`?this.pad_token_id:0,this.padding_side);let d={};if(c){if(!(i&&o)&&u.some(e=>{for(let t of Object.keys(e))if(e[t].length!==u[0][t]?.length)return!0;return!1}))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=true' and 'truncation=true' to have batched tensors with the same length.`);let e=[u.length,u[0].input_ids.length];for(let t of Object.keys(u[0]))d[t]=new V(`int64`,BigInt64Array.from(u.flatMap(e=>e[t]).map(BigInt)),e)}else{for(let e of Object.keys(u[0]))d[e]=u.map(t=>t[e]);if(!l)for(let e of Object.keys(d))d[e]=d[e][0]}return d}_encode_text(e){return e===null?null:this._tokenizer.encode(e).tokens}_encode_plus(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{ids:i,attention_mask:a,token_type_ids:o}=this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r??this.return_token_type_ids});return{input_ids:i,attention_mask:a,...o?{token_type_ids:o}:{}}}tokenize(e,{pair:t=null,add_special_tokens:n=!1}={}){return this._tokenizer.tokenize(e,{text_pair:t,add_special_tokens:n})}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){return this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r}).ids}batch_decode(e,t={}){return e instanceof V&&(e=e.tolist()),e.map(e=>this.decode(e,t))}decode(e,t={}){if(e instanceof V&&(e=Du(e)),!Array.isArray(e)||e.length===0||!ni(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);return this.decode_single(e,t)}decode_single(e,{skip_special_tokens:t=!1,clean_up_tokenization_spaces:n=null}){return this._tokenizer.decode(e,{skip_special_tokens:t,clean_up_tokenization_spaces:n})}get_chat_template({chat_template:e=null,tools:t=null}={}){if(this.chat_template&&typeof this.chat_template==`object`){let n=this.chat_template;if(e!==null&&Object.hasOwn(n,e))e=n[e];else if(e===null){if(t!==null&&`tool_use`in n)e=n.tool_use;else if(`default`in n)e=n.default;else throw Error(`This model has multiple chat templates with no default specified! Please either pass a chat template or the name of the template you wish to use to the 'chat_template' argument. Available template names are ${Object.keys(n).sort()}.`)}}else if(e===null){if(this.chat_template)e=this.chat_template;else throw Error(`Cannot use apply_chat_template() because tokenizer.chat_template is not set and no template argument was passed! For information about writing templates and setting the tokenizer.chat_template attribute, please see the documentation at https://huggingface.co/docs/transformers/main/en/chat_templating`)}return e}apply_chat_template(e,t={}){let{tools:n=null,documents:r=null,chat_template:i=null,add_generation_prompt:a=!1,tokenize:o=!0,padding:s=!1,truncation:c=!1,max_length:l=null,return_tensor:u=!0,return_dict:d=!0,tokenizer_kwargs:f={},...p}=t;if(i=this.get_chat_template({chat_template:i,tools:n}),typeof i!=`string`)throw Error(`chat_template must be a string, but got ${typeof i}`);let m=this._compiled_template_cache.get(i);m===void 0&&(m=new mc(i),this._compiled_template_cache.set(i,m));let h=/* @__PURE__ */ Object.create(null);for(let e of Ou){let t=ju(this.config,e);t&&(h[e]=t)}let g=m.render({messages:e,add_generation_prompt:a,tools:n,documents:r,...h,...p});if(o){let e=this._call(g,{add_special_tokens:!1,padding:s,truncation:c,max_length:l,return_tensor:u,...f});return d?e:e.input_ids}return g}};function Nu(e,t,n,r){if(!(`language_codes`in e)||!Array.isArray(e.language_codes))throw Error("Tokenizer must have `language_codes` attribute set and it should be an array of language ids.");if(!(`languageRegex`in e)||!(e.languageRegex instanceof RegExp))throw Error("Tokenizer must have `languageRegex` attribute set and it should be a regular expression.");if(!(`lang_to_token`in e)||typeof e.lang_to_token!=`function`)throw Error("Tokenizer must have `lang_to_token` attribute set and it should be a function.");let i=r.src_lang,a=r.tgt_lang;if(!e.language_codes.includes(a))throw Error(`Target language code "${a}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);if(i!==void 0){if(!e.language_codes.includes(i))throw Error(`Source language code "${i}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);let t=e._tokenizer.post_processor?.config;if(t&&`single`in t){for(let n of t.single)if(`SpecialToken`in n&&e.languageRegex.test(n.SpecialToken.id)){n.SpecialToken.id=e.lang_to_token(i);break}}}return r.forced_bos_token_id=e._tokenizer.token_to_id(e.lang_to_token(a)),e._call(t,n)}var Pu={};Sr(Pu,{AlbertTokenizer:()=>Fu,AutoTokenizer:()=>W,BartTokenizer:()=>Iu,BertTokenizer:()=>Lu,BlenderbotSmallTokenizer:()=>Ru,BlenderbotTokenizer:()=>zu,BloomTokenizer:()=>Bu,CLIPTokenizer:()=>Hu,CamembertTokenizer:()=>Vu,CodeGenTokenizer:()=>Wu,CodeLlamaTokenizer:()=>Uu,CohereAsrTokenizer:()=>Ku,CohereTokenizer:()=>Gu,ConvBertTokenizer:()=>qu,DebertaTokenizer:()=>Yu,DebertaV2Tokenizer:()=>Ju,DistilBertTokenizer:()=>Xu,ElectraTokenizer:()=>Zu,EsmTokenizer:()=>Qu,FalconTokenizer:()=>$u,GPT2Tokenizer:()=>nd,GPTNeoXTokenizer:()=>td,GemmaTokenizer:()=>ed,HerbertTokenizer:()=>rd,LlamaTokenizer:()=>id,M2M100Tokenizer:()=>ad,MBart50Tokenizer:()=>cd,MBartTokenizer:()=>sd,MPNetTokenizer:()=>dd,MarianTokenizer:()=>od,MgpstrTokenizer:()=>ld,MobileBertTokenizer:()=>ud,NllbTokenizer:()=>fd,NougatTokenizer:()=>pd,PreTrainedTokenizer:()=>U,Qwen2Tokenizer:()=>md,RoFormerTokenizer:()=>gd,RobertaTokenizer:()=>hd,SiglipTokenizer:()=>_d,SpeechT5Tokenizer:()=>vd,SqueezeBertTokenizer:()=>yd,T5Tokenizer:()=>bd,TokenizersBackend:()=>U,VitsTokenizer:()=>Sd,Wav2Vec2CTCTokenizer:()=>Cd,WhisperTokenizer:()=>Ad,XLMRobertaTokenizer:()=>jd,XLMTokenizer:()=>Md});var Fu=class extends U{return_token_type_ids=!0},Iu=class extends U{},Lu=class extends U{return_token_type_ids=!0},Ru=class extends U{},zu=class extends U{},Bu=class extends U{},Vu=class extends U{},Hu=class extends U{},Uu=class extends U{},Wu=class extends U{},Gu=class extends U{},Ku=class extends U{},qu=class extends U{return_token_type_ids=!0},Ju=class extends U{return_token_type_ids=!0},Yu=class extends U{return_token_type_ids=!0},Xu=class extends U{},Zu=class extends U{return_token_type_ids=!0},Qu=class extends U{},$u=class extends U{},ed=class extends U{},td=class extends U{},nd=class extends U{},rd=class extends U{return_token_type_ids=!0},id=class extends U{padding_side=`left`},ad=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^__[a-z]{2,3}__$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e.slice(2,-2)),this.lang_to_token=e=>`__${e}__`}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},od=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^(>>\w+<<)\s*/g,this.supported_language_codes=Array.from(this.get_vocab().keys()).filter(e=>this.languageRegex.test(e)),A.warn('WARNING: `MarianTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}_encode_text(e){if(e===null)return null;let[t,...n]=e.trim().split(this.languageRegex);if(n.length===0)return super._encode_text(t);if(n.length===2){let[e,t]=n;return this.supported_language_codes.includes(e)||A.warn(`Unsupported language code "${e}" detected, which may lead to unexpected behavior. Should be one of: ${JSON.stringify(this.supported_language_codes)}`),ai([e],super._encode_text(t))}}},sd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{2}_[A-Z]{2}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},cd=class extends sd{},ld=class extends U{},ud=class extends U{return_token_type_ids=!0},dd=class extends U{},fd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{3}_[A-Z][a-z]{3}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},pd=class extends U{},md=class extends U{},hd=class extends U{},gd=class extends U{return_token_type_ids=!0},_d=class extends U{},vd=class extends U{},yd=class extends U{return_token_type_ids=!0},bd=class extends U{},xd=class extends mo{decode_chain(e){let t=``;for(let n=1;n[t,e]),[`burmese`,`my`],[`valencian`,`ca`],[`flemish`,`nl`],[`haitian`,`ht`],[`letzeburgesch`,`lb`],[`pushto`,`ps`],[`panjabi`,`pa`],[`moldavian`,`ro`],[`moldovan`,`ro`],[`sinhalese`,`si`],[`castilian`,`es`]]);function Dd(e){e=e.toLowerCase();let t=Ed.get(e);if(t===void 0){let n=e.match(/^<\|([a-z]{2})\|>$/);if(n&&(e=n[1]),Td.has(e))t=e;else{let t=e.length===2?Td.keys():Td.values();throw Error(`Language "${e}" is not supported. Must be one of: ${JSON.stringify(Array.from(t))}`)}}return t}var Od=/* @__PURE__ */ RegExp(`^[\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E]+$`,`gu`),kd=.1,Ad=class extends U{get timestamp_begin(){return this._tokenizer.token_to_id(`<|notimestamps|>`)+1}_decode_asr(e,{return_timestamps:t=!1,return_language:n=!1,time_precision:r=null,force_full_sequences:i=!0}={}){if(r===null)throw Error(`Must specify time_precision`);let a=null,o=t===`word`;function s(){return{language:a,timestamp:[null,null],text:``}}let c=[],l=s(),u=0,d=this.timestamp_begin,f=d+1500,p=[],m=[],h=!1,g=null,_=new Set(this.all_special_ids);for(let n of e){let e=n.tokens,i=o?n.token_timestamps:null,v=null,y=d;if(`stride`in n){let[t,i,a]=n.stride;if(u-=i,g=t-a,i&&(y=i/r+d),a)for(let t=e.length-1;t>=0;--t){let n=Number(e[t]);if(n>=d){if(v!==null&&(n-d)*r=d&&g<=f){let e=hl((g-d)*r+u,2);if(v!==null&&g>=v)h=!0;else if(h||p.length>0&&g0&&l.timestamp[1]!==null))for(let e of l.words)e.timestamp[1]>l.timestamp[1]&&l.timestamp[1]>=e.timestamp[0]&&(e.timestamp[1]=l.timestamp[1]);c.push(l),p=[],b=[],m=[],x=[],l=s()}}else if(b.push(g),o){let e=hl(i[n]+u,2),t;if(n+10?(p.push(b),o&&m.push(x)):p.every(e=>e.length===0)&&(l=s(),p=[],b=[],m=[],x=[])}if(p.length>0){if(i&&t)throw Error(`Whisper did not predict an ending timestamp, which can happen if audio is cut off in the middle of a word. Also make sure WhisperTimeStampLogitsProcessor was used during generation.`);let[e,n]=this.findLongestCommonSequence(p,m),r=this.decode(e);l.text=r,o&&(l.words=this.collateWordTimestamps(e,n,a)),c.push(l)}let v=/* @__PURE__ */ Object.create(null),y=c.map(e=>e.text).join(``);if(t||n){for(let e=0;e0,o=a?[]:null,s=a?t[0]:null;for(let c=1;ce===g[n]&&s[i+n][0]-kd<=t[c][m+n][0]).length:p.filter((e,t)=>e===g[t]).length;let v=e/1e4,y=_/e+v;_>1&&y>u&&(u=y,d=[i,o,m,h])}let[p,m,h,g]=d,_=Math.floor((m+p)/2),v=Math.floor((g+h)/2);if(a&&u===0&&r>0){let e=s[r-1][0],n=t[c].findIndex(t=>t[0]>=e);v=n===-1?l.length:n}i.push(...n.slice(0,_)),n=l.slice(v),r=n.length,a&&(o.push(...s.slice(0,_)),s=t[c].slice(v))}return i.push(...n),a?(o.push(...s),[i,o]):[i,[]]}collateWordTimestamps(e,t,n){let[r,i,a]=this.combineTokensIntoWords(e,n),o=[];for(let e=0;e=r){let e=((t-r)*n).toFixed(2);i.push(`<|${e}|>`),i.push([])}else i[i.length-1].push(t);return i=i.map(e=>typeof e==`string`?e:super.decode(e,t)),i.join(``)}splitTokensOnUnicode(e){let t=this.decode(e,{decode_with_timestamps:!0}),n=[],r=[],i=[],a=[],o=[],s=0;for(let c=0;c=this._tokenizer.token_to_id(`<|endoftext|>`),d=s.startsWith(` `),f=s.trim(),p=Od.test(f);if(u||d||p||i.length===0)i.push(s),a.push(c),o.push(l);else{let e=i.length-1;i[e]+=s,a[e].push(...c),o[e].push(...l)}}return[i,a,o]}mergePunctuations(e,t,n,r,i){let a=structuredClone(e),o=structuredClone(t),s=structuredClone(n),c=a.length-2,l=a.length-1;for(;c>=0;)a[c].startsWith(` `)&&r.includes(a[c].trim())?(a[l]=a[c]+a[l],o[l]=ai(o[c],o[l]),s[l]=ai(s[c],s[l]),a[c]=``,o[c]=[],s[c]=[]):l=c,--c;for(c=0,l=1;le),o.filter(e=>e.length>0),s.filter(e=>e.length>0)]}},jd=class extends U{},Md=class extends U{return_token_type_ids=!0;constructor(e,t){super(e,t),A.warn('WARNING: `XLMTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}},W=class{static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let[o,s]=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a}),c=s.tokenizer_class?.replace(/Fast$/,``)??`PreTrainedTokenizer`,l=Pu[c];return l||=(A.warn(`Unknown tokenizer class "${c}", attempting to construct from base class.`),U),new l(o,s)}},Nd=`https://github.com/huggingface/transformers.js/issues/new/choose`,Pd=`preprocessor_config.json`,Fd=`preprocessor_config.json`,Id=`processor_config.json`,Ld=`chat_template.jinja`,G=class extends $r{static classes=[`image_processor_class`,`tokenizer_class`,`feature_extractor_class`];static uses_processor_config=!1;static uses_chat_template_file=!1;constructor(e,t,n){super(),this.config=e,this.components=t,this.chat_template=n}get image_processor(){return this.components.image_processor}get tokenizer(){return this.components.tokenizer}get feature_extractor(){return this.components.feature_extractor}apply_chat_template(e,t={}){if(!this.tokenizer)throw Error(`Unable to apply chat template without a tokenizer.`);return this.tokenizer.apply_chat_template(e,{tokenize:!1,chat_template:this.chat_template??void 0,...t})}batch_decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.batch_decode(...e)}decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.decode(...e)}async _call(e,...t){for(let n of[this.image_processor,this.feature_extractor,this.tokenizer])if(n)return n(e,...t);throw Error(`No image processor, feature extractor, or tokenizer found.`)}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([this.uses_processor_config?rl(e,Id,!0,t):{},Promise.all(this.classes.filter(e=>e in this).map(async n=>{let r=await this[n].from_pretrained(e,t);return[n.replace(/_class$/,``),r]})).then(Object.fromEntries),this.uses_chat_template_file?nl(e,Ld,!0,t):null]);return new this(n,r,i)}};Sr({},{ChatterboxProcessor:()=>Mf,CohereAsrProcessor:()=>Pf,Florence2Processor:()=>Sm,Gemma3Processor:()=>Cm,Gemma3nProcessor:()=>wm,Gemma4Processor:()=>Tm,Glm46VProcessor:()=>Dm,GraniteSpeechProcessor:()=>Om,GroundingDinoProcessor:()=>Am,Idefics3Processor:()=>Pm,JinaCLIPProcessor:()=>Im,Lfm2VlProcessor:()=>Lm,LlavaProcessor:()=>Rm,MgpstrProcessor:()=>Bm,MoonshineProcessor:()=>Vm,OwlViTProcessor:()=>Hm,PaliGemmaProcessor:()=>Gm,Phi3VProcessor:()=>Jm,PixtralProcessor:()=>Ym,Processor:()=>G,PyAnnoteProcessor:()=>Xm,Qwen2VLProcessor:()=>Em,Qwen2_5_VLProcessor:()=>Zm,Qwen3VLProcessor:()=>Qm,Sam2Processor:()=>eh,Sam2VideoProcessor:()=>th,SamProcessor:()=>$m,SmolVLMProcessor:()=>Pm,SpeechT5Processor:()=>nh,UltravoxProcessor:()=>rh,VLChatProcessor:()=>Fm,VoxtralProcessor:()=>ch,VoxtralRealtimeProcessor:()=>mh,Wav2Vec2Processor:()=>hh,Wav2Vec2ProcessorWithLM:()=>gh,WhisperProcessor:()=>_h});var Rd=class extends $r{constructor(e){super(),this.config=e}static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t);return new this(n)}};function zd(e,t){if(!(e instanceof Float32Array||e instanceof Float64Array))throw Error(`${t} expects input to be a Float32Array or a Float64Array, but got ${e?.constructor?.name??typeof e} instead. If using the feature extractor directly, remember to use \`load_audio(url, sampling_rate)\` to obtain the raw audio data of the file/url.`)}var Bd={};Sr(Bd,{ASTFeatureExtractor:()=>df,ChatterboxFeatureExtractor:()=>pf,ClapFeatureExtractor:()=>mf,CohereAsrFeatureExtractor:()=>_f,DacFeatureExtractor:()=>vf,EncodecFeatureExtractor:()=>ff,FeatureExtractor:()=>Rd,Gemma3nAudioFeatureExtractor:()=>yf,Gemma4AudioFeatureExtractor:()=>bf,GraniteSpeechFeatureExtractor:()=>xf,MoonshineFeatureExtractor:()=>Sf,ParakeetFeatureExtractor:()=>gf,PyAnnoteFeatureExtractor:()=>Cf,SeamlessM4TFeatureExtractor:()=>wf,SnacFeatureExtractor:()=>Tf,SpeechT5FeatureExtractor:()=>Ef,VoxtralRealtimeFeatureExtractor:()=>kf,Wav2Vec2FeatureExtractor:()=>Df,WeSpeakerFeatureExtractor:()=>Of,WhisperFeatureExtractor:()=>Af});var Vd={fromWeb:()=>{}};async function Hd(e,t){if(O.IS_BROWSER_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save a file from a Web Worker.`);let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e,r.click(),r.remove(),URL.revokeObjectURL(n)}else if(O.IS_FS_AVAILABLE){let n=t.stream();Vd.fromWeb(n),Cr.createWriteStream(e),await void 0}else throw Error(`Unable to save because filesystem is disabled in this environment.`)}async function Ud(e,t){if(typeof AudioContext>`u`)throw Error("Unable to load audio from path/URL since `AudioContext` is not available in your environment. Instead, audio data should be passed directly to the pipeline/processor. For more information and some example code, see https://huggingface.co/docs/transformers.js/guides/node-audio-processing.");let n=await(await Jc(e)).arrayBuffer(),r=new AudioContext({sampleRate:t});t===void 0&&A.warn(`No sampling rate provided, using default of ${r.sampleRate}Hz.`);let i=await r.decodeAudioData(n),a;if(i.numberOfChannels===2){let e=Math.sqrt(2),t=i.getChannelData(0),n=i.getChannelData(1);a=new Float32Array(t.length);for(let r=0;r2595*Math.log10(1+e/700),kaldi:e=>1127*Math.log(1+e/700),slaney:(e,t=1e3,n=15,r=27/Math.log(6.4))=>e>=t?n+Math.log(e/t)*r:3*e/200};function Yd(e,t=`htk`){let n=Jd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}var Xd={htk:e=>700*(10**(e/2595)-1),kaldi:e=>700*(Math.exp(e/1127)-1),slaney:(e,t=1e3,n=15,r=Math.log(6.4)/27)=>e>=n?t*Math.exp(r*(e-n)):200*e/3};function Zd(e,t=`htk`){let n=Xd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}function Qd(e,t){let n=Float64Array.from({length:t.length-1},(e,n)=>t[n+1]-t[n]),r=Array.from({length:e.length},()=>Array(t.length));for(let n=0;nArray(e.length));for(let t=0;te+r*n)}function ef(e,t,n,r,i,a=null,o=`htk`,s=!1){if(a!==null&&a!==`slaney`)throw Error(`norm must be one of null or "slaney"`);if(e<2)throw Error(`Require num_frequency_bins: ${e} >= 2`);if(n>r)throw Error(`Require min_frequency: ${n} <= max_frequency: ${r}`);let c=$d(Yd(n,o),Yd(r,o),t+2),l=Zd(c,o),u;if(s){let t=i/((e-1)*2);u=Yd(Float64Array.from({length:e},(e,n)=>n*t),o),l=c}else u=$d(0,Math.floor(i/2),e);let d=Qd(u,l);if(a!==null&&a===`slaney`)for(let n=0;ni)throw Error(`frame_length (${n}) may not be larger than fft_length (${i})`);if(w!==n)throw Error(`Length of the window (${w}) must equal frame_length (${n})`);if(r<=0)throw Error(`hop_length must be greater than zero`);if(a===null&&d!==null)throw Error("You have provided `mel_filters` but `power` is `None`. Mel spectrogram computation is not yet supported for complex-valued spectrogram. Specify `power` to fix this issue.");if(!u)throw Error("`preemphasis_htk_flavor=false` is not currently supported.");if(o){let t=Math.floor(n/2);switch(s){case`reflect`:e=tf(e,t,t);break;case`constant`:{let n=new e.constructor(e.length+2*t);n.set(e,t),e=n;break}case`semicausal`:{let n=new e.constructor(e.length+t);n.set(e,t),e=n;break}default:throw Error(`pad_mode="${s}" not implemented yet.`)}}let te=Math.floor(1+Math.floor((e.length-n)/r));y!==null&&tete?x&&(ie=b):ie=re=b);let ae=new pl(i),oe=new Float64Array(i),se=new Float64Array(ae.outputBufferSize),ce=new Float32Array(ne*ie);for(let i=0;i=1;--e)oe[e]-=l*oe[e-1];oe[0]*=1-l}for(let e=0;ee**.85);break;default:throw Error(`Unknown window type ${t}.`)}if(n&&(o=o.subarray(0,e)),r===null||e===r)return o;if(e>r)throw Error(`Length of the window (${e}) may not be larger than frame_length (${r})`);let s=new Float64Array(r),c=i?Math.floor((r-e)/2):0;return s.set(o,c),s}function cf(e,t){let n=e.reduce((e,t)=>e+t.length,0),r=/* @__PURE__ */ new ArrayBuffer(44),i=new DataView(r);return lf(i,0,`RIFF`),i.setUint32(4,36+n*4,!0),lf(i,8,`WAVE`),lf(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,3,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*4,!0),i.setUint16(32,4,!0),i.setUint16(34,32,!0),lf(i,36,`data`),i.setUint32(40,n*4,!0),new Blob([r,...e.map(e=>e.buffer instanceof ArrayBuffer?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e.slice())],{type:`audio/wav`})}function lf(e,t,n){for(let r=0;re+t.length,0),t=new Float32Array(e),n=0;for(let e of this.audio)t.set(e,n),n+=e.length;return t}return this.audio}toBlob(){let e=this.audio;return e instanceof Float32Array&&(e=[e]),cf(e,this.sampling_rate)}async save(e){return Hd(e,this.toBlob())}},df=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hann`,{periodic:!1}),this.mean=this.config.mean,this.std=this.config.std}async _extract_fbank_features(e,t){return of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e){zd(e,`ASTFeatureExtractor`);let t=await this._extract_fbank_features(e,this.config.max_length);if(this.config.do_normalize){let e=this.std*2,n=t.data;for(let t=0;t0){if(n===`rand_trunc`){let n=Math.floor(bc.random()*(a+1));e=e.subarray(n,n+t),i=await this._extract_fbank_features(e,this.mel_filters_slaney,this.config.nb_max_samples)}else throw Error(`Truncation strategy "${n}" not implemented`)}else{if(a<0){let n=new Float64Array(t);if(n.set(e),r===`repeat`)for(let r=e.length;r=1;--n)e[n]-=t*e[n-1];return await of(e,this.window,this.window.length,this.config.hop_length,{fft_length:this.config.n_fft,power:2,mel_filters:this.config.mel_filters,log_mel:`log`,mel_floor:-1/0,pad_mode:`constant`,center:!0,transpose:!0,mel_offset:2**-24})}async _call(e){zd(e,`ParakeetFeatureExtractor`);let t=await this._extract_fbank_features(e),n=Math.floor((e.length+Math.floor(this.config.n_fft/2)*2-this.config.n_fft)/this.config.hop_length),r=t.data;r.fill(0,n*t.dims[1]);let[i,a]=t.dims,o=new Float64Array(a),s=new Float64Array(a);for(let e=0;e1?n-1:1;for(let e=0;e=l){s.push(e.slice(c,l));break}let t=Math.max(c,c+a-o),n=Math.min(c+a,l),i;i=n<=t?c+a:this._find_split_point_energy(e,t,n,r),i=Math.max(c+1,Math.min(i,l)),s.push(e.slice(c,i)),c=i}return s}_find_split_point_energy(e,t,n,r){let i=n-t;if(i<=r)return Math.floor((t+n)/2);let a=1/0,o=t,s=i-r;for(let n=0;n<=s;n+=r){let i=0;for(let a=0;at&&(e=e.slice(0,t)),r&&e.length%i!==0){let t=i-e.length%i,n=new Float64Array(e.length+t);n.set(e),this.config.padding_value!==0&&n.fill(this.config.padding_value,e.length),e=n}let a=await this._extract_fbank_features(e,this.config.max_length),o=_u([1,a.dims[0]],!0);return{input_features:a.unsqueeze_(0),input_features_mask:o}}},bf=class extends yf{async _extract_fbank_features(e,t){let{frame_length:n,hop_length:r,fft_length:i}=this.config,a=Math.floor(n/2),o=Math.floor((e.length+a-(n+1))/r)+1;return of(e,this.window,n,r,{fft_length:i,center:!0,pad_mode:`semicausal`,onesided:!0,preemphasis:this.config.preemphasis,preemphasis_htk_flavor:this.config.preemphasis_htk_flavor,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:this.config.mel_floor,mel_floor_mode:`add`,remove_dc_offset:!1,transpose:!0,max_num_frames:o})}async _call(e,t={}){zd(e,`Gemma4AudioFeatureExtractor`);let n=e.length,r=await super._call(e,t),{input_features:i}=r,[,a,o]=i.dims,{frame_length:s,hop_length:c}=this.config,l=Math.floor(s/2),u=s+1,d=new Uint8Array(n+l+(t.pad_to_multiple_of??128));d.fill(1,l,l+n);let f=new Uint8Array(a);for(let e=0;e({id:e,start:t*n,end:r*n,confidence:i/(r-t)})))}return r}},wf=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`povey`,{periodic:!1})}async _extract_fbank_features(e,t){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e,{padding:t=!0,pad_to_multiple_of:n=2,do_normalize_per_mel_bins:r=!0,return_attention_mask:i=!0}={}){zd(e,`SeamlessM4TFeatureExtractor`);let a=await this._extract_fbank_features(e,this.config.max_length);if(r){let[e,t]=a.dims,n=a.data;for(let r=0;r0){let n=new Float32Array(t*(e+s));n.set(r),n.fill(this.config.padding_value,r.length);let c=e+s;a=new V(a.type,n,[c,t]),i&&(o=new V(`int64`,new BigInt64Array(c),[1,c]),o.data.fill(1n,0,e))}}let[s,c]=a.dims,l=this.config.stride;if(s%l!==0)throw Error(`The number of frames (${s}) must be a multiple of the stride (${l}).`);let u=a.view(1,Math.floor(s/l),c*l),d={input_features:u};if(i){let e=u.dims[1],t=new BigInt64Array(e);if(o){let e=o.data;for(let n=1,r=0;ne+t,0)/e.length,n=e.reduce((e,n)=>e+(n-t)**2,0)/e.length;return e.map(e=>(e-t)/Math.sqrt(n+1e-7))}async _call(e){zd(e,`Wav2Vec2FeatureExtractor`),e instanceof Float64Array&&(e=new Float32Array(e));let t=e;this.config.do_normalize&&(t=this._zero_mean_unit_var_norm(t));let n=[1,t.length];return{input_values:new V(`float32`,t,n),attention_mask:new V(`int64`,new BigInt64Array(t.length).fill(1n),n)}}},Of=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hamming`,{periodic:!1}),this.min_num_frames=this.config.min_num_frames}async _extract_fbank_features(e){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,transpose:!0,min_num_frames:this.min_num_frames})}async _call(e){zd(e,`WeSpeakerFeatureExtractor`);let t=(await this._extract_fbank_features(e)).unsqueeze_(0);if(this.config.fbank_centering_span===null){let e=t.mean(1).data,n=t.data,[r,i,a]=t.dims;for(let t=0;tr?(e.length>this.config.n_samples&&A.warn("Attempting to extract features for audio longer than 30 seconds. If using a pipeline to extract transcript from a long audio clip, remember to specify `chunk_length_s` and/or `stride_length_s`."),n=e.slice(0,r)):(n=new Float32Array(r),n.set(e)),{input_features:(await this._extract_fbank_features(n)).unsqueeze_(0)}}},jf=class{static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t),r=n.feature_extractor_type,i=Bd[r];if(!i)throw Error(`Unknown feature_extractor_type: '${r}'. Please report this at ${Nd}.`);return new i(n)}},Mf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;async _call(e,t=null){let n=this.tokenizer(e),r=t?await this.feature_extractor(t):{};return{...n,...r}}},Nf=/* @__PURE__ */ new Set([`ja`,`zh`]),Pf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;get_decoder_prompt_ids(e=`en`){let t=[`▁`,`<|startofcontext|>`,`<|startoftranscript|>`,`<|emo:undefined|>`,`<|${e}|>`,`<|${e}|>`,`<|pnc|>`,`<|noitn|>`,`<|notimestamp|>`,`<|nodiarize|>`];return this.tokenizer.convert_tokens_to_ids(t)}static join_chunks(e,t=`en`){let n=e.filter(e=>e&&e.trim());if(n.length===0)return``;let r=Nf.has(t)?``:` `;return[n[0].trimEnd(),...n.slice(1).map(e=>e.trim())].join(r)}async _call(e){return await this.feature_extractor(e)}},Ff={},If,Lf,Rf;if(O.IS_WEB_ENV)If=(e,t)=>{if(!self.OffscreenCanvas)throw Error(`OffscreenCanvas not supported by this environment.`);return new self.OffscreenCanvas(e,t)},Rf=self.createImageBitmap,Lf=self.ImageData;else if(Ff)Rf=async e=>{let t=(await e.metadata()).channels,{data:n,info:r}=await e.rotate().raw().toBuffer({resolveWithObject:!0}),i=new Vf(new Uint8ClampedArray(n),r.width,r.height,r.channels);return t!==void 0&&t!==r.channels&&i.convert(t),i};else throw Error(`Unable to load image processing library.`);var zf={0:`nearest`,1:`lanczos`,2:`bilinear`,3:`bicubic`,4:`box`,5:`hamming`},Bf=/* @__PURE__ */ new Map([[`png`,`image/png`],[`jpg`,`image/jpeg`],[`jpeg`,`image/jpeg`],[`gif`,`image/gif`]]),Vf=class e{constructor(e,t,n,r){this.data=e,this.width=t,this.height=n,this.channels=r}get size(){return[this.width,this.height]}static async read(t){if(t instanceof e)return t;if(typeof t==`string`||t instanceof URL)return await this.fromURL(t);if(t instanceof Blob)return await this.fromBlob(t);if(typeof HTMLCanvasElement<`u`&&t instanceof HTMLCanvasElement||typeof OffscreenCanvas<`u`&&t instanceof OffscreenCanvas)return this.fromCanvas(t);throw Error(`Unsupported input type: ${typeof t}`)}static fromCanvas(t){if(!O.IS_WEB_ENV)throw Error(`fromCanvas() is only supported in browser environments.`);let n=t.getContext(`2d`).getImageData(0,0,t.width,t.height).data;return new e(n,t.width,t.height,4)}static async fromURL(e){let t=await Jc(e);if(t.status!==200)throw Error(`Unable to read image from "${e}" (${t.status} ${t.statusText})`);let n=await t.blob();return this.fromBlob(n)}static async fromBlob(e){if(O.IS_WEB_ENV){let t=await Rf(e),n=If(t.width,t.height).getContext(`2d`);return n.drawImage(t,0,0),new this(n.getImageData(0,0,t.width,t.height).data,t.width,t.height,4)}{let t=Ff(await e.arrayBuffer());return await Rf(t)}}static fromTensor(t,n=`CHW`){if(t.dims.length!==3)throw Error(`Tensor should have 3 dimensions, but has ${t.dims.length} dimensions.`);if(n===`CHW`)t=t.permute(1,2,0);else if(n!==`HWC`)throw Error(`Unsupported channel format: ${n}`);if(!(t.data instanceof Uint8ClampedArray||t.data instanceof Uint8Array))throw Error(`Unsupported tensor type: ${t.type}`);switch(t.dims[2]){case 1:case 2:case 3:case 4:return new e(t.data,t.dims[1],t.dims[0],t.dims[2]);default:throw Error(`Unsupported number of channels: ${t.dims[2]}`)}}grayscale(){if(this.channels===1)return this;let e=new Uint8ClampedArray(this.width*this.height*1);switch(this.channels){case 3:case 4:for(let t=0,n=0;t=0?c=r:u=-r,i>=0?l=i:d=-i,s.drawImage(o,c,l,t,n,u,d,t,n),new e(s.getImageData(0,0,t,n).data,t,n,4).convert(a)}{let e=this.toSharp();if(r>=0&&i>=0)e=e.extract({left:Math.floor(r),top:Math.floor(i),width:t,height:n});else if(r<=0&&i<=0){let a=Math.floor(-i),o=Math.floor(-r);e=e.extend({top:a,left:o,right:t-this.width-o,bottom:n-this.height-a})}else{let a=[0,0],o=0;i<0?(a[0]=Math.floor(-i),a[1]=n-this.height-a[0]):o=Math.floor(i);let s=[0,0],c=0;r<0?(s[0]=Math.floor(-r),s[1]=t-this.width-s[0]):c=Math.floor(r),e=e.extend({top:a[0],bottom:a[1],left:s[0],right:s[1]}).extract({left:c,top:o,width:t,height:n})}return await Rf(e)}}async toBlob(e=`image/png`,t=1){if(!O.IS_WEB_ENV)throw Error(`toBlob() is only supported in browser environments.`);return await this.toCanvas().convertToBlob({type:e,quality:t})}toTensor(e=`CHW`){let t=new V(`uint8`,new Uint8Array(this.data),[this.height,this.width,this.channels]);if(e!==`HWC`){if(e===`CHW`)t=t.permute(2,0,1);else throw Error(`Unsupported channel format: ${e}`)}return t}toCanvas(){if(!O.IS_WEB_ENV)throw Error(`toCanvas() is only supported in browser environments.`);let e=this.clone().rgba(),t=If(e.width,e.height),n=new Lf(e.data,e.width,e.height);return t.getContext(`2d`).putImageData(n,0,0),t}split(){let{data:t,width:n,height:r,channels:i}=this,a=t.constructor,o=t.length/i,s=Array.from({length:i},()=>new a(o));for(let e=0;enew e(t,n,r,1))}_update(e,t,n,r=null){return this.data=e,this.width=t,this.height=n,r!==null&&(this.channels=r),this}clone(){return new e(this.data.slice(),this.width,this.height,this.channels)}convert(e){if(this.channels===e)return this;switch(e){case 1:this.grayscale();break;case 3:this.rgb();break;case 4:this.rgba();break;default:throw Error(`Conversion failed due to unsupported number of channels: ${this.channels}`)}return this}async save(e){if(O.IS_WEB_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save an image from a Web Worker.`);let t=e.split(`.`).pop().toLowerCase(),n=Bf.get(t)??`image/png`;return Hd(e,await this.toBlob(n))}if(O.IS_FS_AVAILABLE)await this.toSharp().toFile(e);else throw Error(`Unable to save the image because filesystem is disabled in this environment.`)}toSharp(){if(O.IS_WEB_ENV)throw Error(`toSharp() is only supported in server-side environments.`);return Ff(this.data,{raw:{width:this.width,height:this.height,channels:this.channels}})}};Vf.read.bind(Vf);function Hf(e,t,n=0,r=null){let i=e/t,a=gl(i)*t;return r!==null&&a>r&&(a=Math.floor(i)*t),at&&i.push(e)}else{let e=ll(n.data)[1];if(e===c-1||(a=ol(n.data),a[e]e*o[(t+1)%2])),u.boxes.push(n),u.classes.push(t),u.scores.push(a[t])}}l.push(u)}return l}function Kf(e,t=null){let n=e.logits,r=n.dims[0];if(t!==null&&t.length!==r)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let i=[];for(let e=0;el[n]&&(l[n]=t[n],u[n]=e)}let d=Array(a.dims[0]);for(let e=0;ee!==void 0);i.push({segmentation:c,labels:f})}return i}function qf(e,t,n,r){let i=[],a=[],o=[];for(let s=0;sn&&(i.push(l),a.push(d),o.push(u))}return[i,a,o]}function Jf(e,t,n,r=.5,i=.8){let a=[],o=0,s=0,c=t[n].data;for(let t=0;t=r&&++s;let l=o>0&&s>0;return l&&=o/s>i,[l,a]}function Yf(e,t,n,r,i,a=null,o=null){let[s,c]=o??e[0].dims,l=new V(`int32`,new Int32Array(s*c),[s,c]),u=[];if(o!==null)for(let t=0;tf[e]&&(d[e]=n,f[e]=i[e])}let p=0,m=l.data;for(let a=0;a200)throw Error(`absolute aspect ratio must be smaller than 200, got ${Math.max(e,t)/Math.min(e,t)}`);let o=Math.round(e/n)*n,s=Math.round(t/n)*n;if(a*o*s>i){let r=Math.sqrt(a*e*t/i);o=Math.max(n,Math.floor(e/r/n)*n),s=Math.max(n,Math.floor(t/r/n)*n)}else if(a*o*si?c=Math.floor(i*s/r):i>r&&(s=Math.floor(r*c/i)),await e.resize(c,s,{resample:n}))}async crop_margin(e,t=200){let n=e.clone().grayscale(),r=cl(n.data)[0],i=ll(n.data)[0]-r;if(i===0)return e;let a=t/255,o=n.width,s=n.height,c=0,l=0,u=n.data;for(let e=0;ethis.preprocess(e)));return{pixel_values:du(n.map(e=>e.pixel_values),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}static async from_pretrained(e,t={}){let n=await rl(e,Fd,!0,t);return new this(n)}},$f={};Sr($f,{BeitFeatureExtractor:()=>ep,BitImageProcessor:()=>tp,CHMv2ImageProcessor:()=>rp,CLIPFeatureExtractor:()=>ap,CLIPImageProcessor:()=>ip,ChineseCLIPFeatureExtractor:()=>np,ConvNextFeatureExtractor:()=>sp,ConvNextImageProcessor:()=>op,DINOv3ViTImageProcessor:()=>fp,DPTFeatureExtractor:()=>gp,DPTImageProcessor:()=>hp,DeiTFeatureExtractor:()=>lp,DeiTImageProcessor:()=>cp,DetrFeatureExtractor:()=>dp,DetrImageProcessor:()=>up,DonutFeatureExtractor:()=>mp,DonutImageProcessor:()=>pp,EfficientNetImageProcessor:()=>_p,GLPNFeatureExtractor:()=>wp,Gemma3ImageProcessor:()=>vp,Gemma4ImageProcessor:()=>xp,Glm46VImageProcessor:()=>Cp,GroundingDinoImageProcessor:()=>Tp,Idefics3ImageProcessor:()=>Ep,ImageFeatureExtractor:()=>K,ImageProcessor:()=>K,JinaCLIPImageProcessor:()=>Op,Lfm2VlImageProcessor:()=>Pp,LlavaOnevisionImageProcessor:()=>Fp,Mask2FormerImageProcessor:()=>Rp,MaskFormerFeatureExtractor:()=>Lp,MaskFormerImageProcessor:()=>Ip,MobileNetV1FeatureExtractor:()=>Bp,MobileNetV1ImageProcessor:()=>zp,MobileNetV2FeatureExtractor:()=>Hp,MobileNetV2ImageProcessor:()=>Vp,MobileNetV3FeatureExtractor:()=>Wp,MobileNetV3ImageProcessor:()=>Up,MobileNetV4FeatureExtractor:()=>Kp,MobileNetV4ImageProcessor:()=>Gp,MobileViTFeatureExtractor:()=>Jp,MobileViTImageProcessor:()=>qp,NougatImageProcessor:()=>Yp,OwlViTFeatureExtractor:()=>Zp,OwlViTImageProcessor:()=>Xp,Owlv2ImageProcessor:()=>Qp,Phi3VImageProcessor:()=>im,PixtralImageProcessor:()=>am,PvtImageProcessor:()=>om,Qwen2VLImageProcessor:()=>Sp,RTDetrImageProcessor:()=>sm,Sam2ImageProcessor:()=>cm,Sam3ImageProcessor:()=>cm,SamImageProcessor:()=>cm,SapiensFeatureExtractor:()=>um,SapiensImageProcessor:()=>lm,SegformerFeatureExtractor:()=>fm,SegformerImageProcessor:()=>dm,SiglipImageProcessor:()=>pm,SmolVLMImageProcessor:()=>Ep,Swin2SRImageProcessor:()=>mm,VLMImageProcessor:()=>Dp,ViTFeatureExtractor:()=>gm,ViTImageProcessor:()=>hm,VitMatteImageProcessor:()=>_m,VitPoseImageProcessor:()=>vm,YolosFeatureExtractor:()=>bm,YolosImageProcessor:()=>ym});var ep=class extends K{},tp=class extends K{},np=class extends K{},rp=class extends K{},ip=class extends K{},ap=class extends ip{},op=class extends K{constructor(e){super(e),this.crop_pct=this.config.crop_pct??224/256}async resize(e){let t=this.size?.shortest_edge;if(t===void 0)throw Error(`Size dictionary must contain 'shortest_edge' key.`);if(t<384){let n=Math.floor(t/this.crop_pct),[r,i]=this.get_resize_output_image_size(e,{shortest_edge:n});e=await e.resize(r,i,{resample:this.resample}),e=await e.center_crop(t,t)}else e=await e.resize(t,t,{resample:this.resample});return e}},sp=class extends op{},cp=class extends K{},lp=class extends cp{},up=class extends K{async _call(e){let t=await super._call(e),n=_u([t.pixel_values.dims[0],64,64],1n);return{...t,pixel_mask:n}}post_process_object_detection(...e){return Gf(...e)}post_process_panoptic_segmentation(...e){return Zf(...e)}post_process_instance_segmentation(...e){return Qf(...e)}},dp=class extends up{},fp=class extends K{},pp=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t,s=this.image_mean;Array.isArray(this.image_mean)||(s=Array(o).fill(s));let c=this.image_std;Array.isArray(c)||(c=Array(o).fill(s));let l=s.map((e,t)=>-e/c[t]);return super.pad_image(e,t,n,{center:!0,constant_values:l,...r})}},mp=class extends pp{},hp=class extends K{},gp=class extends hp{},_p=class extends K{constructor(e){super(e),this.include_top=this.config.include_top??!0,this.include_top&&(this.image_std=this.image_std.map(e=>e*e))}},vp=class extends K{};function yp(e,t,n,r,i){let a=r*n**2,o=Math.sqrt(a/(e*t)),s=i*n,c=Math.floor(o*e/s)*s,l=Math.floor(o*t/s)*s;if(c===0&&l===0)throw Error(`Attempting to resize to a 0 x 0 image. Resized height should be divisible by \`pooling_kernel_size * patch_size\`=${s}.`);let u=Math.floor(r/i**2)*s;return c===0?(c=s,l=Math.min(Math.floor(t/e)*s,u)):l===0&&(l=s,c=Math.min(Math.floor(e/t)*s,u)),[c,l]}function bp(e,t,n,r,i,a,o){let s=Math.floor(t/i),c=Math.floor(n/i),l=s*c,u=i*i*r,d=new Float32Array(a*u),f=0;for(let t=0;ta),0));let l=a.dims[0]/o,u=a.dims[1],d=Math.floor(a.dims[2]/c),f=Math.floor(a.dims[3]/c);return{pixel_values:a.view(l,o,u,Math.floor(d/s),s,c,Math.floor(f/s),s,c).permute(0,3,6,4,7,2,1,5,8).view(l*d*f,u*o*c*c),image_grid_thw:new V(`int64`,[l,d,f],[1,3]),original_sizes:r,reshaped_input_sizes:i}}},Cp=class extends Sp{get_resize_output_image_size(e,t){let n=this.patch_size*this.merge_size,r=this.config.temporal_patch_size??2;return Xf(e.height,e.width,n,this.min_pixels,this.max_pixels,r)}},wp=class extends K{},Tp=class extends K{async _call(e){let t=await super._call(e),n=t.pixel_values.dims,r=yu([n[0],n[2],n[3]]);return{...t,pixel_mask:r}}},Ep=class extends K{constructor(e){super(e),this.do_image_splitting=e.do_image_splitting??!0,this.max_image_size=e.max_image_size}get_resize_for_vision_encoder(e,t){let[n,r]=e.dims.slice(-2),i=r/n;return r>=n?(r=Math.ceil(r/t)*t,n=Math.floor(r/i),n=Math.ceil(n/t)*t):(n=Math.ceil(n/t)*t,r=Math.floor(n*i),r=Math.ceil(r/t)*t),{height:n,width:r}}async _call(e,{do_image_splitting:t=null,return_row_col_info:n=!1}={}){let r;if(!Array.isArray(e))r=[[e]];else{if(e.length===0||!e[0])throw Error(`No images provided.`);r=Array.isArray(e[0])?e:[e]}let i=[],a=[],o=[],s=[],c=[];for(let e of r){let n=await Promise.all(e.map(e=>this.preprocess(e)));s.push(...n.map(e=>e.original_size)),c.push(...n.map(e=>e.reshaped_input_size)),n.forEach(e=>e.pixel_values.unsqueeze_(0));let{longest_edge:r}=this.max_image_size,l;if(t??this.do_image_splitting){let e=Array(n.length),t=Array(n.length);l=await Promise.all(n.map(async(n,i)=>{let a=this.get_resize_for_vision_encoder(n.pixel_values,r),o=await nu(n.pixel_values,{size:[a.height,a.width]}),{frames:s,num_splits_h:c,num_splits_w:l}=await this.split_image(o,this.max_image_size);return e[i]=c,t[i]=l,H(s,0)})),a.push(e),o.push(t)}else{let e=[r,r];l=await Promise.all(n.map(t=>nu(t.pixel_values,{size:e}))),a.push(Array(n.length).fill(0)),o.push(Array(n.length).fill(0))}i.push(H(l,0))}let l=i.length,[u,d,f,p]=i[0].dims,m,h;if(l===1)m=i[0].unsqueeze_(0),h=_u([l,u,f,p],!0);else{let e=Math.max(...i.map(e=>e.dims.at(0)));h=_u([l,e,f,p],!0);let t=h.data,n=e*f*p;for(let r=0;rn||o>r){s=Math.ceil(a/n),c=Math.ceil(o/r);let t=Math.ceil(a/s),l=Math.ceil(o/c);for(let n=0;ne*this.rescale_factor)}pad_image(e,t,n,r){return super.pad_image(e,t,n,{constant_values:this.constant_values,center:!0,...r})}},Op=class extends K{constructor(e){let{resize_mode:t,fill_color:n,interpolation:r,size:i,...a}=e,o=t===`squash`?{width:i,height:i}:t===`shortest`?{shortest_edge:i}:{longest_edge:i},s=r===`bicubic`?3:2;super({...a,size:o,resample:s,do_center_crop:!0,crop_size:i,do_normalize:!0})}};function kp(e,t){return Math.round(e/t)*t}function Ap(e,t,n,r,i){let a=1/0,o=[1,1],s=n*r;for(let n of t){let t=Math.abs(e-n[0]/n[1]);t.5*i*i*n[0]*n[1]&&(o=n)}return o}function jp(e,t){let n=[],r=/* @__PURE__ */ new Set;for(let i=e;i<=t;++i)for(let a=1;a<=i;++a)for(let o=1;o<=i;++o){let i=a*o;if(i>=e&&i<=t){let e=a<<16|o;r.has(e)||(r.add(e),n.push([a,o]))}}return n.sort((e,t)=>e[0]*e[1]-t[0]*t[1])}function Mp(e,t){let[n,r,i,a]=e.dims,o=Math.floor(i/t),s=Math.floor(a/t),c=t*t*r,l=e.data,u=new Float32Array(n*o*s*c),d=i*a;for(let e=0;ethis.max_image_tokens*(this.encoder_patch_size*this.downsample_factor)**2*this.max_pixels_tolerance}_get_grid_layout(e,t){let n=jp(this.min_tiles,this.max_tiles),[r,i]=Ap(t/e,n,t,e,this.tile_size);return{grid_width:r,grid_height:i,target_width:this.tile_size*r,target_height:this.tile_size*i}}async _call(e,{return_row_col_info:t=null}={}){let n;n=Array.isArray(e)?Array.isArray(e[0])?e:[e]:[[e]];let r=[],i=[],a=[],o=[],s=[],c=[];for(let e of n){let t=await Promise.all(e.map(e=>this.preprocess(e,{do_pad:!1})));for(let{pixel_values:e}of t){let[,t,n]=e.dims,l=e.unsqueeze_(0),u=this.encoder_patch_size*this.downsample_factor,d=u**2,[f,p]=Xf(Math.max(u,t),Math.max(u,n),u,this.min_image_tokens*d,this.max_image_tokens*d).map(e=>Math.max(u,e)),m,h=1,g=1,_=this._is_image_too_large(t,n),v=this.do_image_splitting&&(this.min_tiles!==1||this.max_tiles!==1);if(_&&v){let{grid_width:e,grid_height:r,target_width:i,target_height:a}=this._get_grid_layout(t,n);h=r,g=e;let o=await nu(l,{size:[a,i]});m=[];for(let t=0;t(e-this.image_mean[t])/this.image_std[t]);return super.pad_image(e,t,{width:s,height:o},{center:!0,constant_values:c,...r})}async _call(e,{num_crops:t=null}={}){if(this._num_crops=t??=this.config.num_crops,t<4||rm(t)%1!=0)throw Error(`num_crops must be a square number >= 4`);Array.isArray(e)||(e=[e]);let n=e.length,r=await Promise.all(e.map(e=>this.preprocess(e))),i=r.map(e=>e.original_size),a=r.map(e=>e.reshaped_input_size),o=[];for(let{pixel_values:e}of r){e.unsqueeze_(0);let[n,r]=e.dims.slice(-2),i=await nu(e,{size:[$p,$p],mode:`bicubic`});if(t>0){let a=[],s=rm(t),c=nm(r/s),l=nm(n/s);for(let t=0;te.map(e=>$p*tm(e/$p)));return{pixel_values:s,original_sizes:i,reshaped_input_sizes:a,image_sizes:new V(`int64`,c.flat(),[n,2]),num_img_tokens:c.map(([e,t])=>this.calc_num_image_tokens_from_image_size(t,e))}}},am=class extends K{get_resize_output_image_size(e,t){let{longest_edge:n}=t;if(n===void 0)throw Error(`size must contain 'longest_edge'`);let[r,i]=e.size,a=Math.max(r,i)/n,o=r,s=i;a>1&&(o=Math.floor(r/a),s=Math.floor(i/a));let{patch_size:c,spatial_merge_size:l}=this.config;if(!l)throw Error(`config must contain 'spatial_merge_size'`);let u=c*l,d=Math.floor((o-1)/u)+1,f=Math.floor((s-1)/u)+1;return[d*u,f*u]}},om=class extends K{},sm=class extends K{post_process_object_detection(...e){return Gf(...e)}},cm=class extends K{reshape_input_points(e,t,n,r=!1){e=structuredClone(e);let i=ii(e);if(i.length===3)r||(i=[1,...i]),e=[e];else if(i.length!==4)throw Error("The input_points must be a 4D tensor of shape `batch_size`, `point_batch_size`, `nb_points_per_image`, `2`.");for(let r=0;re!==t.dims[n]))throw Error(`The first ${n.length} dimensions of 'input_points' and 'input_labels' must be the same.`);return new V(`int64`,e.flat(1/0).map(BigInt),n)}async _call(e,{input_points:t=null,input_labels:n=null,input_boxes:r=null}={}){let i=await super._call(e);if(t&&(i.input_points=this.reshape_input_points(t,i.original_sizes,i.reshaped_input_sizes)),n){if(!i.input_points)throw Error("`input_points` must be provided if `input_labels` are provided.");i.input_labels=this.add_input_labels(n,i.input_points)}return r&&(i.input_boxes=this.reshape_input_points(r,i.original_sizes,i.reshaped_input_sizes,!0)),i}async post_process_masks(e,t,n,{mask_threshold:r=0,binarize:i=!0,pad_size:a=null}={}){let o=[];a=a??this.pad_size??this.size;let s=[a.height,a.width];for(let a=0;ar&&(t[n]=1);u=new V(`bool`,t,u.dims)}o.push(u)}return o}generate_crop_boxes(e,t,{crop_n_layers:n=0,overlap_ratio:r=512/1500,points_per_crop:i=32,crop_n_points_downscale_factor:a=1}={}){}},lm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},um=class extends lm{},dm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},fm=class extends dm{},pm=class extends K{},mm=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t;return super.pad_image(e,t,{width:a+(n-a%n)%n,height:i+(n-i%n)%n},{mode:`symmetric`,center:!1,constant_values:-1,...r})}},hm=class extends K{},gm=class extends hm{},_m=class extends K{async _call(e,t){Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let n=await Promise.all(e.map(e=>this.preprocess(e))),r=await Promise.all(t.map(e=>this.preprocess(e,{do_normalize:!1,do_convert_rgb:!1,do_convert_grayscale:!0})));return{pixel_values:du(n.map((e,t)=>H([e.pixel_values,r[t].pixel_values],0)),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}},vm=class extends K{post_process_pose_estimation(e,t,{threshold:n=null}={}){let r=e.tolist(),[i,a,o,s]=e.dims,c=[];for(let e=0;e/gm,bboxes:/([^<]+)?/gm},this.size_per_bin=1e3}construct_prompts(e){typeof e==`string`&&(e=[e]);let t=[];for(let n of e)if(this.task_prompts_without_inputs.has(n))t.push(this.task_prompts_without_inputs.get(n));else{for(let[e,r]of this.task_prompts_with_input)if(n.includes(e)){t.push(r.replaceAll(`{input}`,n).replaceAll(e,``));break}t.length!==e.length&&t.push(n)}return t}post_process_generation(e,t,n){let r=this.tasks_answer_post_processing_type.get(t)??`pure_text`;e=e.replaceAll(``,``).replaceAll(``,``);let i;switch(r){case`pure_text`:i=e;break;case`description_with_bboxes`:case`bboxes`:case`phrase_grounding`:case`ocr`:let a=r===`ocr`?`quad_boxes`:`bboxes`,o=e.matchAll(this.regexes[a]),s=[],c=[];for(let[e,t,...r]of o)s.push(t?t.trim():s.at(-1)??``),c.push(r.map((e,t)=>(Number(e)+.5)/this.size_per_bin*n[t%2]));i={labels:s,[a]:c};break;default:throw Error(`Task "${t}" (of type "${r}") not yet implemented.`)}return{[t]:i}}async _call(e,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=await this.image_processor(e,n),i=t?this.tokenizer(this.construct_prompts(t),n):{};return{...r,...i}}},Cm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.image_seq_length=this.config.image_seq_length;let{boi_token:r,image_token:i,eoi_token:a}=this.tokenizer.config;this.boi_token=r,this.image_token=i,this.eoi_token=a;let o=i.repeat(this.image_seq_length);this.full_image_sequence=` - -${r}${o}${a} - -`}async _call(e,t=null,n={}){typeof e==`string`&&(e=[e]);let r;return t&&(r=await this.image_processor(t,n),e=e.map(e=>e.replaceAll(this.boi_token,this.full_image_sequence))),{...this.tokenizer(e,n),...r}}},wm=class extends G{static image_processor_class=xm;static feature_extractor_class=jf;static tokenizer_class=W;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_seq_length=this.config.audio_seq_length,this.image_seq_length=this.config.image_seq_length;let{audio_token_id:r,boa_token:i,audio_token:a,eoa_token:o,image_token_id:s,boi_token:c,image_token:l,eoi_token:u}=this.tokenizer.config;this.audio_token_id=r,this.boa_token=i,this.audio_token=a;let d=a.repeat(this.audio_seq_length);this.full_audio_sequence=` - -${i}${d}${o} - -`,this.image_token_id=s,this.boi_token=c,this.image_token=l;let f=l.repeat(this.image_seq_length);this.full_image_sequence=` - -${c}${f}${u} - -`}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;n&&(i=await this.feature_extractor(n,r),e=e.map(e=>e.replaceAll(this.audio_token,this.full_audio_sequence)));let a;return t&&(a=await this.image_processor(t,r),e=e.map(e=>e.replaceAll(this.image_token,this.full_image_sequence))),{...this.tokenizer(e,r),...a,...i}}},Tm=class extends G{static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_ms_per_token=this.config.audio_ms_per_token??40,this.audio_seq_length=this.config.audio_seq_length??750,this.image_seq_length=this.config.image_seq_length??280;let{audio_token:r,boa_token:i,eoa_token:a,image_token:o,boi_token:s,eoi_token:c}=this.tokenizer.config;this.audio_token=r,this.boa_token=i,this.eoa_token=a,this.image_token=o,this.boi_token=s,this.eoi_token=c}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([rl(e,Id,!0,t),W.from_pretrained(e,t),nl(e,Ld,!1,t)]),a={tokenizer:r};return n.image_processor&&(a.image_processor=new xp(n.image_processor)),n.feature_extractor&&(a.feature_extractor=new bf(n.feature_extractor)),new this(n,a,i)}_compute_audio_num_tokens(e,t){let n=Math.round(t*20/1e3),r=Math.round(t*10/1e3),i=Math.floor(n/2),a=Math.floor((e+i-n-1)/r)+1;if(a<=0)return 0;for(let e=0;e<2;++e)a=Math.floor((a-1)/2)+1;return Math.min(a,this.audio_seq_length)}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;if(t){i=await this.image_processor(t,r);let n=i.num_soft_tokens_per_image,a=0;e=e.map(e=>e.replaceAll(this.image_token,()=>` - -${this.boi_token}${this.image_token.repeat(n[a++])}${this.eoi_token} - -`))}let a;if(n){let t=Array.isArray(n)?n:[n];a=await this.feature_extractor(t[0],r);let i=this.feature_extractor.config.sampling_rate??16e3,o=0;e=e.map(e=>e.replaceAll(this.audio_token,()=>` - -${this.boa_token}${this.audio_token.repeat(this._compute_audio_num_tokens(t[o++].length,i))}${this.eoa_token} - -`))}return{...this.tokenizer(e,r),...i,...a}}},Em=class extends G{static image_processor_class=xm;static tokenizer_class=W;static image_token=`<|image_pad|>`;async _call(e,t=null,...n){Array.isArray(e)||(e=[e]);let r,i;if(t&&(r=await this.image_processor(t),i=r.image_grid_thw),i){let t=this.image_processor.config.merge_size**2,n=0,r=this.constructor.image_token,a=i.tolist();e=e.map(e=>{for(;e.includes(r);){let i=Number(a[n++].reduce((e,t)=>e*t,1n));e=e.replace(r,`<|placeholder|>`.repeat(Math.floor(i/t)))}return e.replaceAll(`<|placeholder|>`,r)})}return{...this.tokenizer(e),...r}}},Dm=class extends Em{static image_token=`<|image|>`},Om=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;_get_num_audio_features(e){let{hop_length:t}=this.feature_extractor.config.melspec_kwargs,{projector_window_size:n,projector_downsample_rate:r}=this.feature_extractor.config,i=Math.floor(n/r),a=Math.floor(e/t)+1,o=Math.floor(a/2);return Math.ceil(o/n)*i}async _call(e,t=null,n={}){if(Array.isArray(e))throw Error(`Batched inputs are not supported yet.`);let r={};if(t){let{input_features:n}=await this.feature_extractor(t);r.input_features=n;let i=this._get_num_audio_features(t.length);r.input_features_mask=new V(`bool`,new Uint8Array(i).fill(1),[1,i]);let a=this.config.audio_token??`<|audio|>`;if(!e.includes(a))throw Error(`The input text does not contain the audio token ${a}.`);e=e.replaceAll(a,a.repeat(i))}return{...this.tokenizer(e,{add_special_tokens:!1,...n}),...r}}};function km(e,t){let n=e.dims.at(-1)-1,r=e.tolist();r.fill(!1,0,1),r.fill(!1,n);let i=t.tolist();return r.map((e,t)=>e?t:null).filter(e=>e!==null).map(e=>i[e])}var Am=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t,n={}){let r=e?await this.image_processor(e,n):{};return{...t?this.tokenizer(t,n):{},...r}}post_process_grounded_object_detection(e,t,{box_threshold:n=.25,text_threshold:r=.25,target_sizes:i=null}={}){let{logits:a,pred_boxes:o}=e,s=a.dims[0];if(i!==null&&i.length!==s)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let c=a.dims.at(1),l=a.sigmoid(),u=l.max(-1).tolist(),d=o.tolist().map(e=>e.map(e=>Wf(e))),f=[];for(let e=0;ee.map((e,t)=>e*a[(t+1)%2])));let o=u[e],s=[],p=[],m=[];for(let i=0;i`+i.repeat(e);o+=` -`}return o+=` -${r}${a}`+i.repeat(e)+`${r}`,o}function Mm(e,t,n,r){return`${t}${r}`+n.repeat(e)+`${t}`}function Nm(e,t,n,r,i,a){return e===0&&t===0?Mm(n,r,i,a):jm(n,e,t,r,i,a)}var Pm=class extends G{static image_processor_class=xm;static tokenizer_class=W;static uses_processor_config=!0;fake_image_token=``;image_token=``;global_img_token=``;async _call(e,t=null,n={}){n.return_row_col_info??=!0;let r;t&&(r=await this.image_processor(t,n)),Array.isArray(e)||(e=[e]);let i=r.rows??[Array(e.length).fill(0)],a=r.cols??[Array(e.length).fill(0)],o=this.config.image_seq_len,s=[],c=[];for(let t=0;tNm(e,l[t],o,this.fake_image_token,this.image_token,this.global_img_token)),d=n.split(this.image_token);if(d.length===0)throw Error(`The image token should be present in the text.`);let f=d[0];for(let e=0;ee.images).flatMap(e=>e.images).map(e=>Vf.read(e)));let r=this.tokenizer,i=r.apply_chat_template(e,{tokenize:!1,add_generation_prompt:!0,chat_template:n}),a=e=>r.encode(e,{add_special_tokens:!1}),o=i.split(this.image_tag),s=o.length-1;if(t.length!==s)throw Error(`Number of images provided (${t.length}) does not match number of "${this.image_tag}" image tags (${s})`);let[c,l,u]=r.convert_tokens_to_ids([this.image_tag,this.image_start_tag,this.image_end_tag]),d=a(o[0]),f=Array(d.length).fill(!1);for(let e=1;e0){let e=await this.image_processor(t);return e.pixel_values.unsqueeze_(0),{...m,...e}}return m}},Im=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e=null,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=e?this.tokenizer(e,n):{},i=t?await this.image_processor(t,n):{};return{...r,...i}}},Lm=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t=null,n={}){let{image_rows:r,image_cols:i,image_sizes:a,...o}=await this.image_processor(e,{...n,return_row_col_info:!0});if(t){let e=this.config.image_token??``,{tile_size:n=512,downsample_factor:o=2,encoder_patch_size:s=16,use_thumbnail:c=!0}=this.image_processor.config,l=e=>Math.ceil(Math.floor(e/s)/o),u=l(n)**2,d=this.config.image_start_token??`<|image_start|>`,f=this.config.image_end_token??`<|image_end|>`,p=this.config.image_thumbnail??`<|img_thumbnail|>`;Array.isArray(t)||(t=[t]);let m=0;t=t.map(t=>{let n=t.split(e);return n[0]+n.slice(1).map(t=>{let n=m++,[o,s]=a[n],h=r[n],g=i[n],_=l(o)*l(s),v=d;if(h>1||g>1){let t=e.repeat(u);for(let e=0;e`+t;c&&(v+=p+e.repeat(_))}else v+=e.repeat(_);return v+f+t}).join(``)})}return{...o,...t?this.tokenizer(t,n):{}}}},Rm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,patch_size:a,num_additional_image_tokens:o}=this.config,s=Math.floor(e/a)*Math.floor(n/a)+o;t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;e0?i.reduce((e,t)=>e*t,1):0;c.push(n),s.push(a)}return[i(c),s]}char_decode(e){return this.char_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}bpe_decode(e){return this.bpe_tokenizer.batch_decode(e)}wp_decode(e){return this.wp_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}batch_decode([e,t,n]){let[r,i]=this._decode_helper(e,`char`),[a,o]=this._decode_helper(t,`bpe`),[s,c]=this._decode_helper(n,`wp`),l=[],u=[];for(let e=0;e`;function Wm(e,t,n,r,i){return`${r.repeat(n*i)}${t}${e} -`}var Gm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!1;async _call(e,t=null,n={}){t||=(A.warn(`You are using PaliGemma without a text prefix. It will perform as a picture-captioning model.`),``),Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let r=this.tokenizer.bos_token,i=this.image_processor.config.image_seq_length,a;t.some(e=>e.includes(Um))?a=t.map(e=>{let t=e.replaceAll(Um,Um.repeat(i)),n=t.lastIndexOf(Um),a=n===-1?0:n+Um.length;return t.slice(0,a)+r+t.slice(a)+` -`}):(A.warn("You are passing both `text` and `images` to `PaliGemmaProcessor`. The processor expects special image tokens in the text, as many tokens as there are images per each text. It is recommended to add `` tokens in the very beginning of your text. For this call, we will infer how many images each text has and add special tokens."),a=t.map(t=>Wm(t,r,i,Um,e.length)));let o=this.tokenizer(a,n);return{...await this.image_processor(e,n),...o}}},Km=`<|image|>`,qm=/<\|image_\d+\|>/g,Jm=class extends G{static image_processor_class=xm;static tokenizer_class=W;async _call(e,t=null,{padding:n=!0,truncation:r=!0,num_crops:i=null}={}){Array.isArray(e)||(e=[e]);let a,o;if(t){o=await this.image_processor(t,{num_crops:i});let{num_img_tokens:s}=o,c=e.map((e,t)=>e.split(qm).join(Km.repeat(s[t])));a=this.tokenizer(c,{padding:n,truncation:r});let l=this.tokenizer._tokenizer.token_to_id(Km);a.input_ids.map_(e=>e==l?-e:e)}else a=this.tokenizer(e);return{...a,...o}}},Ym=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,image_break_token:a,image_end_token:o,patch_size:s,spatial_merge_size:c}=this.config,l=s*c,u=Math.floor(e/l),d=Math.floor(n/l);t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;esh(e,o)),c=s.map(e=>e.length),l=s.flat(),u=(await Promise.all(l.map(e=>this.feature_extractor(e,n)))).map(e=>e.input_features);r.audio_values=u.length>1?H(u,0):u[0];let d=i[0];for(let e=0;e0){if(l>Tc)throw Error(`The number of external data chunks (${l}) exceeds the maximum allowed value (${Tc}).`);let t=Th(o,l);for(let n of t){let t=`${r.subfolder??``}/${n}`;c.push(new Promise(async(i,a)=>{let o=await tl(e,t,!0,r,s);i(o instanceof Uint8Array?{path:n,data:o}:n)}))}}else a.externalData!==void 0&&(c=a.externalData.map(async t=>{if(typeof t.data==`string`){let n=await tl(e,t.data,!0,r);return{...t,data:n}}return t}));return Promise.all(c)}async function Oh(e,t,n,r=!1,i=void 0){let a=n.config?.[`transformers.js_config`]??{},o=Gl(n.device??a.device,t,{warn:e=>A.info(e)}),s=jl(o),c=a.device_config??{};c.hasOwnProperty(o)&&(a={...a,...c[o]});let l=Zl(n.dtype??a.dtype,t,o,{configDtype:a.dtype,warn:e=>A.info(e)});if(!Xl.hasOwnProperty(l))throw Error(`Invalid dtype: ${l}. Should be one of: ${Object.keys(ql).join(`, `)}`);if(o===`webgpu`&&!O.IS_NODE_ENV&&l===ql.fp16&&!await Kl())throw Error(`The device (${o}) does not support fp16.`);let u=Xl[l],d={...n.session_options};d.executionProviders??=s;let f=a.free_dimension_overrides;f?d.freeDimensionOverrides??=f:o.startsWith(`webnn`)&&!d.freeDimensionOverrides&&A.warn(`WebNN does not currently support dynamic shapes and requires 'free_dimension_overrides' to be set in config.json, preferably as a field within config["transformers.js_config"]["device_config"]["${o}"]. When 'free_dimension_overrides' is not set, you may experience significant performance degradation.`);let p=Eh(e,t,n,u),m=await Dh(e,t,u,n,n.use_external_data_format??a.use_external_data_format,d);if(m.length>0&&(!O.IS_NODE_ENV||m.some(e=>typeof e!=`string`))&&(d.externalData=m),r&&o===`webgpu`){let e=bh(n.config,{prefix:`present`,session_name:i});if(e.size>0&&!Bl()){let t={};for(let n of e)t[n]=`gpu-buffer`;d.preferredOutputLocation=t}}return{buffer_or_path:await p,session_options:d,session_config:{dtype:l,device:o}}}async function kh(e,t,n,r=void 0){return Object.fromEntries(await Promise.all(Object.keys(t).map(async i=>{let a=r?.[i]??!1,{buffer_or_path:o,session_options:s,session_config:c}=await Oh(e,t[i],n,a,i);return[i,await Fl(o,s,c)]})))}function Ah(e){for(let t in e)Rl(e[t])?e[t]=new V(e[t]):typeof e[t]==`object`&&Ah(e[t]);return e}async function q(e,t){let n=jh(e,t);try{return Ah(await Ll(e,Object.fromEntries(Object.entries(n).map(([e,t])=>{let n=t.ort_tensor;return O.IS_NODE_ENV&&typeof Float16Array<`u`&&n.cpuData instanceof Float16Array&&(n.cpuData=new Uint16Array(n.cpuData.buffer)),[e,n]}))))}catch(e){let t=Object.fromEntries(Object.entries(n).map(([e,t])=>{let n={type:t.type,dims:t.dims,location:t.location};return n.location!==`gpu-buffer`&&(n.data=t.data),[e,n]}));throw A.error(`An error occurred during model execution: "${e}".`),A.error(`Inputs given to model:`,t),e}}function jh(e,t){let n=/* @__PURE__ */ Object.create(null),r=[];for(let i of e.inputNames){let e=t[i];if(!(e instanceof V)){r.push(i);continue}n[i]=Bl()?e.clone():e}if(r.length>0)throw Error(`An error occurred during model execution: "Missing the following inputs: ${r.join(`, `)}.`);let i=Object.keys(t).length,a=e.inputNames.length;if(i>a){let n=Object.keys(t).filter(t=>!e.inputNames.includes(t));A.warn(`WARNING: Too many inputs were provided (${i} > ${a}). The following inputs will be ignored: "${n.join(`, `)}".`)}return n}var Mh=class{},Nh=class extends Mh{constructor({last_hidden_state:e,hidden_states:t=null,attentions:n=null}){super(),this.last_hidden_state=e,this.hidden_states=t,this.attentions=n}},J=class extends Mh{constructor({logits:e,...t}){super(),this.logits=e;let n=Object.values(t);n.length>0&&(this.attentions=n)}},Ph=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Fh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Ih=class extends Mh{constructor({start_logits:e,end_logits:t}){super(),this.start_logits=e,this.end_logits=t}},Lh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Rh=class extends Mh{constructor({logits:e,past_key_values:t}){super(),this.logits=e,this.past_key_values=t}},zh=class extends Mh{constructor({logits:e,past_key_values:t,encoder_outputs:n,decoder_attentions:r=null,cross_attentions:i=null}){super(),this.logits=e,this.past_key_values=t,this.encoder_outputs=n,this.decoder_attentions=r,this.cross_attentions=i}},Bh=class extends Mh{constructor({alphas:e}){super(),this.alphas=e}},Vh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Hh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Uh=class extends $r{constructor(){super(),this.processors=[]}push(e){this.processors.push(e)}extend(e){this.processors.push(...e)}_call(e,t){let n=t;for(let t of this.processors)n=t(e,n);return n}[Symbol.iterator](){return this.processors.values()}},Wh=class extends Vh{constructor(e){super(),this.bos_token_id=e}_call(e,t){for(let n=0;n=1&&i[i.length-1]>=this.timestamp_begin,o=i.length<2||i[i.length-2]>=this.timestamp_begin;if(a&&(o?r.subarray(this.timestamp_begin).fill(-1/0):r.subarray(0,this.eos_token_id).fill(-1/0)),e[n].length===this.begin_index&&this.max_initial_timestamp_index!==null){let e=this.timestamp_begin+this.max_initial_timestamp_index;r.subarray(e+1).fill(-1/0)}let s=sl(r);Math.log(s.subarray(this.timestamp_begin).map(Math.exp).reduce((e,t)=>e+t))>ll(s.subarray(0,this.timestamp_begin))[0]&&r.subarray(0,this.timestamp_begin).fill(-1/0)}return t}},Yh=class extends Vh{constructor(e){super(),this.no_repeat_ngram_size=e}getNgrams(e){let t=e.length,n=[];for(let r=0;r1 to use the classifier-free guidance processor, got guidance scale ${e}.`);this.guidance_scale=e}_call(e,t){if(t.dims[0]!==2*e.length)throw Error(`Logits should have twice the batch size of the input ids, the first half of batches corresponding to the conditional inputs, and the second half of batches corresponding to the unconditional inputs. Got batch size ${t.dims[0]} for the logits and ${e.length} for the input ids.`);let n=e.length,r=t.slice([0,n],null),i=t.slice([n,t.dims[0]],null);for(let e=0;ee.length>=this.max_length)}},og=class extends rg{constructor(e){super(),Array.isArray(e)||(e=[e]),this.eos_token_id=e}_call(e,t){return e.map(e=>{let t=e.at(-1);return this.eos_token_id.some(e=>t==e)})}},sg=class extends $r{constructor(e){super(),this.generation_config=e}async _call(e){return this.sample(e)}async sample(e){throw Error(`sample should be implemented in subclasses.`)}getLogits(e,t){let n=e.dims.at(-1),r=e.data;if(t===-1)r=r.slice(-n);else{let e=t*n;r=r.slice(e,e+n)}return r}randomSelect(e){return xc(e)}static getSampler(e){if(e.do_sample)return new lg(e);if(e.num_beams>1)return new ug(e);if(e.num_return_sequences>1)throw Error(`num_return_sequences has to be 1 when doing greedy search, but is ${e.num_return_sequences}.`);return new cg(e)}},cg=class extends sg{async sample(e){let t=ll(e.data)[1];return[[BigInt(t),0]]}},lg=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},()=>{let e=this.randomSelect(i);return[r.data[e],Math.log(i[e])]})}},ug=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},(e,t)=>[r.data[t],Math.log(i[t])])}},dg=class{constructor(e){if(e)for(let t in e){if(t in this)throw TypeError(`Key "${t}" conflicts with an existing property on DynamicCache`);let n=e[t];if(!(n instanceof V))throw TypeError(`Expected a Tensor for key "${t}", got ${typeof n}`);this[t]=n}}get_seq_length(){let e=this;if(Object.keys(e).length===0)return 0;for(let t in e)if(t.startsWith(`past_key_values.`))return e[t].dims.at(-2);throw Error(`Unable to determine sequence length from the cache.`)}update(e){for(let t in e){let n=this[t],r=e[t];n&&n!==r&&n.location===`gpu-buffer`&&n.dispose(),this[t]=r}}async dispose(){let e=[];for(let t of Object.values(this))t.location===`gpu-buffer`&&e.push(t.dispose());await Promise.all(e)}},Y={EncoderOnly:0,EncoderDecoder:1,Seq2Seq:2,Vision2Seq:3,DecoderOnly:4,DecoderOnlyWithoutHead:5,MaskGeneration:6,ImageTextToText:7,Musicgen:8,MultiModality:9,Phi3V:10,AudioTextToText:11,AutoEncoder:12,ImageAudioTextToText:13,Supertonic:14,Chatterbox:15,VoxtralRealtime:16},fg={[Y.DecoderOnly]:{sessions:(e,t)=>({model:t.model_file_name??`model`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.DecoderOnlyWithoutHead]:{sessions:(e,t)=>({model:t.model_file_name??`model`})},[Y.Seq2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Vision2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Musicgen]:{sessions:()=>({model:`text_encoder`,decoder_model_merged:`decoder_model_merged`,encodec_decode:`encodec_decode`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.EncoderDecoder]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0}},[Y.MaskGeneration]:{sessions:()=>({model:`vision_encoder`,prompt_encoder_mask_decoder:`prompt_encoder_mask_decoder`})},[Y.ImageTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageTextToText].text_only_sessions};return n||(r.vision_encoder=`vision_encoder`),e.is_encoder_decoder&&(r.model=`encoder_model`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.AudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.ImageAudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageAudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`,r.vision_encoder=`vision_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Phi3V]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`model`,vision_encoder:`vision_encoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.MultiModality]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`language_model`,lm_head:`lm_head`,gen_head:`gen_head`,gen_img_embeds:`gen_img_embeds`,image_decode:`image_decode`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AutoEncoder]:{sessions:()=>({encoder_model:`encoder_model`,decoder_model:`decoder_model`})},[Y.Supertonic]:{sessions:()=>({text_encoder:`text_encoder`,latent_denoiser:`latent_denoiser`,voice_decoder:`voice_decoder`})},[Y.Chatterbox]:{sessions:()=>({embed_tokens:`embed_tokens`,speech_encoder:`speech_encoder`,model:`language_model`,conditional_decoder:`conditional_decoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.VoxtralRealtime]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.VoxtralRealtime].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0,audio_encoder:!0},optional_configs:{generation_config:`generation_config.json`}},default:{sessions:(e,t)=>({model:t.model_file_name??`model`})}};function pg(e,t,n={}){let r=fg[e]??fg.default;return{sessions:r.sessions(t,n,n.textOnly??!1),cache_sessions:r.cache_sessions,optional_configs:r.optional_configs}}function mg(e,{warn:t=!0}={}){let n=e.architectures||[];for(let e of n){let t=Cg.get(e);if(t!==void 0)return t}if(e.model_type){let t=Cg.get(e.model_type);if(t!==void 0)return t;for(let t of Object.values(_g))if(t.has(e.model_type)){let n=Cg.get(t.get(e.model_type));if(n!==void 0)return n}}if(t){let t=n.length>0?n.join(`, `):`(none)`;A.warn(`[resolve_model_type] Architecture(s) not found in MODEL_TYPE_MAPPING: [${t}] for model type '${e.model_type}'. Falling back to EncoderOnly (single model.onnx file). If you encounter issues, please report at: ${Nd}`)}return Y.EncoderOnly}function hg(e,{config:t=null,cache_dir:n=null,local_files_only:r=!1,revision:i=`main`}={}){return t===null?Wc(Ac(e,{cache_dir:n,local_files_only:r,revision:i}),()=>Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})):Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})}async function gg(e,{config:t=null,dtype:n=null,device:r=null,model_file_name:i=null}={}){t=await hg(e,{config:t});let a=[`config.json`],o=t[`transformers.js_config`]??{},s=o.use_external_data_format,c=`onnx`,l=r??o.device,u=n??o.dtype,d=mg(t),f=(e,t=null)=>{t??=e;let n=Gl(l,e),r=Xl[Zl(u,e,n)]??``,i=`${t}${r}.onnx`,o=`${c}/${i}`;a.push(o);let d=wh(s,i,e);for(let e of Th(i,d)){let t=`${c}/${e}`;a.push(t)}},{sessions:p,optional_configs:m}=pg(d,t,{model_file_name:i});for(let[e,t]of Object.entries(p))f(e,t);if(m)for(let e of Object.values(m))a.push(e);return a}var _g=null;function vg(e){_g=e}function yg(e){if(e instanceof V)return e;if(e.length===0)throw Error(`items must be non-empty`);if(Array.isArray(e[0])){if(e.some(t=>t.length!==e[0].length))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' and/or 'truncation=True' to have batched tensors with the same length.`);return new V(`int64`,BigInt64Array.from(e.flat().map(e=>BigInt(e))),[e.length,e[0].length])}return new V(`int64`,BigInt64Array.from(e.map(e=>BigInt(e))),[1,e.length])}function bg(e){return new V(`bool`,[e],[1])}var xg={[Y.DecoderOnly]:{can_generate:!0,forward:Pg,prepare_inputs:Bg},[Y.DecoderOnlyWithoutHead]:{can_generate:!1,forward:Pg,prepare_inputs:Bg},[Y.Seq2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Vision2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Musicgen]:{can_generate:!0,forward:Eg},[Y.EncoderDecoder]:{can_generate:!1,forward:Eg},[Y.ImageTextToText]:{can_generate:!0,forward:Lg,prepare_inputs:Hg},[Y.AudioTextToText]:{can_generate:!0,forward:Ig,prepare_inputs:Hg},[Y.ImageAudioTextToText]:{can_generate:!0,prepare_inputs:Hg},[Y.Phi3V]:{can_generate:!0,prepare_inputs:Hg},[Y.MultiModality]:{can_generate:!0},[Y.AutoEncoder]:{can_generate:!1,forward:Og},[Y.Chatterbox]:{can_generate:!0,forward:Dg},[Y.VoxtralRealtime]:{can_generate:!0,prepare_inputs:Bg},default:{can_generate:!1,forward:Dg}};function Sg(e,t){let n=Cg.get(e),r=!1,i=t?.architectures?.[0];if(i&&i!==e&&e?.endsWith(`ForCausalLM`)&&i.endsWith(`ForConditionalGeneration`)){let e=Cg.get(i);e!==void 0&&(n=e,r=!0)}let a=xg[n]??xg.default,o=fg[n]??fg.default;return{typeConfig:{...a,...o},textOnly:r,modelType:n}}var Cg=/* @__PURE__ */ new Map,wg=/* @__PURE__ */ new Map,Tg=/* @__PURE__ */ new Map,X=class extends $r{main_input_name=`input_ids`;forward_params=[`input_ids`,`attention_mask`];_return_dict_in_generate_keys=null;constructor(e,t,n){super(),this.config=e,this.sessions=t,this.configs=n;let{typeConfig:r}=Sg(Tg.get(this.constructor),e);this.can_generate=r.can_generate,this._forward=r.forward,this._prepare_inputs_for_generation=r.prepare_inputs,this.can_generate&&this.forward_params.push(`past_key_values`),this.custom_config=this.config[`transformers.js_config`]??{}}async dispose(){let e=[];for(let t of Object.values(this.sessions))e.push(t.release?.());return await Promise.all(e)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d},p=Tg.get(this);n=f.config=await Ch.from_pretrained(e,f);let{typeConfig:m,textOnly:h,modelType:g}=Sg(p,n);if(g===void 0){let e=p??n?.model_type;e!==`custom`&&A.warn(`Model type for '${e}' not found, assuming encoder-only architecture. Please report this at ${Nd}.`)}if(t&&!(t instanceof ti)){let r={};try{let t=await gg(e,{config:n,dtype:l,device:c,model_file_name:o});(await Promise.all(t.map(t=>Kc(e,t,f)))).forEach((e,n)=>{if(e.exists){let i=t[n]===`config.json`;r[t[n]]={loaded:i?e.size??0:0,total:e.size??0}}})}catch(e){A.warn(`Unable to fetch model file metadata for total progress tracking: ${e}`)}Object.keys(r).length>0&&(f.progress_callback=new ti(t,r))}let _=[kh(e,m.sessions(n,f,h),f,m.cache_sessions)];m.optional_configs&&_.push(Kg(e,m.optional_configs,f));let v=await Promise.all(_);return new this(n,...v)}async _call(e){return await this.forward(e)}async forward(e){return await this._forward(this,e)}get generation_config(){return this.configs?.generation_config??null}_get_logits_processor(e,t,n=null){let r=new Uh;if(e.repetition_penalty!==null&&e.repetition_penalty!==1&&r.push(new Xh(e.repetition_penalty)),e.no_repeat_ngram_size!==null&&e.no_repeat_ngram_size>0&&r.push(new Yh(e.no_repeat_ngram_size)),e.bad_words_ids!==null&&r.push(new $h(e.bad_words_ids,e.eos_token_id)),e.min_length!==null&&e.eos_token_id!==null&&e.min_length>0&&r.push(new Zh(e.min_length,e.eos_token_id)),e.min_new_tokens!==null&&e.eos_token_id!==null&&e.min_new_tokens>0&&r.push(new Qh(t,e.min_new_tokens,e.eos_token_id)),e.forced_bos_token_id!==null&&r.push(new Wh(e.forced_bos_token_id)),e.forced_eos_token_id!==null&&r.push(new Gh(e.max_length,e.forced_eos_token_id)),e.suppress_tokens!==null&&r.push(new Kh(e.suppress_tokens)),e.begin_suppress_tokens!==null){let n=t>1||e.forced_bos_token_id===null?t:t+1;r.push(new qh(e.begin_suppress_tokens,n))}return e.guidance_scale!==null&&e.guidance_scale>1&&r.push(new eg(e.guidance_scale)),e.temperature===0&&e.do_sample&&(A.warn("`do_sample` changed to false because `temperature: 0` implies greedy sampling (always selecting the most likely token), which is incompatible with `do_sample: true`."),e.do_sample=!1),e.do_sample&&e.temperature!==null&&e.temperature!==1&&r.push(new tg(e.temperature)),n!==null&&r.extend(n),r}_prepare_generation_config(e,t,n=ng){let r={...this.config};for(let e of[`decoder`,`generator`,`text_config`])e in r&&Object.assign(r,r[e]);let i=new n(r);return Object.assign(i,this.generation_config??{}),e&&Object.assign(i,e),t&&Object.assign(i,ci(t,Object.getOwnPropertyNames(i))),i}_get_stopping_criteria(e,t=null){let n=new ig;return e.max_length!==null&&n.push(new ag(e.max_length,this.config.max_position_embeddings??null)),e.eos_token_id!==null&&n.push(new og(e.eos_token_id)),t&&n.extend(t),n}_validate_model_class(){if(!this.can_generate){let e=[_g.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES,_g.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES].filter(Boolean),t=Tg.get(this.constructor),n=/* @__PURE__ */ new Set,r=this.config.model_type;for(let t of e){let e=t?.get(r);e&&n.add(e)}let i=`The current model class (${t}) is not compatible with \`.generate()\`, as it doesn't have a language model head.`;throw n.size>0&&(i+=` Please use the following class instead: ${[...n].join(`, `)}`),Error(i)}}prepare_inputs_for_generation(...e){if(!this._prepare_inputs_for_generation)throw Error(`prepare_inputs_for_generation is not implemented for this model.`);return this._prepare_inputs_for_generation(this,...e)}_update_model_kwargs_for_generation({generated_input_ids:e,outputs:t,model_inputs:n,is_encoder_decoder:r}){return n.past_key_values=kg(t,n.past_key_values),n.input_ids=new V(`int64`,e.flat(),[e.length,1]),r?`decoder_attention_mask`in n&&(n.decoder_attention_mask=H([n.decoder_attention_mask,yu([n.decoder_attention_mask.dims[0],1])],1)):n.attention_mask=H([n.attention_mask,yu([n.attention_mask.dims[0],1])],1),n.position_ids=null,n}_prepare_model_inputs({inputs:e,bos_token_id:t,model_kwargs:n}){let r=ci(n,this.forward_params),i=this.main_input_name;if(i in r){if(e)throw Error("`inputs`: {inputs}` were passed alongside {input_name} which is not allowed. Make sure to either pass {inputs} or {input_name}=...")}else r[i]=e;return{inputs_tensor:r[i],model_inputs:r,model_input_name:i}}async _prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:e,model_inputs:t,model_input_name:n,generation_config:r}){if(this.sessions.model.inputNames.includes(`inputs_embeds`)&&!t.inputs_embeds&&`_prepare_inputs_embeds`in this){let{input_ids:e,pixel_values:n,attention_mask:r,...i}=t,a=await this._prepare_inputs_embeds(t);t={...i,...ci(a,[`inputs_embeds`,`attention_mask`])}}let{last_hidden_state:i}=await Dg(this,t);if(r.guidance_scale!==null&&r.guidance_scale>1)i=H([i,vu(i,0)],0),`attention_mask`in t&&(t.attention_mask=H([t.attention_mask,Su(t.attention_mask)],0));else if(t.decoder_input_ids){let e=yg(t.decoder_input_ids).dims[0];if(e!==i.dims[0]){if(i.dims[0]!==1)throw Error(`The encoder outputs have a different batch size (${i.dims[0]}) than the decoder inputs (${e}).`);i=H(Array.from({length:e},()=>i),0)}}return t.encoder_outputs=i,t}_prepare_decoder_input_ids_for_generation({batch_size:e,model_input_name:t,model_kwargs:n,decoder_start_token_id:r,bos_token_id:i,generation_config:a}){let{decoder_input_ids:o,...s}=n;if(!(o instanceof V)){if(o)Array.isArray(o[0])||(o=Array.from({length:e},()=>o));else if(r??=i,this.config.model_type===`musicgen`)o=Array.from({length:e*this.config.decoder.num_codebooks},()=>[r]);else if(Array.isArray(r)){if(r.length!==e)throw Error(`\`decoder_start_token_id\` expected to have length ${e} but got ${r.length}`);o=r}else o=Array.from({length:e},()=>[r]);o=yg(o)}return s.decoder_attention_mask=bu(o),{input_ids:o,model_inputs:s}}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,streamer:i=null,...a}){this._validate_model_class(),t=this._prepare_generation_config(t,a);let{inputs_tensor:o,model_inputs:s,model_input_name:c}=this._prepare_model_inputs({inputs:e,model_kwargs:a}),l=this.config.is_encoder_decoder;l&&(`encoder_outputs`in s||(s=await this._prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:o,model_inputs:s,model_input_name:c,generation_config:t})));let u;l?{input_ids:u,model_inputs:s}=this._prepare_decoder_input_ids_for_generation({batch_size:s[c].dims.at(0),model_input_name:c,model_kwargs:s,decoder_start_token_id:t.decoder_start_token_id,bos_token_id:t.bos_token_id,generation_config:t}):u=s[c];let d=u.dims.at(-1);t.max_new_tokens!==null&&(t.max_length=d+t.max_new_tokens);let f=this._get_logits_processor(t,d,n),p=this._get_stopping_criteria(t,r),m=s[c].dims.at(0),h=sg.getSampler(t),g=Array(m).fill(0),_=u.tolist();i&&i.put(_);let v,y={},b={};for(;;){if(s=this.prepare_inputs_for_generation(_,s,t),v=await this.forward(s),t.return_dict_in_generate){if(t.output_attentions){let e=Ag(v);for(let t in e)t in y||(y[t]=[]),y[t].push(e[t])}else this._return_dict_in_generate_keys&&Object.assign(b,ci(v,this._return_dict_in_generate_keys))}let e=f(_,v.logits.slice(null,-1,null).to(`float32`)),n=[];for(let t=0;te))break;s=this._update_model_kwargs_for_generation({generated_input_ids:n,outputs:v,model_inputs:s,is_encoder_decoder:l})}i&&i.end();let x=new V(`int64`,_.flat(),[_.length,_[0].length]),S=kg(v,s.past_key_values),C=new Set(Object.values(S));for(let e of Object.values(v))e.location===`gpu-buffer`&&!C.has(e)&&e.dispose();return`past_key_values`in a||t.return_dict_in_generate||await S.dispose(),t.return_dict_in_generate?{sequences:x,past_key_values:S,...y,...b}:x}async _encode_input(e,t,n){if(!Object.hasOwn(this.sessions,e))throw Error(`Model does not have a ${e} session.`);let r=this.sessions[e];return(await q(r,ci(t,r.inputNames)))[n]}async encode_image(e){return this._encode_input(`vision_encoder`,e,`image_features`)}async encode_text(e){return this._encode_input(`embed_tokens`,e,`inputs_embeds`)}async encode_audio(e){return this._encode_input(`audio_encoder`,e,`audio_features`)}};async function Eg(e,t){let{encoder_outputs:n,input_ids:r,decoder_input_ids:i,decoder_attention_mask:a,...o}=t;return n||=(await Dg(e,ci(t,e.sessions.model.inputNames))).last_hidden_state,o.input_ids=i,o.encoder_hidden_states=n,e.sessions.decoder_model_merged.inputNames.includes(`encoder_attention_mask`)&&(o.encoder_attention_mask=t.attention_mask),a&&!o.attention_mask&&(o.attention_mask=a),await Pg(e,o,!0)}async function Dg(e,t){let n=e.sessions.model,r=ci(t,n.inputNames);if(n.inputNames.includes(`inputs_embeds`)&&!r.inputs_embeds){if(!t.input_ids)throw Error("Both `input_ids` and `inputs_embeds` are missing in the model inputs.");r.inputs_embeds=await e.encode_text({input_ids:t.input_ids})}if(n.inputNames.includes(`token_type_ids`)&&!r.token_type_ids){if(!r.input_ids)throw Error("Both `input_ids` and `token_type_ids` are missing in the model inputs.");r.token_type_ids=Su(r.input_ids)}if(n.inputNames.includes(`pixel_mask`)&&!r.pixel_mask){if(!r.pixel_values)throw Error("Both `pixel_values` and `pixel_mask` are missing in the model inputs.");let e=r.pixel_values.dims;r.pixel_mask=yu([e[0],e[2],e[3]])}return await q(n,r)}async function Og(e,t){let n=await e.encode(t);return await e.decode(n)}function kg(e,t){let n=/* @__PURE__ */ Object.create(null);for(let r in e)if(r.startsWith(`present`)){let i=r.replace(`present_ssm`,`past_ssm`).replace(`present_conv`,`past_conv`).replace(`present_recurrent`,`past_recurrent`).replace(`present_compressor`,`past_compressor`).replace(`present_indexer`,`past_indexer`).replace(`present`,`past_key_values`);n[i]=r.includes(`encoder`)&&t?t[i]:e[r]}return t?(t.update(n),t):new dg(n)}function Ag(e){let t={};for(let n of[`cross_attentions`,`encoder_attentions`,`decoder_attentions`])for(let r in e)r.startsWith(n)&&(n in t||(t[n]=[]),t[n].push(e[r]));return t}function jg(e,t){return e.map(e=>typeof e==`number`?e:t[e]??0)}function Mg(e,t,n){if(n&&Object.keys(n).length>0)return Object.assign(t,n),n;let r=e.sessions.decoder_model_merged??e.sessions.model,i=(t[e.main_input_name]??t.attention_mask)?.dims?.[0]??1,a=bh(e.config),o=e.config?.normalized_config?.num_heads,s={batch_size:i};typeof o==`number`&&(s[`batch_size x num_heads`]=i*o);let c=/* @__PURE__ */ Object.create(null);for(let e of r.inputMetadata){if(!a.has(e.name))continue;let n=jg(e.shape,s),r=n.reduce((e,t)=>e*t,1),i=Ql[e.type],o=new V(e.type,new i(r),n);t[e.name]=o,c[e.name]=o}return n?(n.update(c),n):new dg(c)}function Ng(e,t,n){t.num_logits_to_keep||(e.sessions.decoder_model_merged??e.sessions.model)?.inputNames.includes(`num_logits_to_keep`)&&(t.num_logits_to_keep=new V(`int64`,[n],[]))}async function Pg(e,t,n=!1){let r=e.sessions[n?`decoder_model_merged`:`model`],{past_key_values:i,...a}=t;return r.inputNames.includes(`use_cache_branch`)&&(a.use_cache_branch=bg(i!=null&&Object.keys(i).length>0)),r.inputNames.includes(`position_ids`)&&a.attention_mask&&!a.position_ids&&(a.position_ids=zg(a,i,+!![`paligemma`,`gemma3_text`,`gemma3`].includes(e.config.model_type))),Ng(e,a,0n),Mg(e,a,i),await q(r,ci(a,r.inputNames))}async function Fg(e,{encode_function:t,merge_function:n,modality_input_names:r,modality_output_name:i,input_ids:a=null,attention_mask:o=null,position_ids:s=null,inputs_embeds:c=null,past_key_values:l=null,generation_config:u=null,logits_processor:d=null,num_logits_to_keep:f=null,...p}){if(!c){c=await e.encode_text({input_ids:a,...p});let s=ci(p,r);if(Object.keys(s).length>0){if(a.dims[1]!==1){let e=await t({...s,...p});({inputs_embeds:c,attention_mask:o}=n({[i]:e,inputs_embeds:c,input_ids:a,attention_mask:o}))}else if(l&&a.dims[1]===1){let e=a.dims[1],t=l.get_seq_length();o=H([yu([a.dims[0],t]),o.slice(null,[o.dims[1]-e,o.dims[1]])],1)}}}if(!s&&[`qwen2_vl`,`qwen2_vl_text`,`qwen2_5_vl`,`qwen2_5_vl_text`,`qwen3_vl`,`qwen3_vl_text`,`qwen3_vl_moe`,`qwen3_vl_moe_text`,`qwen3_5`,`qwen3_5_text`,`qwen3_5_moe`,`qwen3_5_moe_text`,`glm_ocr`,`glm_ocr_text`].includes(e.config.model_type)){let{image_grid_thw:t,video_grid_thw:n}=p;[s]=e.get_rope_index(a,t,n,o)}return await Pg(e,{inputs_embeds:c,past_key_values:l,attention_mask:o,position_ids:s,generation_config:u,logits_processor:d,num_logits_to_keep:f},!0)}async function Ig(e,t){return await Fg(e,{...t,modality_input_names:[`audio_values`,`input_features`],modality_output_name:`audio_features`,encode_function:e.encode_audio.bind(e),merge_function:e._merge_input_ids_with_audio_features.bind(e)})}async function Lg(e,t){return await Fg(e,{...t,modality_input_names:[`pixel_values`],modality_output_name:`image_features`,encode_function:e.encode_image.bind(e),merge_function:e._merge_input_ids_with_image_features.bind(e)})}function Rg(e,t=0){let[n,r]=e.dims,i=e.data,a=new BigInt64Array(i.length);for(let e=0;ee.dims[1]||i[e.at(-1)])),Ng(e,n,1n),{...n,decoder_input_ids:yg(t)}}function Hg(e,...t){return e.config.is_encoder_decoder?Vg(e,...t):Bg(e,...t)}function Ug({modality_token_id:e,inputs_embeds:t,modality_features:n,input_ids:r,attention_mask:i}){let a=r.tolist().map(t=>t.reduce((t,n,r)=>(n==e&&t.push(r),t),[])),o=a.reduce((e,t)=>e+t.length,0),s=n.dims[0];if(o!==s)throw Error(`Number of tokens and features do not match: tokens: ${o}, features ${s}`);let c=0;for(let e=0;e[r,await rl(e,t[r],!1,n)])))}var qg={};Sr(qg,{ASTForAudioClassification:()=>u_,ASTModel:()=>l_,ASTPreTrainedModel:()=>c_,AfmoeForCausalLM:()=>i_,AfmoeModel:()=>r_,AfmoePreTrainedModel:()=>n_,AlbertForMaskedLM:()=>Qg,AlbertForQuestionAnswering:()=>Zg,AlbertForSequenceClassification:()=>Xg,AlbertModel:()=>Yg,AlbertPreTrainedModel:()=>Jg,ApertusForCausalLM:()=>t_,ApertusModel:()=>e_,ApertusPreTrainedModel:()=>$g,ArceeForCausalLM:()=>s_,ArceeModel:()=>o_,ArceePreTrainedModel:()=>a_,BartForConditionalGeneration:()=>p_,BartForSequenceClassification:()=>m_,BartModel:()=>f_,BartPretrainedModel:()=>d_,BaseModelOutput:()=>Nh,BeitForImageClassification:()=>__,BeitModel:()=>g_,BeitPreTrainedModel:()=>h_,BertForMaskedLM:()=>b_,BertForQuestionAnswering:()=>C_,BertForSequenceClassification:()=>x_,BertForTokenClassification:()=>S_,BertModel:()=>y_,BertPreTrainedModel:()=>v_,BlenderbotForConditionalGeneration:()=>E_,BlenderbotModel:()=>T_,BlenderbotPreTrainedModel:()=>w_,BlenderbotSmallForConditionalGeneration:()=>k_,BlenderbotSmallModel:()=>O_,BlenderbotSmallPreTrainedModel:()=>D_,BloomForCausalLM:()=>M_,BloomModel:()=>j_,BloomPreTrainedModel:()=>A_,CHMv2ForDepthEstimation:()=>K_,CHMv2PreTrainedModel:()=>G_,CLIPModel:()=>Q_,CLIPPreTrainedModel:()=>Z_,CLIPSegForImageSegmentation:()=>av,CLIPSegModel:()=>iv,CLIPSegPreTrainedModel:()=>rv,CLIPTextModel:()=>$_,CLIPTextModelWithProjection:()=>ev,CLIPVisionModel:()=>tv,CLIPVisionModelWithProjection:()=>nv,CamembertForMaskedLM:()=>F_,CamembertForQuestionAnswering:()=>R_,CamembertForSequenceClassification:()=>I_,CamembertForTokenClassification:()=>L_,CamembertModel:()=>P_,CamembertPreTrainedModel:()=>N_,CausalLMOutput:()=>Lh,CausalLMOutputWithPast:()=>Rh,ChatterboxModel:()=>H_,ChatterboxPreTrainedModel:()=>V_,ChineseCLIPModel:()=>W_,ChineseCLIPPreTrainedModel:()=>U_,ClapAudioModelWithProjection:()=>X_,ClapModel:()=>J_,ClapPreTrainedModel:()=>q_,ClapTextModelWithProjection:()=>Y_,CodeGenForCausalLM:()=>cv,CodeGenModel:()=>sv,CodeGenPreTrainedModel:()=>ov,Cohere2ForCausalLM:()=>mv,Cohere2Model:()=>pv,Cohere2PreTrainedModel:()=>fv,CohereAsrForConditionalGeneration:()=>_v,CohereAsrModel:()=>gv,CohereAsrPreTrainedModel:()=>hv,CohereForCausalLM:()=>dv,CohereModel:()=>uv,CoherePreTrainedModel:()=>lv,ConvBertForMaskedLM:()=>bv,ConvBertForQuestionAnswering:()=>Cv,ConvBertForSequenceClassification:()=>xv,ConvBertForTokenClassification:()=>Sv,ConvBertModel:()=>yv,ConvBertPreTrainedModel:()=>vv,ConvNextForImageClassification:()=>Ev,ConvNextModel:()=>Tv,ConvNextPreTrainedModel:()=>wv,ConvNextV2ForImageClassification:()=>kv,ConvNextV2Model:()=>Ov,ConvNextV2PreTrainedModel:()=>Dv,DFineForObjectDetection:()=>Iv,DFineModel:()=>Fv,DFinePreTrainedModel:()=>Pv,DINOv3ConvNextModel:()=>ky,DINOv3ConvNextPreTrainedModel:()=>Oy,DINOv3ViTModel:()=>jy,DINOv3ViTPreTrainedModel:()=>Ay,DPTForDepthEstimation:()=>Hy,DPTModel:()=>Vy,DPTPreTrainedModel:()=>By,DacDecoderModel:()=>Hv,DacDecoderOutput:()=>Rv,DacEncoderModel:()=>Vv,DacEncoderOutput:()=>Lv,DacModel:()=>Bv,DacPreTrainedModel:()=>zv,DebertaForMaskedLM:()=>Gv,DebertaForQuestionAnswering:()=>Jv,DebertaForSequenceClassification:()=>Kv,DebertaForTokenClassification:()=>qv,DebertaModel:()=>Wv,DebertaPreTrainedModel:()=>Uv,DebertaV2ForMaskedLM:()=>ry,DebertaV2ForQuestionAnswering:()=>oy,DebertaV2ForSequenceClassification:()=>iy,DebertaV2ForTokenClassification:()=>ay,DebertaV2Model:()=>ny,DebertaV2PreTrainedModel:()=>ty,DecisionTransformerModel:()=>cy,DecisionTransformerPreTrainedModel:()=>sy,DeepseekV3ForCausalLM:()=>Zv,DeepseekV3Model:()=>Xv,DeepseekV3PreTrainedModel:()=>Yv,DeepseekV4ForCausalLM:()=>ey,DeepseekV4Model:()=>$v,DeepseekV4PreTrainedModel:()=>Qv,DeiTForImageClassification:()=>dy,DeiTModel:()=>uy,DeiTPreTrainedModel:()=>ly,DepthAnythingForDepthEstimation:()=>py,DepthAnythingPreTrainedModel:()=>fy,DepthProForDepthEstimation:()=>hy,DepthProPreTrainedModel:()=>my,DetrForObjectDetection:()=>vy,DetrForSegmentation:()=>yy,DetrModel:()=>_y,DetrObjectDetectionOutput:()=>by,DetrPreTrainedModel:()=>gy,DetrSegmentationOutput:()=>xy,Dinov2ForImageClassification:()=>wy,Dinov2Model:()=>Cy,Dinov2PreTrainedModel:()=>Sy,Dinov2WithRegistersForImageClassification:()=>Dy,Dinov2WithRegistersModel:()=>Ey,Dinov2WithRegistersPreTrainedModel:()=>Ty,DistilBertForMaskedLM:()=>Ly,DistilBertForQuestionAnswering:()=>Iy,DistilBertForSequenceClassification:()=>Py,DistilBertForTokenClassification:()=>Fy,DistilBertModel:()=>Ny,DistilBertPreTrainedModel:()=>My,DonutSwinModel:()=>zy,DonutSwinPreTrainedModel:()=>Ry,EdgeTamModel:()=>kE,EfficientNetForImageClassification:()=>Gy,EfficientNetModel:()=>Wy,EfficientNetPreTrainedModel:()=>Uy,ElectraForMaskedLM:()=>Jy,ElectraForQuestionAnswering:()=>Zy,ElectraForSequenceClassification:()=>Yy,ElectraForTokenClassification:()=>Xy,ElectraModel:()=>qy,ElectraPreTrainedModel:()=>Ky,Ernie4_5ForCausalLM:()=>eb,Ernie4_5Model:()=>$y,Ernie4_5PretrainedModel:()=>Qy,EsmForMaskedLM:()=>rb,EsmForSequenceClassification:()=>ib,EsmForTokenClassification:()=>ab,EsmModel:()=>nb,EsmPreTrainedModel:()=>tb,EuroBertForMaskedLM:()=>cb,EuroBertForSequenceClassification:()=>lb,EuroBertForTokenClassification:()=>ub,EuroBertModel:()=>sb,EuroBertPreTrainedModel:()=>ob,ExaoneForCausalLM:()=>pb,ExaoneModel:()=>fb,ExaonePreTrainedModel:()=>db,FalconForCausalLM:()=>gb,FalconH1ForCausalLM:()=>yb,FalconH1Model:()=>vb,FalconH1PreTrainedModel:()=>_b,FalconModel:()=>hb,FalconPreTrainedModel:()=>mb,FastViTForImageClassification:()=>Sb,FastViTModel:()=>xb,FastViTPreTrainedModel:()=>bb,Florence2ForConditionalGeneration:()=>wb,Florence2PreTrainedModel:()=>Cb,GLPNForDepthEstimation:()=>ix,GLPNModel:()=>rx,GLPNPreTrainedModel:()=>nx,GPT2LMHeadModel:()=>yx,GPT2Model:()=>vx,GPT2PreTrainedModel:()=>_x,GPTBigCodeForCausalLM:()=>sx,GPTBigCodeModel:()=>ox,GPTBigCodePreTrainedModel:()=>ax,GPTJForCausalLM:()=>Sx,GPTJModel:()=>xx,GPTJPreTrainedModel:()=>bx,GPTNeoForCausalLM:()=>ux,GPTNeoModel:()=>lx,GPTNeoPreTrainedModel:()=>cx,GPTNeoXForCausalLM:()=>px,GPTNeoXModel:()=>fx,GPTNeoXPreTrainedModel:()=>dx,Gemma2ForCausalLM:()=>Ab,Gemma2Model:()=>kb,Gemma2PreTrainedModel:()=>Ob,Gemma3ForCausalLM:()=>Rb,Gemma3ForConditionalGeneration:()=>Lb,Gemma3Model:()=>Ib,Gemma3PreTrainedModel:()=>Fb,Gemma3nForCausalLM:()=>Vb,Gemma3nForConditionalGeneration:()=>Bb,Gemma3nPreTrainedModel:()=>zb,Gemma4ForCausalLM:()=>Ub,Gemma4ForConditionalGeneration:()=>Hb,GemmaForCausalLM:()=>Db,GemmaModel:()=>Eb,GemmaPreTrainedModel:()=>Tb,GlmForCausalLM:()=>Kb,GlmModel:()=>Gb,GlmMoeDsaForCausalLM:()=>Yb,GlmMoeDsaModel:()=>Jb,GlmMoeDsaPreTrainedModel:()=>qb,GlmOcrForConditionalGeneration:()=>tx,GlmPreTrainedModel:()=>Wb,GptOssForCausalLM:()=>gx,GptOssModel:()=>hx,GptOssPreTrainedModel:()=>mx,GraniteForCausalLM:()=>Tx,GraniteModel:()=>wx,GraniteMoeHybridForCausalLM:()=>Ox,GraniteMoeHybridModel:()=>Dx,GraniteMoeHybridPreTrainedModel:()=>Ex,GranitePreTrainedModel:()=>Cx,GraniteSpeechForConditionalGeneration:()=>jx,GroundingDinoForObjectDetection:()=>Nx,GroundingDinoPreTrainedModel:()=>Mx,GroupViTModel:()=>Fx,GroupViTPreTrainedModel:()=>Px,HeliumForCausalLM:()=>Rx,HeliumModel:()=>Lx,HeliumPreTrainedModel:()=>Ix,HieraForImageClassification:()=>Vx,HieraModel:()=>Bx,HieraPreTrainedModel:()=>zx,HrmTextForCausalLM:()=>Wx,HrmTextModel:()=>Ux,HrmTextPreTrainedModel:()=>Hx,HubertForCTC:()=>Qx,HubertForSequenceClassification:()=>$x,HubertModel:()=>Zx,HubertPreTrainedModel:()=>Xx,HunYuanDenseV1ForCausalLM:()=>nS,HunYuanDenseV1Model:()=>tS,HunYuanDenseV1PreTrainedModel:()=>eS,IJepaForImageClassification:()=>oS,IJepaModel:()=>aS,IJepaPreTrainedModel:()=>iS,Idefics3ForConditionalGeneration:()=>rS,ImageMattingOutput:()=>Bh,JAISLMHeadModel:()=>lS,JAISModel:()=>cS,JAISPreTrainedModel:()=>sS,JinaCLIPModel:()=>dS,JinaCLIPPreTrainedModel:()=>uS,JinaCLIPTextModel:()=>fS,JinaCLIPVisionModel:()=>pS,Lfm2ForCausalLM:()=>gS,Lfm2Model:()=>hS,Lfm2MoeForCausalLM:()=>bS,Lfm2MoeModel:()=>yS,Lfm2MoePreTrainedModel:()=>vS,Lfm2PreTrainedModel:()=>mS,Lfm2VlForConditionalGeneration:()=>xS,LightOnOcrForConditionalGeneration:()=>_S,LiteWhisperForConditionalGeneration:()=>RO,Llama4ForCausalLM:()=>ES,Llama4PreTrainedModel:()=>TS,LlamaForCausalLM:()=>wS,LlamaModel:()=>CS,LlamaPreTrainedModel:()=>SS,LlavaForConditionalGeneration:()=>Mb,LlavaOnevisionForConditionalGeneration:()=>Mb,LlavaPreTrainedModel:()=>jb,LlavaQwen2ForCausalLM:()=>Pb,LongT5ForConditionalGeneration:()=>kS,LongT5Model:()=>OS,LongT5PreTrainedModel:()=>DS,M2M100ForConditionalGeneration:()=>MS,M2M100Model:()=>jS,M2M100PreTrainedModel:()=>AS,MBartForCausalLM:()=>US,MBartForConditionalGeneration:()=>VS,MBartForSequenceClassification:()=>HS,MBartModel:()=>BS,MBartPreTrainedModel:()=>zS,MPNetForMaskedLM:()=>aw,MPNetForQuestionAnswering:()=>cw,MPNetForSequenceClassification:()=>ow,MPNetForTokenClassification:()=>sw,MPNetModel:()=>iw,MPNetPreTrainedModel:()=>rw,MT5ForConditionalGeneration:()=>mw,MT5Model:()=>pw,MT5PreTrainedModel:()=>fw,MarianMTModel:()=>FS,MarianModel:()=>PS,MarianPreTrainedModel:()=>NS,MaskFormerForInstanceSegmentation:()=>RS,MaskFormerModel:()=>LS,MaskFormerPreTrainedModel:()=>IS,MaskedLMOutput:()=>Fh,Metric3DForDepthEstimation:()=>GS,Metric3DPreTrainedModel:()=>WS,Metric3Dv2ForDepthEstimation:()=>qS,Metric3Dv2PreTrainedModel:()=>KS,MgpstrForSceneTextRecognition:()=>XS,MgpstrModelOutput:()=>JS,MgpstrPreTrainedModel:()=>YS,MimiDecoderModel:()=>nC,MimiDecoderOutput:()=>QS,MimiEncoderModel:()=>tC,MimiEncoderOutput:()=>ZS,MimiModel:()=>eC,MimiPreTrainedModel:()=>$S,Ministral3ForCausalLM:()=>cC,Ministral3Model:()=>sC,Ministral3PreTrainedModel:()=>oC,MinistralForCausalLM:()=>aC,MinistralModel:()=>iC,MinistralPreTrainedModel:()=>rC,Mistral3ForConditionalGeneration:()=>fC,Mistral4ForCausalLM:()=>hC,Mistral4Model:()=>mC,Mistral4PreTrainedModel:()=>pC,MistralForCausalLM:()=>dC,MistralModel:()=>uC,MistralPreTrainedModel:()=>lC,MobileBertForMaskedLM:()=>vC,MobileBertForQuestionAnswering:()=>bC,MobileBertForSequenceClassification:()=>yC,MobileBertModel:()=>_C,MobileBertPreTrainedModel:()=>gC,MobileLLMForCausalLM:()=>CC,MobileLLMModel:()=>SC,MobileLLMPreTrainedModel:()=>xC,MobileNetV1ForImageClassification:()=>EC,MobileNetV1ForSemanticSegmentation:()=>DC,MobileNetV1Model:()=>TC,MobileNetV1PreTrainedModel:()=>wC,MobileNetV2ForImageClassification:()=>AC,MobileNetV2ForSemanticSegmentation:()=>jC,MobileNetV2Model:()=>kC,MobileNetV2PreTrainedModel:()=>OC,MobileNetV3ForImageClassification:()=>PC,MobileNetV3ForSemanticSegmentation:()=>FC,MobileNetV3Model:()=>NC,MobileNetV3PreTrainedModel:()=>MC,MobileNetV4ForImageClassification:()=>RC,MobileNetV4ForSemanticSegmentation:()=>zC,MobileNetV4Model:()=>LC,MobileNetV4PreTrainedModel:()=>IC,MobileViTForImageClassification:()=>HC,MobileViTModel:()=>VC,MobileViTPreTrainedModel:()=>BC,MobileViTV2ForImageClassification:()=>GC,MobileViTV2Model:()=>WC,MobileViTV2PreTrainedModel:()=>UC,ModelOutput:()=>Mh,ModernBertDecoderForCausalLM:()=>$C,ModernBertDecoderModel:()=>QC,ModernBertDecoderPreTrainedModel:()=>ZC,ModernBertForMaskedLM:()=>JC,ModernBertForSequenceClassification:()=>YC,ModernBertForTokenClassification:()=>XC,ModernBertModel:()=>qC,ModernBertPreTrainedModel:()=>KC,Moondream1ForConditionalGeneration:()=>Nb,MoonshineForConditionalGeneration:()=>nw,MoonshineModel:()=>tw,MoonshinePreTrainedModel:()=>ew,MptForCausalLM:()=>dw,MptModel:()=>uw,MptPreTrainedModel:()=>lw,MultiModalityCausalLM:()=>gw,MultiModalityPreTrainedModel:()=>hw,MusicgenForCausalLM:()=>yw,MusicgenForConditionalGeneration:()=>bw,MusicgenModel:()=>vw,MusicgenPreTrainedModel:()=>_w,NanoChatForCausalLM:()=>Cw,NanoChatModel:()=>Sw,NanoChatPreTrainedModel:()=>xw,NemotronHForCausalLM:()=>Ew,NemotronHModel:()=>Tw,NemotronHPreTrainedModel:()=>ww,NeoBertForMaskedLM:()=>kw,NeoBertForQuestionAnswering:()=>Mw,NeoBertForSequenceClassification:()=>Aw,NeoBertForTokenClassification:()=>jw,NeoBertModel:()=>Ow,NeoBertPreTrainedModel:()=>Dw,NomicBertModel:()=>Pw,NomicBertPreTrainedModel:()=>Nw,OPTForCausalLM:()=>tT,OPTModel:()=>eT,OPTPreTrainedModel:()=>$w,Olmo2ForCausalLM:()=>Bw,Olmo2Model:()=>zw,Olmo2PreTrainedModel:()=>Rw,Olmo3ForCausalLM:()=>Uw,Olmo3Model:()=>Hw,Olmo3PreTrainedModel:()=>Vw,OlmoForCausalLM:()=>Lw,OlmoHybridForCausalLM:()=>Kw,OlmoHybridModel:()=>Gw,OlmoHybridPreTrainedModel:()=>Ww,OlmoModel:()=>Iw,OlmoPreTrainedModel:()=>Fw,OpenAIPrivacyFilterForTokenClassification:()=>Yw,OpenAIPrivacyFilterModel:()=>Jw,OpenAIPrivacyFilterPreTrainedModel:()=>qw,OpenELMForCausalLM:()=>Qw,OpenELMModel:()=>Zw,OpenELMPreTrainedModel:()=>Xw,OwlViTForObjectDetection:()=>sT,OwlViTModel:()=>oT,OwlViTPreTrainedModel:()=>aT,Owlv2ForObjectDetection:()=>iT,Owlv2Model:()=>rT,Owlv2PreTrainedModel:()=>nT,PaliGemmaForConditionalGeneration:()=>cT,ParakeetForCTC:()=>uT,ParakeetPreTrainedModel:()=>lT,PatchTSMixerForPrediction:()=>pT,PatchTSMixerModel:()=>fT,PatchTSMixerPreTrainedModel:()=>dT,PatchTSTForPrediction:()=>gT,PatchTSTModel:()=>hT,PatchTSTPreTrainedModel:()=>mT,Phi3ForCausalLM:()=>ST,Phi3Model:()=>xT,Phi3PreTrainedModel:()=>bT,Phi3VForCausalLM:()=>wT,Phi3VPreTrainedModel:()=>CT,PhiForCausalLM:()=>yT,PhiModel:()=>vT,PhiPreTrainedModel:()=>_T,PreTrainedModel:()=>X,PvtForImageClassification:()=>DT,PvtModel:()=>ET,PvtPreTrainedModel:()=>TT,PyAnnoteForAudioFrameClassification:()=>AT,PyAnnoteModel:()=>kT,PyAnnotePreTrainedModel:()=>OT,QuestionAnsweringModelOutput:()=>Ih,Qwen2ForCausalLM:()=>NT,Qwen2Model:()=>MT,Qwen2MoeForCausalLM:()=>IT,Qwen2MoeModel:()=>FT,Qwen2MoePreTrainedModel:()=>PT,Qwen2PreTrainedModel:()=>jT,Qwen2VLForCausalLM:()=>Qb,Qwen2VLForConditionalGeneration:()=>Zb,Qwen2VLPreTrainedModel:()=>Xb,Qwen2_5_VLForCausalLM:()=>ex,Qwen2_5_VLForConditionalGeneration:()=>$b,Qwen3ForCausalLM:()=>zT,Qwen3Model:()=>RT,Qwen3MoeForCausalLM:()=>HT,Qwen3MoeModel:()=>VT,Qwen3MoePreTrainedModel:()=>BT,Qwen3NextForCausalLM:()=>GT,Qwen3NextModel:()=>WT,Qwen3NextPreTrainedModel:()=>UT,Qwen3PreTrainedModel:()=>LT,Qwen3VLForCausalLM:()=>qT,Qwen3VLForConditionalGeneration:()=>KT,Qwen3VLMoeForCausalLM:()=>YT,Qwen3VLMoeForConditionalGeneration:()=>JT,Qwen3_5ForCausalLM:()=>ZT,Qwen3_5ForConditionalGeneration:()=>XT,Qwen3_5MoeForCausalLM:()=>$T,Qwen3_5MoeForConditionalGeneration:()=>QT,RFDetrForObjectDetection:()=>aE,RFDetrModel:()=>iE,RFDetrObjectDetectionOutput:()=>oE,RFDetrPreTrainedModel:()=>rE,RTDetrForObjectDetection:()=>Mv,RTDetrModel:()=>jv,RTDetrObjectDetectionOutput:()=>Nv,RTDetrPreTrainedModel:()=>Av,RTDetrV2ForObjectDetection:()=>xE,RTDetrV2Model:()=>bE,RTDetrV2ObjectDetectionOutput:()=>SE,RTDetrV2PreTrainedModel:()=>yE,ResNetForImageClassification:()=>nE,ResNetModel:()=>tE,ResNetPreTrainedModel:()=>eE,RoFormerForMaskedLM:()=>hE,RoFormerForQuestionAnswering:()=>vE,RoFormerForSequenceClassification:()=>gE,RoFormerForTokenClassification:()=>_E,RoFormerModel:()=>mE,RoFormerPreTrainedModel:()=>pE,RobertaForMaskedLM:()=>lE,RobertaForQuestionAnswering:()=>fE,RobertaForSequenceClassification:()=>uE,RobertaForTokenClassification:()=>dE,RobertaModel:()=>cE,RobertaPreTrainedModel:()=>sE,Sam2ImageSegmentationOutput:()=>EE,Sam2Model:()=>OE,Sam2PreTrainedModel:()=>DE,Sam3TrackerModel:()=>AE,SamImageSegmentationOutput:()=>CE,SamModel:()=>TE,SamPreTrainedModel:()=>wE,SapiensForDepthEstimation:()=>NE,SapiensForNormalEstimation:()=>PE,SapiensForSemanticSegmentation:()=>ME,SapiensPreTrainedModel:()=>jE,SegformerForImageClassification:()=>LE,SegformerForSemanticSegmentation:()=>RE,SegformerModel:()=>IE,SegformerPreTrainedModel:()=>FE,Seq2SeqLMOutput:()=>zh,SequenceClassifierOutput:()=>J,SiglipModel:()=>BE,SiglipPreTrainedModel:()=>zE,SiglipTextModel:()=>VE,SiglipVisionModel:()=>HE,SmolLM3ForCausalLM:()=>GE,SmolLM3Model:()=>WE,SmolLM3PreTrainedModel:()=>UE,SmolVLMForConditionalGeneration:()=>KE,SnacDecoderModel:()=>XE,SnacEncoderModel:()=>YE,SnacModel:()=>JE,SnacPreTrainedModel:()=>qE,SolarOpenForCausalLM:()=>$E,SolarOpenModel:()=>QE,SolarOpenPreTrainedModel:()=>ZE,SpeechT5ForSpeechToText:()=>nD,SpeechT5ForTextToSpeech:()=>rD,SpeechT5HifiGan:()=>iD,SpeechT5Model:()=>tD,SpeechT5PreTrainedModel:()=>eD,SqueezeBertForMaskedLM:()=>sD,SqueezeBertForQuestionAnswering:()=>lD,SqueezeBertForSequenceClassification:()=>cD,SqueezeBertModel:()=>oD,SqueezeBertPreTrainedModel:()=>aD,StableLmForCausalLM:()=>fD,StableLmModel:()=>dD,StableLmPreTrainedModel:()=>uD,Starcoder2ForCausalLM:()=>hD,Starcoder2Model:()=>mD,Starcoder2PreTrainedModel:()=>pD,StyleTextToSpeech2Model:()=>_D,StyleTextToSpeech2PreTrainedModel:()=>gD,SupertonicForConditionalGeneration:()=>yD,SupertonicPreTrainedModel:()=>vD,Swin2SRForImageSuperResolution:()=>ED,Swin2SRModel:()=>TD,Swin2SRPreTrainedModel:()=>wD,SwinForImageClassification:()=>SD,SwinForSemanticSegmentation:()=>CD,SwinModel:()=>xD,SwinPreTrainedModel:()=>bD,T5ForConditionalGeneration:()=>kD,T5Model:()=>OD,T5PreTrainedModel:()=>DD,TableTransformerForObjectDetection:()=>MD,TableTransformerModel:()=>jD,TableTransformerObjectDetectionOutput:()=>ND,TableTransformerPreTrainedModel:()=>AD,TokenClassifierOutput:()=>Ph,TrOCRForCausalLM:()=>FD,TrOCRPreTrainedModel:()=>PD,UltravoxModel:()=>Ax,UltravoxPreTrainedModel:()=>kx,UniSpeechForCTC:()=>RD,UniSpeechForSequenceClassification:()=>zD,UniSpeechModel:()=>LD,UniSpeechPreTrainedModel:()=>ID,UniSpeechSatForAudioFrameClassification:()=>WD,UniSpeechSatForCTC:()=>HD,UniSpeechSatForSequenceClassification:()=>UD,UniSpeechSatModel:()=>VD,UniSpeechSatPreTrainedModel:()=>BD,VaultGemmaForCausalLM:()=>qD,VaultGemmaModel:()=>KD,VaultGemmaPreTrainedModel:()=>GD,ViTForImageClassification:()=>ZD,ViTMAEModel:()=>$D,ViTMAEPreTrainedModel:()=>QD,ViTMSNForImageClassification:()=>nO,ViTMSNModel:()=>tO,ViTMSNPreTrainedModel:()=>eO,ViTModel:()=>XD,ViTPreTrainedModel:()=>YD,VisionEncoderDecoderModel:()=>JD,VitMatteForImageMatting:()=>iO,VitMattePreTrainedModel:()=>rO,VitPoseForPoseEstimation:()=>oO,VitPosePreTrainedModel:()=>aO,VitsModel:()=>lO,VitsModelOutput:()=>sO,VitsPreTrainedModel:()=>cO,VoxtralForConditionalGeneration:()=>uO,VoxtralRealtimeForConditionalGeneration:()=>bO,VoxtralRealtimePreTrainedModel:()=>yO,Wav2Vec2BertForCTC:()=>CO,Wav2Vec2BertForSequenceClassification:()=>wO,Wav2Vec2BertModel:()=>SO,Wav2Vec2BertPreTrainedModel:()=>xO,Wav2Vec2ForAudioFrameClassification:()=>Yx,Wav2Vec2ForCTC:()=>qx,Wav2Vec2ForSequenceClassification:()=>Jx,Wav2Vec2Model:()=>Kx,Wav2Vec2PreTrainedModel:()=>Gx,WavLMForAudioFrameClassification:()=>jO,WavLMForCTC:()=>OO,WavLMForSequenceClassification:()=>kO,WavLMForXVector:()=>AO,WavLMModel:()=>DO,WavLMPreTrainedModel:()=>EO,WeSpeakerResNetModel:()=>NO,WeSpeakerResNetPreTrainedModel:()=>MO,WhisperForConditionalGeneration:()=>LO,WhisperModel:()=>IO,WhisperPreTrainedModel:()=>FO,XLMForQuestionAnswering:()=>WO,XLMForSequenceClassification:()=>HO,XLMForTokenClassification:()=>UO,XLMModel:()=>BO,XLMPreTrainedModel:()=>zO,XLMRobertaForMaskedLM:()=>qO,XLMRobertaForQuestionAnswering:()=>XO,XLMRobertaForSequenceClassification:()=>JO,XLMRobertaForTokenClassification:()=>YO,XLMRobertaModel:()=>KO,XLMRobertaPreTrainedModel:()=>GO,XLMWithLMHeadModel:()=>VO,XVectorOutput:()=>TO,YolosForObjectDetection:()=>$O,YolosModel:()=>QO,YolosObjectDetectionOutput:()=>ek,YolosPreTrainedModel:()=>ZO,YoutuForCausalLM:()=>rk,YoutuModel:()=>nk,YoutuPreTrainedModel:()=>tk,ZayaForCausalLM:()=>ok,ZayaModel:()=>ak,ZayaPreTrainedModel:()=>ik});var Jg=class extends X{},Yg=class extends Jg{},Xg=class extends Jg{async _call(e){return new J(await super._call(e))}},Zg=class extends Jg{async _call(e){return new Ih(await super._call(e))}},Qg=class extends Jg{async _call(e){return new Fh(await super._call(e))}},$g=class extends X{},e_=class extends $g{},t_=class extends $g{},n_=class extends X{},r_=class extends n_{},i_=class extends n_{},a_=class extends X{},o_=class extends a_{},s_=class extends a_{},c_=class extends X{},l_=class extends c_{},u_=class extends c_{},d_=class extends X{},f_=class extends d_{},p_=class extends d_{},m_=class extends d_{async _call(e){return new J(await super._call(e))}},h_=class extends X{},g_=class extends h_{},__=class extends h_{async _call(e){return new J(await super._call(e))}},v_=class extends X{},y_=class extends v_{},b_=class extends v_{async _call(e){return new Fh(await super._call(e))}},x_=class extends v_{async _call(e){return new J(await super._call(e))}},S_=class extends v_{async _call(e){return new Ph(await super._call(e))}},C_=class extends v_{async _call(e){return new Ih(await super._call(e))}},w_=class extends X{},T_=class extends w_{},E_=class extends w_{},D_=class extends X{},O_=class extends D_{},k_=class extends D_{},A_=class extends X{},j_=class extends A_{},M_=class extends A_{},N_=class extends X{},P_=class extends N_{},F_=class extends N_{async _call(e){return new Fh(await super._call(e))}},I_=class extends N_{async _call(e){return new J(await super._call(e))}},L_=class extends N_{async _call(e){return new Ph(await super._call(e))}},R_=class extends N_{async _call(e){return new Ih(await super._call(e))}},z_=4299n,B_=6561n,V_=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`audio_values`,`exaggeration`,`audio_features`,`audio_tokens`,`speaker_embeddings`,`speaker_features`,`past_key_values`];main_input_name=`input_ids`;_return_dict_in_generate_keys=[`audio_tokens`,`speaker_embeddings`,`speaker_features`]},H_=class extends V_{async encode_speech(e){return q(this.sessions.speech_encoder,{audio_values:e})}async forward({input_ids:e=null,attention_mask:t=null,audio_values:n=null,exaggeration:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,audio_features:u=null,audio_tokens:d=null,speaker_embeddings:f=null,speaker_features:p=null,...m}){let h;if(!a){let s=this.sessions.embed_tokens.inputNames,c={input_ids:e};if(s.includes(`exaggeration`)){if(!(r instanceof V)){let t=e.dims[0];if(r==null)r=_u([t],.5);else if(typeof r==`number`)r=_u([t],r);else if(Array.isArray(r))r=new V(`float32`,r,[t]);else throw Error("Unsupported type for `exaggeration` input")}c.exaggeration=r}if(s.includes(`position_ids`)&&(c.position_ids=i),{inputs_embeds:a}=await q(this.sessions.embed_tokens,c),u&&d&&f&&p&&(h={audio_features:u,audio_tokens:d,speaker_embeddings:f,speaker_features:p}),h||n)h??=await this.encode_speech(n),a=H([h.audio_features,a],1),t=yu([a.dims[0],a.dims[1]]);else{let e=a.dims[1];if(!o||e!==1)throw Error(`Incorrect state encountered during generation.`);let n=o.get_seq_length();t=yu([a.dims[0],n+e])}}return{...await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1),...h}}prepare_inputs_for_generation(e,t,n){return!t.position_ids&&this.sessions.embed_tokens.inputNames.includes(`position_ids`)&&(t.position_ids=t.input_ids.dims[1]===1?new V(`int64`,Array.from({length:e.length},(t,n)=>e[n].length-e[n].findLastIndex(e=>e==B_)-1),[e.length,1]):new V(`int64`,t.input_ids.tolist().map(e=>{let t=0;return e.map(e=>e>=B_?0:t++)}).flat(),t.input_ids.dims)),t.input_ids.dims[1]===1&&(delete t.audio_values,delete t.audio_features,delete t.audio_tokens,delete t.speaker_embeddings,delete t.speaker_features),Bg(this,e,t,n)}async generate(e){let t=e.past_key_values,{sequences:n,audio_tokens:r,speaker_embeddings:i,speaker_features:a,past_key_values:o}=await super.generate({...e,return_dict_in_generate:!0});try{let t=n.slice(null,[e.input_ids.dims[1],-1]),o=H([r,t,_u([t.dims[0],3],z_)],1),{waveform:s}=await q(this.sessions.conditional_decoder,{speech_tokens:o,speaker_features:a,speaker_embeddings:i});return s}finally{o!==t&&await o?.dispose()}}},U_=class extends X{},W_=class extends U_{},G_=class extends X{},K_=class extends G_{},q_=class extends X{},J_=class extends q_{},Y_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},X_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`audio_model`})}},Z_=class extends X{},Q_=class extends Z_{},$_=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},ev=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},tv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},nv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},rv=class extends X{},iv=class extends rv{},av=class extends rv{},ov=class extends X{},sv=class extends ov{},cv=class extends ov{},lv=class extends X{},uv=class extends lv{},dv=class extends lv{},fv=class extends X{},pv=class extends fv{},mv=class extends fv{},hv=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},gv=class extends hv{},_v=class extends hv{},vv=class extends X{},yv=class extends vv{},bv=class extends vv{async _call(e){return new Fh(await super._call(e))}},xv=class extends vv{async _call(e){return new J(await super._call(e))}},Sv=class extends vv{async _call(e){return new Ph(await super._call(e))}},Cv=class extends vv{async _call(e){return new Ih(await super._call(e))}},wv=class extends X{},Tv=class extends wv{},Ev=class extends wv{async _call(e){return new J(await super._call(e))}},Dv=class extends X{},Ov=class extends Dv{},kv=class extends Dv{async _call(e){return new J(await super._call(e))}},Av=class extends X{},jv=class extends Av{},Mv=class extends Av{async _call(e){return new Nv(await super._call(e))}},Nv=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},Pv=class extends X{},Fv=class extends Pv{},Iv=class extends Pv{async _call(e){return new Nv(await super._call(e))}},Lv=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},Rv=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},zv=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},Bv=class extends zv{async encode(e){return new Lv(await q(this.sessions.encoder_model,e))}async decode(e){return new Rv(await q(this.sessions.decoder_model,e))}},Vv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},Hv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},Uv=class extends X{},Wv=class extends Uv{},Gv=class extends Uv{async _call(e){return new Fh(await super._call(e))}},Kv=class extends Uv{async _call(e){return new J(await super._call(e))}},qv=class extends Uv{async _call(e){return new Ph(await super._call(e))}},Jv=class extends Uv{async _call(e){return new Ih(await super._call(e))}},Yv=class extends X{},Xv=class extends Yv{},Zv=class extends Yv{},Qv=class extends X{},$v=class extends Qv{},ey=class extends Qv{},ty=class extends X{},ny=class extends ty{},ry=class extends ty{async _call(e){return new Fh(await super._call(e))}},iy=class extends ty{async _call(e){return new J(await super._call(e))}},ay=class extends ty{async _call(e){return new Ph(await super._call(e))}},oy=class extends ty{async _call(e){return new Ih(await super._call(e))}},sy=class extends X{},cy=class extends sy{},ly=class extends X{},uy=class extends ly{},dy=class extends ly{async _call(e){return new J(await super._call(e))}},fy=class extends X{},py=class extends fy{},my=class extends X{},hy=class extends my{},gy=class extends X{},_y=class extends gy{},vy=class extends gy{async _call(e){return new by(await super._call(e))}},yy=class extends gy{async _call(e){return new xy(await super._call(e))}},by=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},xy=class extends Mh{constructor({logits:e,pred_boxes:t,pred_masks:n}){super(),this.logits=e,this.pred_boxes=t,this.pred_masks=n}},Sy=class extends X{},Cy=class extends Sy{},wy=class extends Sy{async _call(e){return new J(await super._call(e))}},Ty=class extends X{},Ey=class extends Ty{},Dy=class extends Ty{async _call(e){return new J(await super._call(e))}},Oy=class extends X{},ky=class extends Oy{},Ay=class extends X{},jy=class extends Ay{},My=class extends X{},Ny=class extends My{},Py=class extends My{async _call(e){return new J(await super._call(e))}},Fy=class extends My{async _call(e){return new Ph(await super._call(e))}},Iy=class extends My{async _call(e){return new Ih(await super._call(e))}},Ly=class extends My{async _call(e){return new Fh(await super._call(e))}},Ry=class extends X{},zy=class extends Ry{},By=class extends X{},Vy=class extends By{},Hy=class extends By{},Uy=class extends X{},Wy=class extends Uy{},Gy=class extends Uy{async _call(e){return new J(await super._call(e))}},Ky=class extends X{},qy=class extends Ky{},Jy=class extends Ky{async _call(e){return new Fh(await super._call(e))}},Yy=class extends Ky{async _call(e){return new J(await super._call(e))}},Xy=class extends Ky{async _call(e){return new Ph(await super._call(e))}},Zy=class extends Ky{async _call(e){return new Ih(await super._call(e))}},Qy=class extends X{},$y=class extends Qy{},eb=class extends Qy{},tb=class extends X{},nb=class extends tb{},rb=class extends tb{async _call(e){return new Fh(await super._call(e))}},ib=class extends tb{async _call(e){return new J(await super._call(e))}},ab=class extends tb{async _call(e){return new Ph(await super._call(e))}},ob=class extends X{},sb=class extends ob{},cb=class extends ob{async _call(e){return new Fh(await super._call(e))}},lb=class extends ob{async _call(e){return new J(await super._call(e))}},ub=class extends ob{async _call(e){return new Ph(await super._call(e))}},db=class extends X{},fb=class extends db{},pb=class extends db{},mb=class extends X{},hb=class extends mb{},gb=class extends mb{},_b=class extends X{},vb=class extends _b{},yb=class extends _b{},bb=class extends X{},xb=class extends bb{},Sb=class extends bb{async _call(e){return new J(await super._call(e))}},Cb=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`pixel_values`,`encoder_outputs`,`decoder_input_ids`,`decoder_inputs_embeds`,`decoder_attention_mask`,`past_key_values`];main_input_name=`inputs_embeds`},wb=class extends Cb{_merge_input_ids_with_image_features({inputs_embeds:e,image_features:t,input_ids:n,attention_mask:r}){return{inputs_embeds:H([t,e],1),attention_mask:H([yu(t.dims.slice(0,2)),r],1)}}async _prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:n,attention_mask:r}){if(!e&&!t)throw Error("Either `input_ids` or `pixel_values` should be provided.");let i,a;return e&&(i=await this.encode_text({input_ids:e})),t&&(a=await this.encode_image({pixel_values:t})),i&&a?{inputs_embeds:n,attention_mask:r}=this._merge_input_ids_with_image_features({inputs_embeds:i,image_features:a,input_ids:e,attention_mask:r}):n=i||a,{inputs_embeds:n,attention_mask:r}}async forward({input_ids:e,pixel_values:t,attention_mask:n,decoder_input_ids:r,decoder_attention_mask:i,encoder_outputs:a,past_key_values:o,inputs_embeds:s,decoder_inputs_embeds:c,num_logits_to_keep:l=null}){if(s||({inputs_embeds:s,attention_mask:n}=await this._prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:s,attention_mask:n})),!a){let{last_hidden_state:e}=await Dg(this,{inputs_embeds:s,attention_mask:n});a=e}if(!c){if(!r)throw Error("Either `decoder_input_ids` or `decoder_inputs_embeds` should be provided.");c=await this.encode_text({input_ids:r})}let u={inputs_embeds:c,attention_mask:i,encoder_attention_mask:n,encoder_hidden_states:a,past_key_values:o,num_logits_to_keep:l};return await Pg(this,u,!0)}},Tb=class extends X{},Eb=class extends Tb{},Db=class extends Tb{},Ob=class extends X{},kb=class extends Ob{},Ab=class extends Ob{},jb=class extends X{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`position_ids`,`past_key_values`]},Mb=class extends jb{_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_index??this.config.image_token_id,...e,image_features:n})}},Nb=class extends Mb{},Pb=class extends Mb{},Fb=class extends X{},Ib=class extends Fb{},Lb=class extends Mb{},Rb=class extends Lb{},zb=class extends X{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`input_features`,`input_features_mask`,`past_key_values`]},Bb=class extends zb{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,input_features:r=null,input_features_mask:i=null,position_ids:a=null,inputs_embeds:o=null,per_layer_inputs:s=null,past_key_values:c=null,generation_config:l=null,logits_processor:u=null,num_logits_to_keep:d=null,...f}){if((!o||!s)&&({inputs_embeds:o,per_layer_inputs:s}=await q(this.sessions.embed_tokens,{input_ids:e}),e.dims[1]!==1)){if(n){let{image_features:r}=await this._encode_vision({pixel_values:n,...f});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_image_features({image_features:r,inputs_embeds:o,input_ids:e,attention_mask:t}))}if(r){let{audio_features:n}=await q(this.sessions.audio_encoder,{input_features:r,input_features_mask:i});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_audio_features({audio_features:n,inputs_embeds:o,input_ids:e,attention_mask:t}))}}return await Pg(this,{inputs_embeds:o,per_layer_inputs:s,past_key_values:c,attention_mask:t,position_ids:a,generation_config:l,logits_processor:u,num_logits_to_keep:d},!0)}_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values})}_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_id,...e,image_features:n})}_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.audio_token_id,...e,audio_features:n})}},Vb=class extends Bb{},Hb=class extends Bb{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`image_position_ids`,`input_features`,`input_features_mask`,`past_key_values`];_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values,pixel_position_ids:e.image_position_ids})}},Ub=class extends Hb{},Wb=class extends X{},Gb=class extends Wb{},Kb=class extends Wb{},qb=class extends X{},Jb=class extends qb{},Yb=class extends qb{},Xb=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`,`pixel_values`,`image_grid_thw`]},Zb=class extends Xb{image_grid_thw_name=`grid_thw`;_get_text_only_rope_index(e,t){if(t){let{data:e,dims:n}=Rg(t),r=BigInt64Array.from({length:3*e.length},(t,n)=>e[n%e.length]),i=Array.from({length:n[0]},(t,r)=>ll(e.subarray(n[1]*r,n[1]*(r+1)))[0]+1n+BigInt(n[1]));return[new V(`int64`,r,[3,...n]),new V(`int64`,i,[i.length,1])]}{let[t,n]=e.dims;return[new V(`int64`,BigInt64Array.from({length:3*t*n},(e,r)=>BigInt(Math.floor(r%n/t))),[3,...e.dims]),xu([t,1])]}}_reorder_and_write_positions(e,t,n,r){let i=e.reduce((e,t)=>e+t.length,0),a=Array(i),o=0;for(let t=0;t<3;++t)for(let n of e){let e=n.length/3;for(let r=t*e;r<(t+1)*e;++r)a[o++]=n[r]}let s=0;for(let e=0;e(t==s&&e.push(n),e),[]).map(e=>c[e+1]),u=l.filter(e=>e==a).length,d=l.filter(e=>e==o).length,f=[],p=0,m=u,h=d;for(let e=0;et>p&&e==a),s=c.findIndex((e,t)=>t>p&&e==o),l=m>0&&e!==-1?e:c.length+1,u=h>0&&s!==-1?s:c.length+1,d,g,_,v;l0?ll(f.at(-1))[0]+1:0;f.push(Array.from({length:3*S},(e,t)=>C+t%S));let ee=S+C,w=y*b*x,te=Array.from({length:w},(e,t)=>ee+Math.floor(t/(b*x))),ne=Array.from({length:w},(e,t)=>ee+Math.floor(t/x)%b),re=Array.from({length:w},(e,t)=>ee+t%x);f.push([te,ne,re].flat()),p=d+w}if(p0?ll(f.at(-1))[0]+1:0,t=c.length-p;f.push(Array.from({length:3*t},(n,r)=>e+r%t))}return f}get_rope_index(e,t,n,r){let{vision_config:i}=this.config,a=i.spatial_merge_size??2;if(t||n){let i=e.tolist();r||=bu(e);let o=r.tolist(),s=Array.from({length:3},()=>Array.from({length:e.dims[0]},()=>Array.from({length:e.dims[1]},()=>0))),c=t?t.tolist():[],l=n?n.tolist():[],u={image_index:0,video_index:0},d=[];for(let e=0;eo[e][n]==1),n=this._get_multimodal_rope_positions({filtered_ids:t,image_grid_thw_list:c,video_grid_thw_list:l,spatial_merge_size:a,state:u}),r=this._reorder_and_write_positions(n,o[e],s,e);d.push(ll(r)[0]+1-i[e].length)}return[new V(`int64`,s.flat(1/0),[3,e.dims[0],e.dims[1]]),new V(`int64`,d,[d.length,1])]}return this._get_text_only_rope_index(e,r)}async encode_image({pixel_values:e,image_grid_thw:t}){return(await q(this.sessions.vision_encoder,{pixel_values:e,[this.image_grid_thw_name]:t})).image_features}_merge_input_ids_with_image_features(e){return Wg({image_token_id:this.config.image_token_id,...e})}prepare_inputs_for_generation(e,t,n){if(Ng(this,t,1n),!t.attention_mask||t.position_ids||!(this.sessions.decoder_model_merged??this.sessions.model).inputNames.includes(`position_ids`))return t;if(!t.past_key_values)[t.position_ids,t.rope_deltas]=this.get_rope_index(t.input_ids,t.image_grid_thw,t.video_grid_thw,t.attention_mask);else{t.pixel_values=null;let e=t.past_key_values.get_seq_length();if(en+e);t.position_ids=du([r,r,r],0)}}return t}},Qb=class extends Zb{},$b=class extends Zb{image_grid_thw_name=`image_grid_thw`},ex=class extends Qb{image_grid_thw_name=`image_grid_thw`},tx=class extends $b{get_vision_position_ids(e,t,n,r){let i=Math.floor(t[0]/n),a=Math.floor(t[1]/r),o=Math.floor(t[2]/r),s=a*o*i,c=Array.from({length:s},()=>e),l=Array.from({length:s},(t,n)=>e+Math.floor(n/(o*i))),u=Array.from({length:s},(t,n)=>e+n%o);return[...c,...l,...u]}_get_multimodal_rope_positions({filtered_ids:e,image_grid_thw_list:t,video_grid_thw_list:n,spatial_merge_size:r,state:i}){let{image_token_id:a}=this.config,o=[],s=0,c=+(e[0]==a);for(let t=1;t<=e.length;++t){let n=tl+n%e)),l+=e}else{let e=t[i.image_index++].map(Number),n=e[0];u.push(this.get_vision_position_ids(l,e,n,r)),l+=Math.max(e[1],e[2])/r}return u}},nx=class extends X{},rx=class extends nx{},ix=class extends nx{},ax=class extends X{},ox=class extends ax{},sx=class extends ax{},cx=class extends X{},lx=class extends cx{},ux=class extends cx{},dx=class extends X{},fx=class extends dx{},px=class extends dx{},mx=class extends X{},hx=class extends mx{},gx=class extends mx{},_x=class extends X{},vx=class extends _x{},yx=class extends _x{},bx=class extends X{},xx=class extends bx{},Sx=class extends bx{},Cx=class extends X{},wx=class extends Cx{},Tx=class extends Cx{},Ex=class extends X{},Dx=class extends Ex{},Ox=class extends Ex{},kx=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`audio_values`,`past_key_values`]},Ax=class extends kx{_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.ignore_index??this.config.audio_token_id??this.config.audio_token_index,...e,audio_features:n})}},jx=class extends Ax{forward_params=[`input_ids`,`attention_mask`,`input_features`,`past_key_values`]},Mx=class extends X{},Nx=class extends Mx{},Px=class extends X{},Fx=class extends Px{},Ix=class extends X{},Lx=class extends Ix{},Rx=class extends Ix{},zx=class extends X{},Bx=class extends zx{},Vx=class extends zx{async _call(e){return new J(await super._call(e))}},Hx=class extends X{},Ux=class extends Hx{},Wx=class extends Hx{forward_params=[`input_ids`,`attention_mask`,`token_type_ids`,`past_key_values`];prepare_inputs_for_generation(e,t,n){let r=Bg(this,e,t,n);return r.token_type_ids=(r.past_key_values?Su:bu)(r.input_ids),r}},Gx=class extends X{},Kx=class extends Gx{},qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},Jx=class extends Gx{async _call(e){return new J(await super._call(e))}},Yx=class extends Gx{async _call(e){return new Ph(await super._call(e))}},Xx=class extends X{},Zx=class extends Gx{},Qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},$x=class extends Gx{async _call(e){return new J(await super._call(e))}},eS=class extends X{},tS=class extends eS{},nS=class extends eS{},rS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`position_ids`,`past_key_values`]},iS=class extends X{},aS=class extends iS{},oS=class extends iS{async _call(e){return new J(await super._call(e))}},sS=class extends X{},cS=class extends sS{},lS=class extends sS{},uS=class extends X{},dS=class extends uS{async forward(e){let t=!e.input_ids,n=!e.pixel_values;if(t&&n)throw Error("Either `input_ids` or `pixel_values` should be provided.");if(t&&(e.input_ids=yu([e.pixel_values.dims[0],1])),n){let{image_size:t}=this.config.vision_config;e.pixel_values=_u([0,3,t,t],0)}let{text_embeddings:r,image_embeddings:i,l2norm_text_embeddings:a,l2norm_image_embeddings:o}=await super.forward(e),s={};return t||(s.text_embeddings=r,s.l2norm_text_embeddings=a),n||(s.image_embeddings=i,s.l2norm_image_embeddings=o),s}},fS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},pS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},mS=class extends X{},hS=class extends mS{},gS=class extends mS{},_S=class extends Mb{},vS=class extends X{},yS=class extends vS{},bS=class extends vS{},xS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`spatial_shapes`,`position_ids`,`past_key_values`]},SS=class extends X{},CS=class extends SS{},wS=class extends SS{},TS=class extends X{},ES=class extends TS{},DS=class extends X{},OS=class extends DS{},kS=class extends DS{},AS=class extends X{},jS=class extends AS{},MS=class extends AS{},NS=class extends X{},PS=class extends NS{},FS=class extends NS{},IS=class extends X{},LS=class extends IS{},RS=class extends IS{},zS=class extends X{},BS=class extends zS{},VS=class extends zS{},HS=class extends zS{async _call(e){return new J(await super._call(e))}},US=class extends zS{},WS=class extends X{},GS=class extends WS{},KS=class extends X{},qS=class extends KS{},JS=class extends Mh{constructor({char_logits:e,bpe_logits:t,wp_logits:n}){super(),this.char_logits=e,this.bpe_logits=t,this.wp_logits=n}get logits(){return[this.char_logits,this.bpe_logits,this.wp_logits]}},YS=class extends X{},XS=class extends YS{async _call(e){return new JS(await super._call(e))}},ZS=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},QS=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},$S=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},eC=class extends $S{async encode(e){return new ZS(await q(this.sessions.encoder_model,e))}async decode(e){return new QS(await q(this.sessions.decoder_model,e))}},tC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},nC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},rC=class extends X{},iC=class extends rC{},aC=class extends rC{},oC=class extends X{},sC=class extends oC{},cC=class extends oC{},lC=class extends X{},uC=class extends lC{},dC=class extends lC{},fC=class extends Mb{},pC=class extends X{},mC=class extends pC{},hC=class extends pC{},gC=class extends X{},_C=class extends gC{},vC=class extends gC{async _call(e){return new Fh(await super._call(e))}},yC=class extends gC{async _call(e){return new J(await super._call(e))}},bC=class extends gC{async _call(e){return new Ih(await super._call(e))}},xC=class extends X{},SC=class extends xC{},CC=class extends xC{},wC=class extends X{},TC=class extends wC{},EC=class extends wC{async _call(e){return new J(await super._call(e))}},DC=class extends wC{},OC=class extends X{},kC=class extends OC{},AC=class extends OC{async _call(e){return new J(await super._call(e))}},jC=class extends OC{},MC=class extends X{},NC=class extends MC{},PC=class extends MC{async _call(e){return new J(await super._call(e))}},FC=class extends MC{},IC=class extends X{},LC=class extends IC{},RC=class extends IC{async _call(e){return new J(await super._call(e))}},zC=class extends IC{},BC=class extends X{},VC=class extends BC{},HC=class extends BC{async _call(e){return new J(await super._call(e))}},UC=class extends X{},WC=class extends UC{},GC=class extends UC{async _call(e){return new J(await super._call(e))}},KC=class extends X{},qC=class extends KC{},JC=class extends KC{async _call(e){return new Fh(await super._call(e))}},YC=class extends KC{async _call(e){return new J(await super._call(e))}},XC=class extends KC{async _call(e){return new Ph(await super._call(e))}},ZC=class extends X{},QC=class extends ZC{},$C=class extends ZC{},ew=class extends X{requires_attention_mask=!1;main_input_name=`input_values`;forward_params=[`input_values`,`decoder_input_ids`,`past_key_values`]},tw=class extends ew{},nw=class extends ew{},rw=class extends X{},iw=class extends rw{},aw=class extends rw{async _call(e){return new Fh(await super._call(e))}},ow=class extends rw{async _call(e){return new J(await super._call(e))}},sw=class extends rw{async _call(e){return new Ph(await super._call(e))}},cw=class extends rw{async _call(e){return new Ih(await super._call(e))}},lw=class extends X{},uw=class extends lw{},dw=class extends lw{},fw=class extends X{},pw=class extends fw{},mw=class extends fw{},hw=class extends X{},gw=class extends hw{forward_params=[`input_ids`,`pixel_values`,`images_seq_mask`,`images_emb_mask`,`attention_mask`,`position_ids`,`past_key_values`];constructor(...e){super(...e),this._generation_mode=`text`}async forward(e){let t=this._generation_mode??`text`,n;if(t===`text`||!e.past_key_values){let t=this.sessions.prepare_inputs_embeds;n=await q(t,ci(e,t.inputNames))}else{let t=this.sessions.gen_img_embeds;n=await q(t,ci({image_ids:e.input_ids},t.inputNames))}let r={...e,...n},i=await Pg(this,r),a=this.sessions[t===`text`?`lm_head`:`gen_head`];if(!a)throw Error(`Unable to find "${a}" generation head`);let o=await q(a,ci(i,a.inputNames));return{...n,...i,...o}}prepare_inputs_for_generation(e,t,n){let r=!!t.past_key_values;return Ng(this,t,1n),n.guidance_scale!==null&&n.guidance_scale>1&&(r?t.input_ids=H([t.input_ids,t.input_ids],0):(t.input_ids=H([t.input_ids,vu(t.input_ids,BigInt(n.pad_token_id))],0),t.attention_mask=H([t.attention_mask,vu(t.attention_mask,0n)],0))),(r||!t.pixel_values)&&(t.pixel_values=_u([0,0,3,384,384],1)),r&&(t.images_seq_mask=new V(`bool`,[,].fill(!0).fill(!1,0,1),[1,1]),t.images_emb_mask=new V(`bool`,[].fill(!1),[1,1,0])),t}async generate(e){return this._generation_mode=`text`,super.generate(e)}async generate_images(e){this._generation_mode=`image`;let t=(e.inputs??e[this.main_input_name]).dims[1],n=(await super.generate(e)).slice(null,[t,null]),r=this.sessions.image_decode,{decoded_image:i}=await q(r,{generated_tokens:n}),a=i.add_(1).mul_(255/2).clamp_(0,255).to(`uint8`),o=[];for(let e of a){let t=Vf.fromTensor(e);o.push(t)}return o}},_w=class extends X{},vw=class extends _w{},yw=class extends _w{},bw=class extends X{forward_params=[`input_ids`,`attention_mask`,`encoder_outputs`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`];_apply_and_filter_by_delay_pattern_mask(e){let[t,n]=e.dims,r=this.config.decoder.num_codebooks,i=n-r,a=0;for(let t=0;t0&&o<=i&&(e.data[a++]=e.data[t])}let o=Math.floor(t/r),s=a/(o*r);return new V(e.type,e.data.slice(0,a),[o,r,s])}prepare_inputs_for_generation(e,t,n){let r=BigInt(this.config.decoder.pad_token_id),i=structuredClone(e);for(let e=0;e=t&&(i[e][t]=r);return n.guidance_scale!==null&&n.guidance_scale>1&&(i=i.concat(i)),Vg(this,i,t,n)}async generate(e){let t=await super.generate(e),n=this._apply_and_filter_by_delay_pattern_mask(t).unsqueeze_(0),{audio_values:r}=await q(this.sessions.encodec_decode,{audio_codes:n});return r}},xw=class extends X{},Sw=class extends xw{},Cw=class extends xw{},ww=class extends X{},Tw=class extends ww{},Ew=class extends ww{},Dw=class extends X{},Ow=class extends Dw{},kw=class extends Dw{async _call(e){return new Fh(await super._call(e))}},Aw=class extends Dw{async _call(e){return new J(await super._call(e))}},jw=class extends Dw{async _call(e){return new Ph(await super._call(e))}},Mw=class extends Dw{async _call(e){return new Ih(await super._call(e))}},Nw=class extends X{},Pw=class extends Nw{},Fw=class extends X{},Iw=class extends Fw{},Lw=class extends Fw{},Rw=class extends X{},zw=class extends Rw{},Bw=class extends Rw{},Vw=class extends X{},Hw=class extends Vw{},Uw=class extends Vw{},Ww=class extends X{},Gw=class extends Ww{},Kw=class extends Ww{},qw=class extends X{},Jw=class extends qw{},Yw=class extends qw{async _call(e){return new J(await super._call(e))}},Xw=class extends X{},Zw=class extends Xw{},Qw=class extends Xw{},$w=class extends X{},eT=class extends $w{},tT=class extends $w{},nT=class extends X{},rT=class extends nT{},iT=class extends nT{},aT=class extends X{},oT=class extends aT{},sT=class extends aT{},cT=class extends Mb{},lT=class extends X{},uT=class extends lT{async _call(e){return new Lh(await super._call(e))}},dT=class extends X{},fT=class extends dT{},pT=class extends dT{},mT=class extends X{},hT=class extends mT{},gT=class extends mT{},_T=class extends X{},vT=class extends _T{},yT=class extends _T{},bT=class extends X{},xT=class extends bT{},ST=class extends bT{},CT=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`pixel_values`,`image_sizes`,`past_key_values`]},wT=class extends CT{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,image_sizes:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,...u}){if(!a){let t;if(n&&e.dims[1]!==1){if(!r)throw Error("`image_sizes` must be provided when `pixel_values` is provided.");({image_features:t}=await q(this.sessions.vision_encoder,{pixel_values:n,image_sizes:r}))}else{let e=this.config.normalized_config.hidden_size;t=new V(`float32`,[],[0,e])}({inputs_embeds:a}=await q(this.sessions.prepare_inputs_embeds,{input_ids:e,image_features:t}))}return await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,position_ids:i,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1)}},TT=class extends X{},ET=class extends TT{},DT=class extends TT{async _call(e){return new J(await super._call(e))}},OT=class extends X{},kT=class extends OT{},AT=class extends OT{async _call(e){return new Ph(await super._call(e))}},jT=class extends X{},MT=class extends jT{},NT=class extends jT{},PT=class extends X{},FT=class extends PT{},IT=class extends PT{},LT=class extends X{},RT=class extends LT{},zT=class extends LT{},BT=class extends X{},VT=class extends BT{},HT=class extends BT{},UT=class extends X{},WT=class extends UT{},GT=class extends UT{},KT=class extends $b{},qT=class extends ex{},JT=class extends KT{},YT=class extends qT{},XT=class extends KT{},ZT=class extends XT{},QT=class extends XT{},$T=class extends ZT{},eE=class extends X{},tE=class extends eE{},nE=class extends eE{async _call(e){return new J(await super._call(e))}},rE=class extends X{},iE=class extends rE{},aE=class extends rE{async _call(e){return new oE(await super._call(e))}},oE=class extends Nv{},sE=class extends X{},cE=class extends sE{},lE=class extends sE{async _call(e){return new Fh(await super._call(e))}},uE=class extends sE{async _call(e){return new J(await super._call(e))}},dE=class extends sE{async _call(e){return new Ph(await super._call(e))}},fE=class extends sE{async _call(e){return new Ih(await super._call(e))}},pE=class extends X{},mE=class extends pE{},hE=class extends pE{async _call(e){return new Fh(await super._call(e))}},gE=class extends pE{async _call(e){return new J(await super._call(e))}},_E=class extends pE{async _call(e){return new Ph(await super._call(e))}},vE=class extends pE{async _call(e){return new Ih(await super._call(e))}},yE=class extends X{},bE=class extends yE{},xE=class extends yE{async _call(e){return new SE(await super._call(e))}},SE=class extends Nv{},CE=class extends Mh{constructor({iou_scores:e,pred_masks:t}){super(),this.iou_scores=e,this.pred_masks=t}},wE=class extends X{},TE=class extends wE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){e=!e.image_embeddings||!e.image_positional_embeddings?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_labels??=yu(e.input_points.dims.slice(0,-1));let t={image_embeddings:e.image_embeddings,image_positional_embeddings:e.image_positional_embeddings};return e.input_points&&(t.input_points=e.input_points),e.input_labels&&(t.input_labels=e.input_labels),e.input_boxes&&(t.input_boxes=e.input_boxes),await q(this.sessions.prompt_encoder_mask_decoder,t)}async _call(e){return new CE(await super._call(e))}},EE=class extends Mh{constructor({iou_scores:e,pred_masks:t,object_score_logits:n}){super(),this.iou_scores=e,this.pred_masks=t,this.object_score_logits=n}},DE=class extends X{},OE=class extends DE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){let{num_feature_levels:t}=this.config.vision_config;if(e=Array.from({length:t},(e,t)=>`image_embeddings.${t}`).some(t=>!e[t])?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_points){if(e.input_boxes&&e.input_boxes.dims[1]!==1)throw Error("When both `input_points` and `input_boxes` are provided, the number of boxes per image must be 1.");let t=e.input_points.dims;e.input_labels??=yu(t.slice(0,-1)),e.input_boxes??=_u([t[0],0,4],0)}else if(e.input_boxes){let t=e.input_boxes.dims;e.input_labels=_u([t[0],t[1],0],-1n),e.input_points=_u([t[0],1,0,2],0)}else throw Error("At least one of `input_points` or `input_boxes` must be provided.");let n=this.sessions.prompt_encoder_mask_decoder;return await q(n,ci(e,n.inputNames))}async _call(e){return new EE(await super._call(e))}},kE=class extends OE{},AE=class extends OE{},jE=class extends X{},ME=class extends jE{},NE=class extends jE{},PE=class extends jE{},FE=class extends X{},IE=class extends FE{},LE=class extends FE{},RE=class extends FE{},zE=class extends X{},BE=class extends zE{},VE=class extends zE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},HE=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},UE=class extends X{},WE=class extends UE{},GE=class extends UE{},KE=class extends rS{},qE=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},JE=class extends qE{async encode(e){return await q(this.sessions.encoder_model,e)}async decode(e){return await q(this.sessions.decoder_model,e)}},YE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},XE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},ZE=class extends X{},QE=class extends ZE{},$E=class extends ZE{},eD=class extends X{},tD=class extends eD{},nD=class extends eD{},rD=class extends eD{async generate_speech(e,t,{threshold:n=.5,minlenratio:r=0,maxlenratio:i=20,vocoder:a=null}={}){let o={input_ids:e},{encoder_outputs:s,encoder_attention_mask:c}=await Dg(this,o),l=s.dims[1]/this.config.reduction_factor,u=Math.floor(l*i),d=Math.floor(l*r),f=this.config.num_mel_bins,p=[],m=null,h=null,g=0;for(;;){++g;let e=bg(!!h),r;r=h?h.output_sequence_out:new V(`float32`,new Float32Array(f),[1,1,f]);let i={use_cache_branch:e,output_sequence:r,encoder_attention_mask:c,speaker_embeddings:t,encoder_hidden_states:s};Mg(this,i,m),h=await q(this.sessions.decoder_model_merged,i),m=kg(h,m);let{prob:a,spectrum:o}=h;if(p.push(o),g>=d&&(Array.from(a.data).filter(e=>e>=n).length>0||g>=u))break}let _=H(p),{waveform:v}=await q(a.sessions.model,{spectrogram:_});return{spectrogram:_,waveform:v}}},iD=class extends X{main_input_name=`spectrogram`},aD=class extends X{},oD=class extends aD{},sD=class extends aD{async _call(e){return new Fh(await super._call(e))}},cD=class extends aD{async _call(e){return new J(await super._call(e))}},lD=class extends aD{async _call(e){return new Ih(await super._call(e))}},uD=class extends X{},dD=class extends uD{},fD=class extends uD{},pD=class extends X{},mD=class extends pD{},hD=class extends pD{},gD=class extends X{},_D=class extends gD{},vD=class extends X{},yD=class extends vD{async generate_speech({input_ids:e,attention_mask:t,style:n,num_inference_steps:r=5,speed:i=1.05}){let{sampling_rate:a,chunk_compress_factor:o,base_chunk_size:s,latent_dim:c}=this.config,{last_hidden_state:l,durations:u}=await q(this.sessions.text_encoder,{input_ids:e,attention_mask:t,style:n}),d=u.div(i).mul_(a),f=s*o,p=d.data,m=Int32Array.from(p,e=>Math.ceil(e/f)),h=Math.max(...m),g=e.dims[0],_=new BigInt64Array(g*h);for(let e=0;ee*t,1),r=Ql[e.type];c[e.name]=new V(e.type,new r(n),t)}let f=Ql[d],p=new V(d,new f(s*dO),[1,s,dO]),m=t[Symbol.asyncIterator]?.()??t[Symbol.iterator]?.();if(!m)throw Error(`input_features must be iterable or async iterable`);return{encoder_session:i,enc_kv_cache:c,enc_padding_cache:p,enc_past_seq_len:0,audio_embed_queue:[],audio_embed_total_tokens:0,audio_queue_offset:0,audio_consumed:0,stream_exhausted:!1,chunks_iter:m,text_hidden_size:n.hidden_size}}async function hO(e,t){let n=t.dims[2],r=Math.floor((fO+n-3)/2)+1,i=new V(`int64`,BigInt64Array.from({length:r},(t,n)=>BigInt(e.enc_past_seq_len+n)),[1,r]),a=e.enc_past_seq_len+r,o=yu([1,a]),{audio_embeds:s,present_padding_cache:c,...l}=await q(e.encoder_session,{input_features:t,attention_mask:o,position_ids:i,past_padding_cache:e.enc_padding_cache,...e.enc_kv_cache});e.enc_padding_cache.location===`gpu-buffer`&&e.enc_padding_cache.dispose(),e.enc_padding_cache=c;for(let t in l)if(t.startsWith(`present.`)){let n=t.replace(`present`,`past_key_values`),r=e.enc_kv_cache[n];r?.location===`gpu-buffer`&&r.dispose(),e.enc_kv_cache[n]=l[t]}return e.enc_past_seq_len=a,s}async function gO(e,t){for(;e.audio_embed_total_tokens0&&e.audio_embed_queue.length>0;){let t=e.audio_embed_queue[0],n=t.tokens-e.audio_queue_offset,o=Math.min(a,n),s=e.audio_queue_offset*e.text_hidden_size;for(let n=0;n=t.tokens&&(e.audio_embed_queue.shift(),e.audio_queue_offset=0)}e.audio_consumed+=n-a}var vO=class extends rg{constructor(e){super(),this._s=e}_call(e){let t=this._s.stream_exhausted&&this._s.audio_embed_queue.length===0;return e.map(()=>t)}},yO=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`]},bO=class extends yO{async forward({input_ids:e,past_key_values:t,...n}){let r=e.dims[1],i=pO.get(this);i&&await gO(i,i.audio_consumed+r);let{inputs_embeds:a}=await q(this.sessions.embed_tokens,{input_ids:e});i&&_O(i,a,r);let o={inputs_embeds:a,...n};Mg(this,o,t);let s=this.sessions.decoder_model_merged;return await q(s,ci(o,s.inputNames))}async generate({input_features:e,stopping_criteria:t,...n}){if(!e)throw Error(`input_features (generator/iterable) must be provided`);let r=mO(this,e);pO.set(this,r);let i=new ig;i.push(new vO(r)),t&&i.extend(t);try{return await super.generate({...n,stopping_criteria:i})}finally{r.enc_kv_cache.dispose(),pO.delete(this)}}},xO=class extends X{},SO=class extends xO{},CO=class extends xO{async _call(e){return new Lh(await super._call(e))}},wO=class extends xO{async _call(e){return new J(await super._call(e))}},TO=class extends Mh{constructor({logits:e,embeddings:t}){super(),this.logits=e,this.embeddings=t}},EO=class extends X{},DO=class extends EO{},OO=class extends EO{async _call(e){return new Lh(await super._call(e))}},kO=class extends EO{async _call(e){return new J(await super._call(e))}},AO=class extends EO{async _call(e){return new TO(await super._call(e))}},jO=class extends EO{async _call(e){return new Ph(await super._call(e))}},MO=class extends X{},NO=class extends MO{},PO=class extends ng{return_timestamps=null;return_token_timestamps=null;num_frames=null;alignment_heads=null;task=null;language=null;no_timestamps_token_id=null;prompt_ids=null;is_multilingual=null;lang_to_id=null;task_to_id=null;max_initial_timestamp_index=1},FO=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`attention_mask`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},IO=class extends FO{},LO=class extends FO{_prepare_generation_config(e,t){return super._prepare_generation_config(e,t,PO)}_retrieve_init_tokens(e){let t=[e.decoder_start_token_id],n=e.language,r=e.task;if(e.is_multilingual){n||=(A.warn(`No language specified - defaulting to English (en).`),`en`);let i=`<|${Dd(n)}|>`;t.push(e.lang_to_id[i]),t.push(e.task_to_id[r??`transcribe`])}else if(n||r)throw Error("Cannot specify `task` or `language` for an English-only model. If the model is intended to be multilingual, pass `is_multilingual=true` to generate, or update the generation config.");return!e.return_timestamps&&e.no_timestamps_token_id&&t.at(-1)!==e.no_timestamps_token_id?t.push(e.no_timestamps_token_id):e.return_timestamps&&t.at(-1)===e.no_timestamps_token_id&&(A.warn("<|notimestamps|> prompt token is removed from generation_config since `return_timestamps` is set to `true`."),t.pop()),t.filter(e=>e!=null)}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,...i}){t=this._prepare_generation_config(t,i);let a=i.decoder_input_ids instanceof V?Du(i.decoder_input_ids):i.decoder_input_ids??this._retrieve_init_tokens(t);if(t.return_timestamps&&(n??=new Uh,n.push(new Jh(t,a))),t.begin_suppress_tokens&&(n??=new Uh,n.push(new qh(t.begin_suppress_tokens,a.length))),t.return_token_timestamps){if(!t.alignment_heads)throw Error("Model generation config has no `alignment_heads`, token-level timestamps not available. See https://gist.github.com/hollance/42e32852f24243b748ae6bc1f985b13a on how to add this property to the generation config.");t.task===`translate`&&A.warn(`Token-level timestamps may not be reliable for task 'translate'.`),t.output_attentions=!0,t.return_dict_in_generate=!0}if(t.return_timestamps&&!i.max_new_tokens)return this._generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:a,kwargs:i});let o=await super.generate({inputs:e,generation_config:t,logits_processor:n,decoder_input_ids:a,...i});return t.return_token_timestamps&&(o.token_timestamps=this._extract_token_timestamps(o,t.alignment_heads,t.num_frames,.02,a.length)),o}async _generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:r,kwargs:i}){let a=t.no_timestamps_token_id+1,o=Array.isArray(t.eos_token_id)?t.eos_token_id[0]:t.eos_token_id,s=t.return_token_timestamps,c=e,l=c.dims[2],u=2*this.config.max_source_positions,d=0,f=[],p=[];for(;de+n)}if(v.length>0&&v.at(-1)===o&&v.pop(),v.length===0)break;let b=v.map(e=>e>=a),x=v.length>=2&&b[v.length-1]&&!b[v.length-2],S=[];for(let e=0;e0){if(x)C=e-d;else{let e=S.at(-1);C=(v[e-1]-a)*2,ee=e}}else C=e-d;let w=Math.floor(d/2),te=a+1500;for(let e=0;e=a&&(v[e]=Math.min(v[e]+w,te));f.push(...v.slice(0,ee)),y&&p.push(...y.slice(0,ee)),d+=C}f.push(o);let m=[...r,...f];if(s){let e=new V(`int64`,m.map(BigInt),[1,m.length]),t=[...Array(r.length).fill(0),...p,0];return{sequences:e,token_timestamps:new V(`float32`,new Float32Array(t),[1,t.length])}}return new V(`int64`,m.map(BigInt),[1,m.length])}_extract_token_timestamps(e,t,n=null,r=.02,i=0){if(!e.cross_attentions)throw Error("Model outputs must contain cross attentions to extract timestamps. This is most likely because the model was not exported with `output_attentions=True`.");n??A.warn("`num_frames` has not been set, meaning the entire audio will be analyzed. This may lead to inaccurate token-level timestamps for short audios (< 30 seconds).");let a=this.config.median_filter_width;a===void 0&&(A.warn("Model config has no `median_filter_width`, using default value of 7."),a=7);let o=e.cross_attentions,s=Array.from({length:this.config.decoder_layers},(e,t)=>H(o.map(e=>e[t]),2)),c=du(t.map(([e,t])=>{if(e>=s.length)throw Error(`Layer index ${e} is out of bounds for cross attentions (length ${s.length}).`);return n?s[e].slice(null,t,null,[0,n]):s[e].slice(null,t)})).permute(1,0,2,3),[l,u]=pu(c,-2,0,!0),d=c.clone();for(let e=0;e0?d.slice(null,null,[i,d.dims[2]],null):d,1)],p=e.sequences.dims,m=new V(`float32`,new Float32Array(p[0]*p[1]),p);for(let e=0;et[n+1]-t[n])).map(e=>!!e),o=[];for(let e=0;e0&&s.push(o.at(-1)),m[e].data.set(s)}return m}},RO=class extends LO{},zO=class extends X{},BO=class extends zO{},VO=class extends zO{async _call(e){return new Fh(await super._call(e))}},HO=class extends zO{async _call(e){return new J(await super._call(e))}},UO=class extends zO{async _call(e){return new Ph(await super._call(e))}},WO=class extends zO{async _call(e){return new Ih(await super._call(e))}},GO=class extends X{},KO=class extends GO{},qO=class extends GO{async _call(e){return new Fh(await super._call(e))}},JO=class extends GO{async _call(e){return new J(await super._call(e))}},YO=class extends GO{async _call(e){return new Ph(await super._call(e))}},XO=class extends GO{async _call(e){return new Ih(await super._call(e))}},ZO=class extends X{},QO=class extends ZO{},$O=class extends ZO{async _call(e){return new ek(await super._call(e))}},ek=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},tk=class extends X{},nk=class extends tk{},rk=class extends tk{},ik=class extends X{},ak=class extends ik{},ok=class extends ik{},sk=/* @__PURE__ */ new Map([[`bert`,`BertModel`],[`eurobert`,`EuroBertModel`],[`neobert`,`NeoBertModel`],[`modernbert`,`ModernBertModel`],[`nomic_bert`,`NomicBertModel`],[`roformer`,`RoFormerModel`],[`electra`,`ElectraModel`],[`esm`,`EsmModel`],[`convbert`,`ConvBertModel`],[`camembert`,`CamembertModel`],[`deberta`,`DebertaModel`],[`deberta-v2`,`DebertaV2Model`],[`mpnet`,`MPNetModel`],[`albert`,`AlbertModel`],[`distilbert`,`DistilBertModel`],[`roberta`,`RobertaModel`],[`xlm`,`XLMModel`],[`xlm-roberta`,`XLMRobertaModel`],[`clap`,`ClapModel`],[`clip`,`CLIPModel`],[`clipseg`,`CLIPSegModel`],[`chinese_clip`,`ChineseCLIPModel`],[`siglip`,`SiglipModel`],[`jina_clip`,`JinaCLIPModel`],[`mobilebert`,`MobileBertModel`],[`squeezebert`,`SqueezeBertModel`],[`wav2vec2`,`Wav2Vec2Model`],[`wav2vec2-bert`,`Wav2Vec2BertModel`],[`unispeech`,`UniSpeechModel`],[`unispeech-sat`,`UniSpeechSatModel`],[`hubert`,`HubertModel`],[`wavlm`,`WavLMModel`],[`audio-spectrogram-transformer`,`ASTModel`],[`vits`,`VitsModel`],[`pyannote`,`PyAnnoteModel`],[`wespeaker-resnet`,`WeSpeakerResNetModel`],[`detr`,`DetrModel`],[`rt_detr`,`RTDetrModel`],[`rt_detr_v2`,`RTDetrV2Model`],[`rf_detr`,`RFDetrModel`],[`d_fine`,`DFineModel`],[`table-transformer`,`TableTransformerModel`],[`vit`,`ViTModel`],[`ijepa`,`IJepaModel`],[`pvt`,`PvtModel`],[`vit_msn`,`ViTMSNModel`],[`vit_mae`,`ViTMAEModel`],[`groupvit`,`GroupViTModel`],[`fastvit`,`FastViTModel`],[`mobilevit`,`MobileViTModel`],[`mobilevitv2`,`MobileViTV2Model`],[`owlvit`,`OwlViTModel`],[`owlv2`,`Owlv2Model`],[`beit`,`BeitModel`],[`deit`,`DeiTModel`],[`hiera`,`HieraModel`],[`convnext`,`ConvNextModel`],[`convnextv2`,`ConvNextV2Model`],[`dinov2`,`Dinov2Model`],[`dinov2_with_registers`,`Dinov2WithRegistersModel`],[`dinov3_vit`,`DINOv3ViTModel`],[`dinov3_convnext`,`DINOv3ConvNextModel`],[`resnet`,`ResNetModel`],[`swin`,`SwinModel`],[`swin2sr`,`Swin2SRModel`],[`donut-swin`,`DonutSwinModel`],[`yolos`,`YolosModel`],[`dpt`,`DPTModel`],[`glpn`,`GLPNModel`],[`hifigan`,`SpeechT5HifiGan`],[`efficientnet`,`EfficientNetModel`],[`decision_transformer`,`DecisionTransformerModel`],[`patchtst`,`PatchTSTModel`],[`patchtsmixer`,`PatchTSMixerModel`],[`mobilenet_v1`,`MobileNetV1Model`],[`mobilenet_v2`,`MobileNetV2Model`],[`mobilenet_v3`,`MobileNetV3Model`],[`mobilenet_v4`,`MobileNetV4Model`],[`maskformer`,`MaskFormerModel`],[`mgp-str`,`MgpstrForSceneTextRecognition`],[`style_text_to_speech_2`,`StyleTextToSpeech2Model`],[`openai_privacy_filter`,`OpenAIPrivacyFilterModel`]]),ck=/* @__PURE__ */ new Map([[`t5`,`T5Model`],[`longt5`,`LongT5Model`],[`mt5`,`MT5Model`],[`bart`,`BartModel`],[`mbart`,`MBartModel`],[`marian`,`MarianModel`],[`whisper`,`WhisperModel`],[`cohere_asr`,`CohereAsrModel`],[`m2m_100`,`M2M100Model`],[`blenderbot`,`BlenderbotModel`],[`blenderbot-small`,`BlenderbotSmallModel`]]),lk=/* @__PURE__ */ new Map([[`mimi`,`MimiModel`],[`dac`,`DacModel`],[`snac`,`SnacModel`]]),uk=/* @__PURE__ */ new Map([[`bloom`,`BloomModel`],[`jais`,`JAISModel`],[`gpt2`,`GPT2Model`],[`gpt_oss`,`GptOssModel`],[`gptj`,`GPTJModel`],[`gpt_bigcode`,`GPTBigCodeModel`],[`gpt_neo`,`GPTNeoModel`],[`gpt_neox`,`GPTNeoXModel`],[`codegen`,`CodeGenModel`],[`llama`,`LlamaModel`],[`apertus`,`ApertusModel`],[`nanochat`,`NanoChatModel`],[`arcee`,`ArceeModel`],[`afmoe`,`AfmoeModel`],[`lfm2`,`Lfm2Model`],[`lfm2_moe`,`Lfm2MoeModel`],[`smollm3`,`SmolLM3Model`],[`exaone`,`ExaoneModel`],[`olmo`,`OlmoModel`],[`olmo2`,`Olmo2Model`],[`olmo3`,`Olmo3Model`],[`olmo_hybrid`,`OlmoHybridModel`],[`mobilellm`,`MobileLLMModel`],[`granite`,`GraniteModel`],[`granitemoehybrid`,`GraniteMoeHybridModel`],[`cohere`,`CohereModel`],[`cohere2`,`Cohere2Model`],[`gemma`,`GemmaModel`],[`gemma2`,`Gemma2Model`],[`vaultgemma`,`VaultGemmaModel`],[`gemma3_text`,`Gemma3Model`],[`helium`,`HeliumModel`],[`glm`,`GlmModel`],[`glm_moe_dsa`,`GlmMoeDsaModel`],[`openelm`,`OpenELMModel`],[`qwen2`,`Qwen2Model`],[`qwen2_moe`,`Qwen2MoeModel`],[`qwen3`,`Qwen3Model`],[`qwen3_moe`,`Qwen3MoeModel`],[`qwen3_next`,`Qwen3NextModel`],[`phi`,`PhiModel`],[`phi3`,`Phi3Model`],[`mpt`,`MptModel`],[`opt`,`OPTModel`],[`mistral`,`MistralModel`],[`mistral4`,`Mistral4Model`],[`ministral`,`MinistralModel`],[`ministral3`,`Ministral3Model`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2Model`],[`deepseek_v3`,`DeepseekV3Model`],[`deepseek_v4`,`DeepseekV4Model`],[`falcon`,`FalconModel`],[`falcon_h1`,`FalconH1Model`],[`nemotron_h`,`NemotronHModel`],[`solar_open`,`SolarOpenModel`],[`stablelm`,`StableLmModel`],[`modernbert-decoder`,`ModernBertDecoderModel`],[`hunyuan_v1_dense`,`HunYuanDenseV1Model`],[`youtu`,`YoutuModel`],[`zaya`,`ZayaModel`],[`hrm_text`,`HrmTextModel`]]),dk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForSpeechToText`],[`whisper`,`WhisperForConditionalGeneration`],[`lite-whisper`,`LiteWhisperForConditionalGeneration`],[`moonshine`,`MoonshineForConditionalGeneration`],[`cohere_asr`,`CohereAsrForConditionalGeneration`]]),fk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForTextToSpeech`]]),pk=/* @__PURE__ */ new Map([[`vits`,`VitsModel`],[`musicgen`,`MusicgenForConditionalGeneration`],[`supertonic`,`SupertonicForConditionalGeneration`]]),mk=/* @__PURE__ */ new Map([[`bert`,`BertForSequenceClassification`],[`eurobert`,`EuroBertForSequenceClassification`],[`neobert`,`NeoBertForSequenceClassification`],[`modernbert`,`ModernBertForSequenceClassification`],[`roformer`,`RoFormerForSequenceClassification`],[`electra`,`ElectraForSequenceClassification`],[`esm`,`EsmForSequenceClassification`],[`convbert`,`ConvBertForSequenceClassification`],[`camembert`,`CamembertForSequenceClassification`],[`deberta`,`DebertaForSequenceClassification`],[`deberta-v2`,`DebertaV2ForSequenceClassification`],[`mpnet`,`MPNetForSequenceClassification`],[`albert`,`AlbertForSequenceClassification`],[`distilbert`,`DistilBertForSequenceClassification`],[`roberta`,`RobertaForSequenceClassification`],[`xlm`,`XLMForSequenceClassification`],[`xlm-roberta`,`XLMRobertaForSequenceClassification`],[`bart`,`BartForSequenceClassification`],[`mbart`,`MBartForSequenceClassification`],[`mobilebert`,`MobileBertForSequenceClassification`],[`squeezebert`,`SqueezeBertForSequenceClassification`]]),hk=/* @__PURE__ */ new Map([[`bert`,`BertForTokenClassification`],[`eurobert`,`EuroBertForTokenClassification`],[`neobert`,`NeoBertForTokenClassification`],[`modernbert`,`ModernBertForTokenClassification`],[`roformer`,`RoFormerForTokenClassification`],[`electra`,`ElectraForTokenClassification`],[`esm`,`EsmForTokenClassification`],[`convbert`,`ConvBertForTokenClassification`],[`camembert`,`CamembertForTokenClassification`],[`deberta`,`DebertaForTokenClassification`],[`deberta-v2`,`DebertaV2ForTokenClassification`],[`mpnet`,`MPNetForTokenClassification`],[`distilbert`,`DistilBertForTokenClassification`],[`roberta`,`RobertaForTokenClassification`],[`xlm`,`XLMForTokenClassification`],[`xlm-roberta`,`XLMRobertaForTokenClassification`],[`openai_privacy_filter`,`OpenAIPrivacyFilterForTokenClassification`]]),gk=/* @__PURE__ */ new Map([[`t5`,`T5ForConditionalGeneration`],[`longt5`,`LongT5ForConditionalGeneration`],[`mt5`,`MT5ForConditionalGeneration`],[`bart`,`BartForConditionalGeneration`],[`mbart`,`MBartForConditionalGeneration`],[`marian`,`MarianMTModel`],[`m2m_100`,`M2M100ForConditionalGeneration`],[`blenderbot`,`BlenderbotForConditionalGeneration`],[`blenderbot-small`,`BlenderbotSmallForConditionalGeneration`]]),_k=/* @__PURE__ */ new Map([[`bloom`,`BloomForCausalLM`],[`gpt2`,`GPT2LMHeadModel`],[`gpt_oss`,`GptOssForCausalLM`],[`jais`,`JAISLMHeadModel`],[`gptj`,`GPTJForCausalLM`],[`gpt_bigcode`,`GPTBigCodeForCausalLM`],[`gpt_neo`,`GPTNeoForCausalLM`],[`gpt_neox`,`GPTNeoXForCausalLM`],[`codegen`,`CodeGenForCausalLM`],[`llama`,`LlamaForCausalLM`],[`nanochat`,`NanoChatForCausalLM`],[`apertus`,`ApertusForCausalLM`],[`llama4_text`,`Llama4ForCausalLM`],[`arcee`,`ArceeForCausalLM`],[`afmoe`,`AfmoeForCausalLM`],[`lfm2`,`Lfm2ForCausalLM`],[`lfm2_moe`,`Lfm2MoeForCausalLM`],[`smollm3`,`SmolLM3ForCausalLM`],[`exaone`,`ExaoneForCausalLM`],[`olmo`,`OlmoForCausalLM`],[`olmo2`,`Olmo2ForCausalLM`],[`olmo3`,`Olmo3ForCausalLM`],[`olmo_hybrid`,`OlmoHybridForCausalLM`],[`mobilellm`,`MobileLLMForCausalLM`],[`granite`,`GraniteForCausalLM`],[`granitemoehybrid`,`GraniteMoeHybridForCausalLM`],[`cohere`,`CohereForCausalLM`],[`cohere2`,`Cohere2ForCausalLM`],[`gemma`,`GemmaForCausalLM`],[`gemma2`,`Gemma2ForCausalLM`],[`vaultgemma`,`VaultGemmaForCausalLM`],[`gemma3_text`,`Gemma3ForCausalLM`],[`gemma3`,`Gemma3ForCausalLM`],[`helium`,`HeliumForCausalLM`],[`glm`,`GlmForCausalLM`],[`glm_moe_dsa`,`GlmMoeDsaForCausalLM`],[`openelm`,`OpenELMForCausalLM`],[`qwen2`,`Qwen2ForCausalLM`],[`qwen2_moe`,`Qwen2MoeForCausalLM`],[`qwen3`,`Qwen3ForCausalLM`],[`qwen3_moe`,`Qwen3MoeForCausalLM`],[`qwen3_next`,`Qwen3NextForCausalLM`],[`qwen2_vl`,`Qwen2VLForCausalLM`],[`qwen2_5_vl`,`Qwen2_5_VLForCausalLM`],[`qwen3_vl`,`Qwen3VLForCausalLM`],[`qwen3_vl_moe`,`Qwen3VLMoeForCausalLM`],[`qwen3_5`,`Qwen3_5ForCausalLM`],[`qwen3_5_text`,`Qwen3_5ForCausalLM`],[`qwen3_5_moe`,`Qwen3_5MoeForCausalLM`],[`gemma3n`,`Gemma3nForCausalLM`],[`gemma4`,`Gemma4ForCausalLM`],[`phi`,`PhiForCausalLM`],[`phi3`,`Phi3ForCausalLM`],[`mpt`,`MptForCausalLM`],[`opt`,`OPTForCausalLM`],[`mbart`,`MBartForCausalLM`],[`mistral`,`MistralForCausalLM`],[`mistral4`,`Mistral4ForCausalLM`],[`ministral`,`MinistralForCausalLM`],[`ministral3`,`Ministral3ForCausalLM`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2ForCausalLM`],[`deepseek_v3`,`DeepseekV3ForCausalLM`],[`deepseek_v4`,`DeepseekV4ForCausalLM`],[`falcon`,`FalconForCausalLM`],[`falcon_h1`,`FalconH1ForCausalLM`],[`nemotron_h`,`NemotronHForCausalLM`],[`trocr`,`TrOCRForCausalLM`],[`solar_open`,`SolarOpenForCausalLM`],[`stablelm`,`StableLmForCausalLM`],[`modernbert-decoder`,`ModernBertDecoderForCausalLM`],[`hunyuan_v1_dense`,`HunYuanDenseV1ForCausalLM`],[`youtu`,`YoutuForCausalLM`],[`zaya`,`ZayaForCausalLM`],[`hrm_text`,`HrmTextForCausalLM`],[`phi3_v`,`Phi3VForCausalLM`]]),vk=/* @__PURE__ */ new Map([[`multi_modality`,`MultiModalityCausalLM`]]),yk=/* @__PURE__ */ new Map([[`bert`,`BertForMaskedLM`],[`eurobert`,`EuroBertForMaskedLM`],[`neobert`,`NeoBertForMaskedLM`],[`modernbert`,`ModernBertForMaskedLM`],[`roformer`,`RoFormerForMaskedLM`],[`electra`,`ElectraForMaskedLM`],[`esm`,`EsmForMaskedLM`],[`convbert`,`ConvBertForMaskedLM`],[`camembert`,`CamembertForMaskedLM`],[`deberta`,`DebertaForMaskedLM`],[`deberta-v2`,`DebertaV2ForMaskedLM`],[`mpnet`,`MPNetForMaskedLM`],[`albert`,`AlbertForMaskedLM`],[`distilbert`,`DistilBertForMaskedLM`],[`roberta`,`RobertaForMaskedLM`],[`xlm`,`XLMWithLMHeadModel`],[`xlm-roberta`,`XLMRobertaForMaskedLM`],[`mobilebert`,`MobileBertForMaskedLM`],[`squeezebert`,`SqueezeBertForMaskedLM`]]),bk=/* @__PURE__ */ new Map([[`bert`,`BertForQuestionAnswering`],[`neobert`,`NeoBertForQuestionAnswering`],[`roformer`,`RoFormerForQuestionAnswering`],[`electra`,`ElectraForQuestionAnswering`],[`convbert`,`ConvBertForQuestionAnswering`],[`camembert`,`CamembertForQuestionAnswering`],[`deberta`,`DebertaForQuestionAnswering`],[`deberta-v2`,`DebertaV2ForQuestionAnswering`],[`mpnet`,`MPNetForQuestionAnswering`],[`albert`,`AlbertForQuestionAnswering`],[`distilbert`,`DistilBertForQuestionAnswering`],[`roberta`,`RobertaForQuestionAnswering`],[`xlm`,`XLMForQuestionAnswering`],[`xlm-roberta`,`XLMRobertaForQuestionAnswering`],[`mobilebert`,`MobileBertForQuestionAnswering`],[`squeezebert`,`SqueezeBertForQuestionAnswering`]]),xk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`]]),Sk=/* @__PURE__ */ new Map([[`llava`,`LlavaForConditionalGeneration`],[`llava_onevision`,`LlavaOnevisionForConditionalGeneration`],[`moondream1`,`Moondream1ForConditionalGeneration`],[`florence2`,`Florence2ForConditionalGeneration`],[`qwen2_vl`,`Qwen2VLForConditionalGeneration`],[`qwen2_5_vl`,`Qwen2_5_VLForConditionalGeneration`],[`qwen3_vl`,`Qwen3VLForConditionalGeneration`],[`qwen3_vl_moe`,`Qwen3VLMoeForConditionalGeneration`],[`qwen3_5`,`Qwen3_5ForConditionalGeneration`],[`qwen3_5_moe`,`Qwen3_5MoeForConditionalGeneration`],[`lfm2_vl`,`Lfm2VlForConditionalGeneration`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`],[`paligemma`,`PaliGemmaForConditionalGeneration`],[`llava_qwen2`,`LlavaQwen2ForCausalLM`],[`gemma3`,`Gemma3ForConditionalGeneration`],[`gemma3n`,`Gemma3nForConditionalGeneration`],[`gemma4`,`Gemma4ForConditionalGeneration`],[`mistral3`,`Mistral3ForConditionalGeneration`],[`lighton_ocr`,`LightOnOcrForConditionalGeneration`],[`glm_ocr`,`GlmOcrForConditionalGeneration`]]),Ck=/* @__PURE__ */ new Map([[`granite_speech`,`GraniteSpeechForConditionalGeneration`],[`ultravox`,`UltravoxModel`],[`voxtral`,`VoxtralForConditionalGeneration`],[`voxtral_realtime`,`VoxtralRealtimeForConditionalGeneration`]]),wk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`]]),Tk=/* @__PURE__ */ new Map([[`vit`,`ViTForImageClassification`],[`ijepa`,`IJepaForImageClassification`],[`pvt`,`PvtForImageClassification`],[`vit_msn`,`ViTMSNForImageClassification`],[`fastvit`,`FastViTForImageClassification`],[`mobilevit`,`MobileViTForImageClassification`],[`mobilevitv2`,`MobileViTV2ForImageClassification`],[`beit`,`BeitForImageClassification`],[`deit`,`DeiTForImageClassification`],[`hiera`,`HieraForImageClassification`],[`convnext`,`ConvNextForImageClassification`],[`convnextv2`,`ConvNextV2ForImageClassification`],[`dinov2`,`Dinov2ForImageClassification`],[`dinov2_with_registers`,`Dinov2WithRegistersForImageClassification`],[`resnet`,`ResNetForImageClassification`],[`swin`,`SwinForImageClassification`],[`segformer`,`SegformerForImageClassification`],[`efficientnet`,`EfficientNetForImageClassification`],[`mobilenet_v1`,`MobileNetV1ForImageClassification`],[`mobilenet_v2`,`MobileNetV2ForImageClassification`],[`mobilenet_v3`,`MobileNetV3ForImageClassification`],[`mobilenet_v4`,`MobileNetV4ForImageClassification`]]),Ek=/* @__PURE__ */ new Map([[`detr`,`DetrForObjectDetection`],[`rt_detr`,`RTDetrForObjectDetection`],[`rt_detr_v2`,`RTDetrV2ForObjectDetection`],[`rf_detr`,`RFDetrForObjectDetection`],[`d_fine`,`DFineForObjectDetection`],[`table-transformer`,`TableTransformerForObjectDetection`],[`yolos`,`YolosForObjectDetection`]]),Dk=/* @__PURE__ */ new Map([[`owlvit`,`OwlViTForObjectDetection`],[`owlv2`,`Owlv2ForObjectDetection`],[`grounding-dino`,`GroundingDinoForObjectDetection`]]),Ok=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`clipseg`,`CLIPSegForImageSegmentation`]]),kk=/* @__PURE__ */ new Map([[`segformer`,`SegformerForSemanticSegmentation`],[`sapiens`,`SapiensForSemanticSegmentation`],[`swin`,`SwinForSemanticSegmentation`],[`mobilenet_v1`,`MobileNetV1ForSemanticSegmentation`],[`mobilenet_v2`,`MobileNetV2ForSemanticSegmentation`],[`mobilenet_v3`,`MobileNetV3ForSemanticSegmentation`],[`mobilenet_v4`,`MobileNetV4ForSemanticSegmentation`]]),Ak=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`maskformer`,`MaskFormerForInstanceSegmentation`]]),jk=/* @__PURE__ */ new Map([[`sam`,`SamModel`],[`sam2`,`Sam2Model`],[`edgetam`,`EdgeTamModel`],[`sam3_tracker`,`Sam3TrackerModel`]]),Mk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForCTC`],[`wav2vec2-bert`,`Wav2Vec2BertForCTC`],[`unispeech`,`UniSpeechForCTC`],[`unispeech-sat`,`UniSpeechSatForCTC`],[`wavlm`,`WavLMForCTC`],[`hubert`,`HubertForCTC`],[`parakeet_ctc`,`ParakeetForCTC`]]),Nk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForSequenceClassification`],[`wav2vec2-bert`,`Wav2Vec2BertForSequenceClassification`],[`unispeech`,`UniSpeechForSequenceClassification`],[`unispeech-sat`,`UniSpeechSatForSequenceClassification`],[`wavlm`,`WavLMForSequenceClassification`],[`hubert`,`HubertForSequenceClassification`],[`audio-spectrogram-transformer`,`ASTForAudioClassification`]]),Pk=/* @__PURE__ */ new Map([[`wavlm`,`WavLMForXVector`]]),Fk=/* @__PURE__ */ new Map([[`unispeech-sat`,`UniSpeechSatForAudioFrameClassification`],[`wavlm`,`WavLMForAudioFrameClassification`],[`wav2vec2`,`Wav2Vec2ForAudioFrameClassification`],[`pyannote`,`PyAnnoteForAudioFrameClassification`]]),Ik=/* @__PURE__ */ new Map([[`vitmatte`,`VitMatteForImageMatting`]]),Lk=/* @__PURE__ */ new Map([[`patchtst`,`PatchTSTForPrediction`],[`patchtsmixer`,`PatchTSMixerForPrediction`]]),Rk=/* @__PURE__ */ new Map([[`swin2sr`,`Swin2SRForImageSuperResolution`]]),zk=/* @__PURE__ */ new Map([[`chmv2`,`CHMv2ForDepthEstimation`],[`dpt`,`DPTForDepthEstimation`],[`depth_anything`,`DepthAnythingForDepthEstimation`],[`glpn`,`GLPNForDepthEstimation`],[`sapiens`,`SapiensForDepthEstimation`],[`depth_pro`,`DepthProForDepthEstimation`],[`metric3d`,`Metric3DForDepthEstimation`],[`metric3dv2`,`Metric3Dv2ForDepthEstimation`]]),Bk=/* @__PURE__ */ new Map([[`sapiens`,`SapiensForNormalEstimation`]]),Vk=/* @__PURE__ */ new Map([[`vitpose`,`VitPoseForPoseEstimation`]]),Hk=/* @__PURE__ */ new Map([[`clip`,`CLIPVisionModelWithProjection`],[`siglip`,`SiglipVisionModel`],[`jina_clip`,`JinaCLIPVisionModel`]]),Uk=[[sk,Y.EncoderOnly],[ck,Y.EncoderDecoder],[uk,Y.DecoderOnlyWithoutHead],[lk,Y.AutoEncoder],[mk,Y.EncoderOnly],[hk,Y.EncoderOnly],[gk,Y.Seq2Seq],[dk,Y.Seq2Seq],[_k,Y.DecoderOnly],[vk,Y.MultiModality],[yk,Y.EncoderOnly],[bk,Y.EncoderOnly],[xk,Y.Vision2Seq],[Sk,Y.ImageTextToText],[Ck,Y.AudioTextToText],[Tk,Y.EncoderOnly],[Ok,Y.EncoderOnly],[Ak,Y.EncoderOnly],[kk,Y.EncoderOnly],[Ik,Y.EncoderOnly],[Lk,Y.EncoderOnly],[Rk,Y.EncoderOnly],[zk,Y.EncoderOnly],[Bk,Y.EncoderOnly],[Vk,Y.EncoderOnly],[Ek,Y.EncoderOnly],[Dk,Y.EncoderOnly],[jk,Y.MaskGeneration],[Mk,Y.EncoderOnly],[Nk,Y.EncoderOnly],[fk,Y.Seq2Seq],[pk,Y.EncoderOnly],[Pk,Y.EncoderOnly],[Fk,Y.EncoderOnly],[Hk,Y.EncoderOnly]];for(let[e,t]of Uk)for(let n of e.values()){Cg.set(n,t);let e=qg[n];Tg.set(e,n),wg.set(n,e)}var Wk=[[`MusicgenForConditionalGeneration`,bw,Y.Musicgen],[`Phi3VForCausalLM`,wT,Y.Phi3V],[`CLIPTextModelWithProjection`,ev,Y.EncoderOnly],[`SiglipTextModel`,VE,Y.EncoderOnly],[`JinaCLIPTextModel`,fS,Y.EncoderOnly],[`ClapTextModelWithProjection`,Y_,Y.EncoderOnly],[`ClapAudioModelWithProjection`,X_,Y.EncoderOnly],[`DacEncoderModel`,Vv,Y.EncoderOnly],[`DacDecoderModel`,Hv,Y.EncoderOnly],[`MimiEncoderModel`,tC,Y.EncoderOnly],[`MimiDecoderModel`,nC,Y.EncoderOnly],[`SnacEncoderModel`,YE,Y.EncoderOnly],[`SnacDecoderModel`,XE,Y.EncoderOnly],[`Gemma3nForConditionalGeneration`,Bb,Y.ImageAudioTextToText],[`Gemma4ForConditionalGeneration`,Hb,Y.ImageAudioTextToText],[`SupertonicForConditionalGeneration`,yD,Y.Supertonic],[`ChatterboxModel`,H_,Y.Chatterbox],[`VoxtralRealtimeForConditionalGeneration`,bO,Y.VoxtralRealtime]];for(let[e,t,n]of Wk)Cg.set(e,n),Tg.set(t,e),wg.set(e,t);var Gk=/* @__PURE__ */ new Map([[`modnet`,Ok],[`birefnet`,Ok],[`isnet`,Ok],[`ben`,Ok]]);for(let[e,t]of Gk.entries())t.set(e,`PreTrainedModel`),Cg.set(e,Y.EncoderOnly),wg.set(e,X);var Kk=new Set(Gk.keys());Cg.set(`PreTrainedModel`,Y.EncoderOnly),Tg.set(X,`PreTrainedModel`);var Z={MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES:mk,MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES:hk,MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES:fk,MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES:pk,MODEL_FOR_MASKED_LM_MAPPING_NAMES:yk,MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES:bk,MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES:Tk,MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES:Ok,MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES:kk,MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES:Ak,MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES:Ek,MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES:Dk,MODEL_FOR_MASK_GENERATION_MAPPING_NAMES:jk,MODEL_FOR_CTC_MAPPING_NAMES:Mk,MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES:Nk,MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES:Pk,MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES:Fk,MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES:wk,MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES:Ik,MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES:Rk,MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES:zk,MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES:Bk,MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES:Vk,MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES:Hk,MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES:Sk,MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES:Ck,MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES:gk,MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES:dk,MODEL_FOR_CAUSAL_LM_MAPPING_NAMES:_k,MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES:xk};vg(Z);var Q=class{static MODEL_CLASS_MAPPINGS=null;static BASE_IF_FAIL=!1;static supports(e){if(!this.MODEL_CLASS_MAPPINGS)return!1;for(let t of this.MODEL_CLASS_MAPPINGS)if(t.has(e))return!0;return this.BASE_IF_FAIL}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d};if(f.config=await Ch.from_pretrained(e,f),!this.MODEL_CLASS_MAPPINGS)throw Error("`MODEL_CLASS_MAPPINGS` not implemented for this type of `AutoClass`: "+this.name);let{model_type:p}=f.config;for(let t of this.MODEL_CLASS_MAPPINGS){let n=t.get(p);if(!n){for(let e of t.values())if(e[0]===p){n=e;break}if(!n)continue}return await qg[n].from_pretrained(e,f)}if(this.BASE_IF_FAIL)return Kk.has(p)||A.warn(`Unknown model class "${p}", attempting to construct from base class.`),await X.from_pretrained(e,f);throw Error(`Unsupported model type: ${p}`)}},qk=class extends Q{static MODEL_CLASS_MAPPINGS=Uk.map(e=>e[0]);static BASE_IF_FAIL=!0},Jk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES]},Yk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES]},Xk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES]},Zk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES]},Qk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES]},$k=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES]},eA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES]},tA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASKED_LM_MAPPING_NAMES]},nA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES]},rA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES]},iA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES]},aA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES]},oA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES]},sA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES]},cA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES]},lA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASK_GENERATION_MAPPING_NAMES]});var uA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CTC_MAPPING_NAMES]},dA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES]};var fA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES]});var pA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES]},mA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES]};var hA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES]};async function gA(e){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>Vf.read(e)))}async function _A(e,t){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>typeof e==`string`||e instanceof URL?Wd(e,t):e instanceof Float64Array?new Float32Array(e):e))}function vA(e,t){t&&(e=e.map(e=>e|0));let[n,r,i,a]=e;return{xmin:n,ymin:r,xmax:i,ymax:a}}var yA=class extends $r{constructor({task:e,model:t,tokenizer:n=null,processor:r=null}){super(),this.task=e,this.model=t,this.tokenizer=n,this.processor=r}async dispose(){await this.model.dispose()}},bA=class extends yA{async _call(e,{top_k:t=1}={}){let n=this.tokenizer(e,{padding:!0,truncation:!0}),r=await this.model(n),{problem_type:i,id2label:a}=this.model.config,o=i===`multi_label_classification`?e=>e.sigmoid():e=>new V(`float32`,ol(e.data),e.dims),s=[];for(let e of r.logits){let n=await iu(o(e),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));t===1?s.push(...i):s.push(i)}return Array.isArray(e)||t===1?s:s[0]}},xA=class extends yA{async _call(e,{ignore_labels:t=[`O`],aggregation_strategy:n=`none`}={}){if(n!==`none`&&n!==`simple`)throw Error(`Invalid aggregation_strategy: "${n}". Must be one of "none" or "simple".`);let r=Array.isArray(e),i=this.tokenizer(r?e:[e],{padding:!0,truncation:!0}),a=(await this.model(i)).logits,o=this.model.config.id2label,s=[];for(let e=0;e{let o=0,s=[];for(let n=i;ne==u),i=a[e].tolist(),f=o[e].tolist();for(let n=1;ne==t[n])!==-1)&&(i[n]=-1/0,f[n]=-1/0);let p=ol(i).map((e,t)=>[e,t]),m=ol(f).map((e,t)=>[e,t]);p[0][0]=0,m[0][0]=0;let h=oi(p,m).filter(e=>e[0][1]<=e[1][1]).map(e=>[e[0][1],e[1][1],e[0][0]*e[1][0]]).sort((e,t)=>t[2]-e[2]),g=[];for(let e=0;ee==n);if(c===-1)throw Error(`Mask token (${r}) not found in text.`);let l=a[e][c],u=await iu(new V(`float32`,ol(l.data),l.dims),t),d=u[0].tolist(),f=u[1].tolist();o.push(f.map((e,t)=>{let n=i.slice();return n[c]=e,{score:d[t],token:Number(e),token_str:this.tokenizer.decode([e]),sequence:this.tokenizer.decode(n,{skip_special_tokens:!0})}}))}return Array.isArray(e)?o:o[0]}},EA=class extends yA{_default_generation_config={max_new_tokens:256};_key=`generated_text`;async _call(e,t={}){Array.isArray(e)||(e=[e]),this.model.config.prefix&&(e=e.map(e=>this.model.config.prefix+e));let n=this.model.config.task_specific_params;n&&n[this.task]&&n[this.task].prefix&&(e=e.map(e=>n[this.task].prefix+e));let r=this.tokenizer,i={padding:!0,truncation:!0},a;a=this.task===`translation`&&`_build_translation_inputs`in r?r._build_translation_inputs(e,i,t):r(e,i);let o=await this.model.generate({...a,...this._default_generation_config,...t});return r.batch_decode(o,{skip_special_tokens:!0}).map(e=>({[this._key]:e}))}},DA=class extends EA{_key=`summary_text`},OA=class extends EA{_key=`translation_text`};function kA(e){return Array.isArray(e)&&e.every(e=>`role`in e&&`content`in e)}var AA=class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t={}){let{add_special_tokens:n,return_full_text:r,tools:i,documents:a,chat_template:o,tokenizer_encode_kwargs:s,...c}=t,l=!1,u=!1,d=n??(this.tokenizer.add_bos_token||this.tokenizer.add_eos_token)??!1,f=s,p;if(typeof e==`string`)p=e=[e];else if(Array.isArray(e)&&e.every(e=>typeof e==`string`))l=!0,p=e;else{if(kA(e))e=[e];else if(Array.isArray(e)&&e.every(kA))l=!0;else throw Error(`Input must be a string, an array of strings, a Chat, or an array of Chats`);u=!0;let t={tokenize:!1,add_generation_prompt:!0,...ci({tools:i,documents:a,chat_template:o},[`tools`,`documents`,`chat_template`]),...f};p=e.map(e=>this.tokenizer.apply_chat_template(e,t)),d=!1,f=void 0}let m=u?!1:r??!0;this.tokenizer.padding_side=`left`;let h=this.tokenizer(p,{add_special_tokens:d,padding:!0,truncation:!0,...f}),g=await this.model.generate({...h,...this._default_generation_config,...c}),_=this.tokenizer.batch_decode(g,{skip_special_tokens:!0}),v;!m&&h.input_ids.dims.at(-1)>0&&(v=this.tokenizer.batch_decode(h.input_ids,{skip_special_tokens:!0}).map(e=>e.length));let y=Array.from({length:e.length},e=>[]);for(let t=0;t<_.length;++t){let n=Math.floor(t/g.dims[0]*e.length);v&&(_[t]=_[t].slice(v[n])),y[n].push({generated_text:u?[...e[n],{role:`assistant`,content:_[t]}]:_[t]})}return!l&&y.length===1?y[0]:y}},jA=class extends yA{constructor(e){super(e),this.label2id=Object.fromEntries(Object.entries(this.model.config.label2id).map(([e,t])=>[e.toLowerCase(),t])),this.entailment_id=this.label2id.entailment,this.entailment_id===void 0&&(A.warn(`Could not find 'entailment' in label2id mapping. Using 2 as entailment_id.`),this.entailment_id=2),this.contradiction_id=this.label2id.contradiction??this.label2id.not_entailment,this.contradiction_id===void 0&&(A.warn(`Could not find 'contradiction' in label2id mapping. Using 0 as contradiction_id.`),this.contradiction_id=0)}async _call(e,t,{hypothesis_template:n=`This example is {}.`,multi_label:r=!1}={}){let i=Array.isArray(e);i||(e=[e]),Array.isArray(t)||(t=[t]);let a=t.map(e=>n.replace(`{}`,e)),o=r||t.length===1,s=[];for(let n of e){let e=[];for(let t of a){let r=this.tokenizer(n,{text_pair:t,padding:!0,truncation:!0}),i=await this.model(r);o?e.push([i.logits.data[this.contradiction_id],i.logits.data[this.entailment_id]]):e.push(i.logits.data[this.entailment_id])}let r=(o?e.map(e=>ol(e)[1]):ol(e)).map((e,t)=>[e,t]).sort((e,t)=>t[0]-e[0]);s.push({sequence:n,labels:r.map(e=>t[e[1]]),scores:r.map(e=>e[0])})}return i?s:s[0]}},MA=class extends yA{async _call(e,{top_k:t=5}={}){let n=this.processor.feature_extractor.config.sampling_rate,r=await _A(e,n),i=this.model.config.id2label,a=[];for(let e of r){let n=await this.processor(e),r=(await this.model(n)).logits[0],o=await iu(new V(`float32`,ol(r.data),r.dims),t),s=o[0].tolist(),c=o[1].tolist().map((e,t)=>({label:i?i[e]:`LABEL_${e}`,score:s[t]}));a.push(c)}return Array.isArray(e)?a:a[0]}},NA=class extends yA{async _call(e,t,{hypothesis_template:n=`This is a sound of {}.`}={}){let r=!Array.isArray(e);r&&(e=[e]);let i=t.map(e=>n.replace(`{}`,e)),a=this.tokenizer(i,{padding:!0,truncation:!0}),o=this.processor.feature_extractor.config.sampling_rate,s=await _A(e,o),c=[];for(let e of s){let n=await this.processor(e),r=ol((await this.model({...a,...n})).logits_per_audio.data);c.push([...r].map((e,n)=>({score:e,label:t[n]})))}return r?c[0]:c}},PA=class extends yA{_default_generation_config={};async _call(e,t={}){switch(t={...this._default_generation_config,...t},this.model.config.model_type){case`whisper`:case`lite-whisper`:return this._call_whisper(e,t);case`wav2vec2`:case`wav2vec2-bert`:case`unispeech`:case`unispeech-sat`:case`hubert`:case`parakeet_ctc`:return this._call_wav2vec2(e,t);case`moonshine`:return this._call_moonshine(e,t);case`cohere_asr`:return this._call_cohere_asr(e,t);default:throw Error(`AutomaticSpeechRecognitionPipeline does not support model type '${this.model.config.model_type}'.`)}}async _call_wav2vec2(e,t){t.language&&A.warn('`language` parameter is not yet supported for `wav2vec2` models, defaulting to "English".'),t.task&&A.warn('`task` parameter is not yet supported for `wav2vec2` models, defaulting to "transcribe".');let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let t=await this.processor(e),n=(await this.model(t)).logits[0],r=[];for(let e of n)r.push(ll(e.data)[1]);let i=this.tokenizer.decode(r,{skip_special_tokens:!0}).trim();o.push({text:i})}return n?o[0]:o}async _call_whisper(e,t){let n=t.return_timestamps??!1,r=t.chunk_length_s??0,i=t.force_full_sequences??!1,a=t.stride_length_s??null,o={...t};n===`word`&&(o.return_token_timestamps=!0,o.return_timestamps=!0);let s=!Array.isArray(e),c=s?[e]:e,l=this.processor.feature_extractor.config,u=l.chunk_length/this.model.config.max_source_positions,d=l.hop_length,f=l.sampling_rate,p=await _A(c,f),m=[];for(let e of p){let t=[];if(r>0){if(a===null)a=r/6;else if(r<=a)throw Error("`chunk_length_s` must be larger than `stride_length_s`.");let n=f*r,i=f*a,o=n-2*i,s=0;for(;;){let r=s+n,a=e.subarray(s,r),c=await this.processor(a),l=s===0,u=r>=e.length;if(t.push({stride:[a.length,l?0:i,u?0:i],input_features:c.input_features,is_last:u}),u)break;s+=o}}else t=[{stride:[e.length,0,0],input_features:(await this.processor(e)).input_features,is_last:!0}];for(let e of t){o.num_frames=Math.floor(e.stride[0]/d);let t=await this.model.generate({inputs:e.input_features,...o});if(n===`word`){let n=t.sequences.tolist()[0],r=t.token_timestamps.tolist()[0],i=this.tokenizer.timestamp_begin,a=Math.max(n.findIndex(e=>Number(e)>=i),0);e.tokens=n.slice(a),e.token_timestamps=r.slice(a).map(e=>hl(e,2))}else e.tokens=t[0].tolist();e.stride=e.stride.map(e=>e/f)}let[s,c]=this.tokenizer._decode_asr(t,{time_precision:u,return_timestamps:n,force_full_sequences:i});m.push({text:s,...c})}return s?m[0]:m}async _call_moonshine(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let n=await this.processor(e),r=Math.floor(e.length/i)*6,a=await this.model.generate({max_new_tokens:r,...t,...n}),s=this.tokenizer.batch_decode(a,{skip_special_tokens:!0})[0];o.push({text:s})}return n?o[0]:o}async _call_cohere_asr(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor,a=i.config.sampling_rate,o=await _A(r,a),s=t.language??`en`,c=this.processor.get_decoder_prompt_ids(s),l=[];for(let e of o){let n=i.split_audio(e),r=[];for(let e of n){let n=await this.processor(e),i=await this.model.generate({...n,decoder_input_ids:c,...t}),a=this.tokenizer.decode(i[0].tolist(),{skip_special_tokens:!0}).trim();r.push(a)}let a=this.processor.constructor.join_chunks(r,s);l.push({text:a})}return n?l[0]:l}},FA=class extends yA{DEFAULT_VOCODER_ID=`Xenova/speecht5_hifigan`;constructor(e){super(e),this.vocoder=e.vocoder??null}async _prepare_speaker_embeddings(e,t){if((typeof e==`string`||e instanceof URL)&&(e=new Float32Array(await(await k.fetch(e)).arrayBuffer())),e instanceof Float32Array)e=new V(`float32`,e,[e.length]);else if(!(e instanceof V))throw Error("Speaker embeddings must be a `Tensor`, `Float32Array`, `string`, or `URL`.");if(t>1){if(e.dims[0]===1)e=e.repeat(t,1);else if(e.dims[0]!==t)throw Error(`Expected speaker embeddings batch size to be 1 or ${t}, but got ${e.dims[0]}.`)}return e}_postprocess_waveform(e,t,n,r=null){let i=t.data,[a,o]=t.dims,s=r?r.data:null,c=[];for(let e=0;e({generated_text:e.trim()}));a.push(r)}return n?a:a[0]}},LA=class extends yA{async _call(e,{top_k:t=5}={}){let n=await gA(e),{pixel_values:r}=await this.processor(n),i=await this.model({pixel_values:r}),{id2label:a}=this.model.config,o=[];for(let e of i.logits){let n=await iu(new V(`float32`,ol(e.data),e.dims),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));o.push(i)}return Array.isArray(e)?o:o[0]}},RA={panoptic:`post_process_panoptic_segmentation`,instance:`post_process_instance_segmentation`,semantic:`post_process_semantic_segmentation`},zA=class extends yA{async _call(e,{threshold:t=.5,mask_threshold:n=.5,overlap_mask_area_threshold:r=.8,label_ids_to_fuse:i=null,target_sizes:a=null,subtask:o=null}={}){if(Array.isArray(e)&&e.length!==1)throw Error(`Image segmentation pipeline currently only supports a batch size of 1.`);let s=await gA(e),c=s.map(e=>[e.height,e.width]),l=await this.processor(s),{inputNames:u,outputNames:d}=this.model.sessions.model;if(!u.includes(`pixel_values`)){if(u.length!==1)throw Error(`Expected a single input name, but got ${u.length} inputs: ${u}.`);let e=u[0];if(e in l)throw Error(`Input name ${e} already exists in the inputs.`);l[e]=l.pixel_values}let f=await this.model(l),p=null;if(o!==null)p=RA[o];else if(this.processor.image_processor){for(let[e,t]of Object.entries(RA))if(t in this.processor.image_processor){p=this.processor.image_processor[t].bind(this.processor.image_processor),o=e;break}}let m=this.model.config.id2label,h=[];if(!o){let e=f[d[0]];for(let t=0;te<-1e-5||e>1.00001)&&r.sigmoid_();let i=await Vf.fromTensor(r.mul_(255).to(`uint8`)).resize(n[1],n[0]);h.push({label:null,score:null,mask:i})}}else if(o===`panoptic`||o===`instance`){let e=p(f,t,n,r,i,a??c)[0],o=e.segmentation;for(let t of e.segments_info){let e=new Uint8ClampedArray(o.data.length);for(let n=0;n{let n=e.clone();return n.putAlpha(r[t].mask),n});return Array.isArray(e)?i:i[0]}},model:[aA,oA,sA],default:{model:`Xenova/modnet`},type:`image`},"zero-shot-image-classification":{pipeline:class extends yA{async _call(e,t,{hypothesis_template:n=`This is a photo of {}`}={}){let r=Array.isArray(e),i=await gA(e),a=t.map(e=>n.replace(`{}`,e)),o=this.tokenizer(a,{padding:this.model.config.model_type!==`siglip`||`max_length`,truncation:!0}),{pixel_values:s}=await this.processor(i),c=await this.model({...o,pixel_values:s}),l=this.model.config.model_type===`siglip`?e=>e.sigmoid().data:e=>ol(e.data),u=[];for(let e of c.logits_per_image){let n=[...l(e)].map((e,n)=>({score:e,label:t[n]}));n.sort((e,t)=>t.score-e.score),u.push(n)}return r?u:u[0]}},model:qk,default:{model:`Xenova/clip-vit-base-patch32`},type:`multimodal`},"object-detection":{pipeline:class extends yA{async _call(e,{threshold:t=.9,percentage:n=!1}={}){let r=Array.isArray(e);if(r&&e.length!==1)throw Error(`Object detection pipeline currently only supports a batch size of 1.`);let i=await gA(e),a=n?null:i.map(e=>[e.height,e.width]),{pixel_values:o,pixel_mask:s}=await this.processor(i),c=await this.model({pixel_values:o,pixel_mask:s}),l=this.processor.image_processor.post_process_object_detection(c,t,a),{id2label:u}=this.model.config,d=l.map(e=>e.boxes.map((t,r)=>({score:e.scores[r],label:u[e.classes[r]],box:vA(t,!n)})));return r?d:d[0]}},model:cA,default:{model:`Xenova/detr-resnet-50`},type:`multimodal`},"zero-shot-object-detection":{pipeline:class extends yA{async _call(e,t,{threshold:n=.1,top_k:r=null,percentage:i=!1}={}){let a=Array.isArray(e),o=await gA(e),s=this.tokenizer(t,{padding:!0,truncation:!0}),c=await this.processor(o),l=[];for(let e=0;e({score:e.scores[n],label:e.labels[n],box:vA(t,!i)}))}else{let e=this.processor.image_processor.post_process_object_detection(f,n,u,!0)[0];p=e.boxes.map((n,r)=>({score:e.scores[r],label:t[e.classes[r]],box:vA(n,!i)}))}p.sort((e,t)=>t.score-e.score),r!==null&&(p=p.slice(0,r)),l.push(p)}return a?l:l[0]}},model:lA,default:{model:`Xenova/owlvit-base-patch32`},type:`multimodal`},"document-question-answering":{pipeline:class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t,n={}){if(Array.isArray(e)){if(e.length!==1)throw Error(`Document Question Answering pipeline currently only supports a batch size of 1.`);e=e[0]}let r=(await gA(e))[0],{pixel_values:i}=await this.processor(r),a=`${t}`,o=this.tokenizer(a,{add_special_tokens:!1,padding:!0,truncation:!0}).input_ids,s=await this.model.generate({inputs:i,max_length:this.model.config.decoder.max_position_embeddings,decoder_input_ids:o,...this._default_generation_config,...n}),c=this.tokenizer.batch_decode(s)[0].match(/(.*?)<\/s_answer>/),l=null;return c&&c.length>=2&&(l=c[1].trim()),[{answer:l}]}},model:fA,default:{model:`Xenova/donut-base-finetuned-docvqa`},type:`multimodal`},"image-to-image":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),r=await this.model(n),i=[];for(let e of r.reconstruction){let t=e.squeeze().clamp_(0,1).mul_(255).round_().to(`uint8`);i.push(Vf.fromTensor(t))}return Array.isArray(e)?i:i[0]}},model:pA,default:{model:`Xenova/swin2SR-classical-sr-x2-64`},type:`image`},"depth-estimation":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),{predicted_depth:r}=await this.model(n),i=[];for(let e=0;et).sort((e,t)=>o[t]-o[e]).slice(0,r).map(e=>({index:e,score:o[e]}))}const WA={amp:`&`,lt:`<`,gt:`>`,quot:`"`,apos:`'`,nbsp:` `,hellip:`…`,mdash:`—`,ndash:`–`,laquo:`«`,raquo:`»`,middot:`·`,deg:`°`,times:`×`,euro:`€`,pound:`£`,reg:`®`,copy:`©`,bull:`•`,trade:`™`,rsquo:`’`,lsquo:`‘`,ldquo:`“`,rdquo:`”`};function GA(e){return typeof e!=`string`||!e?``:e.replace(/<[^>]*>/g,` `).replace(/&#x([0-9a-f]+);/gi,(e,t)=>KA(parseInt(t,16))).replace(/&#(\d+);/g,(e,t)=>KA(parseInt(t,10))).replace(/&([a-z]+);/gi,(e,t)=>WA[t.toLowerCase()]??e).replace(/\s+/g,` `).trim()}function KA(e){return Number.isFinite(e)&&e>0&&e<=1114111?String.fromCodePoint(e):``}function qA(e){return String(e??``).normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}const JA=/* @__PURE__ */ new Set(/* @__PURE__ */ `va.hoac.cua.cho.voi.mot.nung.khong.duoc.de.theo.loai.tinh.gia.thuoc.ve.tai.nha.mat.neu.thi.la.cac.nhan.bi.ra.nay`.split(`.`));function YA(e){let t=[];for(let n of qA(e).split(/[^a-z0-9]+/))n.length>1&&!JA.has(n)&&t.push(n);return t}function $(...e){for(let t of e)if(typeof t==`string`&&t.trim())return GA(t);return``}function XA(e){let t=/* @__PURE__ */ new Set,n=[],r=e=>{if(typeof e!=`string`)return;let r=e.trim();r&&!t.has(r)&&(/^https?:\/\//i.test(r)||/^data:image\//i.test(r))&&(t.add(r),n.push(r))};return Array.isArray(e.imgs)&&e.imgs.forEach(r),Array.isArray(e.images)&&e.images.forEach(r),r(e.i),r(e.image),n}function ZA(e){for(let t of[e.pn,e.salePn,e.priceNum,e.price_number,e.priceNumber]){let e=Number(t);if(Number.isFinite(e)&&e>0)return e}return 0}function QA(e){let t=Math.round(Number(e)||0);return t<=0?``:`${String(t).replace(/\B(?=(\d{3})+(?!\d))/g,`.`)}₫`}function $A(e){return $(e.p,e.priceText,e.price)||QA(ZA(e))}function ej(e){let t=e;if(typeof t==`string`&&t.trim()){let e=t.trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{t=JSON.parse(e)}catch{t=null}else t=null}let n=[];if(Array.isArray(t))for(let e of t)Array.isArray(e)&&e.length>=2?n.push([$(e[0]),$(e[1])]):e&&typeof e==`object`&&n.push([$(e.name,e.key),$(e.value)]);else if(t&&typeof t==`object`)for(let[e,r]of Object.entries(t)){let t=$(r)||(r==null?``:String(r));t&&n.push([$(e),t])}return n.filter(([e,t])=>e&&t)}function tj(e){return(Array.isArray(e.feats)?e.feats:Array.isArray(e.features)?e.features:[]).map(e=>$(e)).filter(Boolean)}function nj(e){if(!e||typeof e!=`object`)return null;let t=$(e.sku,e.mod,e.model,e.SAP),n=$(e.slug),r=$(e.n,e.name,e.title_clean,e.title)||t||n,i=t||n;return!i||!r?null:{sku:i,slug:n,model:$(e.mod,e.model,t),name:r,brand:$(e.brand),category:$(e.c,e.category,e.cs,e.category_slug),link:$(e.l,e.link),price:$A(e),priceNum:ZA(e),images:XA(e),summary:$(e.sum,e.summary,e.description,e.desc),specs:ej(e.specs),feats:tj(e),addedBy:$(e._addedBy,e._source)}}const rj={"catalogue/products.json":`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_url_added.json`,"catalogue/promos.json":`https://huggingface.co/datasets/bep40/vaistudio-data/resolve/main/promos.json`};let ij=null;function aj(){return import.meta.url.replace(/\/dist\/assets\/[^/]*$/,`/`)}function oj(e){let t=aj(),n=[new URL(`dist/`+e,t).href,new URL(e,t).href];return typeof document<`u`&&document.baseURI&&(n.push(new URL(e.replace(/^catalogue\//,`dist/catalogue/`),document.baseURI).href),n.push(new URL(e,document.baseURI).href)),[...new Set(n)]}async function sj(e){let t=rj[e],n=t?[t,...oj(e)]:oj(e),r;for(let t of n)try{let n={cache:`no-store`};typeof AbortSignal<`u`&&typeof AbortSignal.timeout==`function`&&(n.signal=AbortSignal.timeout(2e4));let i=await fetch(t,n);if(!i.ok){r=/* @__PURE__ */ Error(`HTTP ${i.status}`);continue}let a=await i.text(),o;try{o=JSON.parse(a)}catch{r=/* @__PURE__ */ Error(`body is not valid JSON`);continue}if(Array.isArray(o)?o.length===0&&e.includes(`products`):!o||typeof o!=`object`){r=/* @__PURE__ */ Error(`unexpected shape`);continue}return o}catch(e){r=e}throw Error(`Không tìm thấy ${e} (${r?.message||`không rõ`}). Chạy \`node scripts/sync-catalogue.mjs\` để nhân bản dữ liệu từ vai-avatar vào Space.`)}async function cj(){try{let e=await fetch(`https://huggingface.co/api/datasets/bep40/grob-products-updated/revision/main`,{cache:`no-store`});if(!e.ok)return null;let t=await e.json();return typeof t?.sha==`string`?t.sha:null}catch{return null}}let lj=null,uj=null;async function dj(){let e=await cj();if(e&&ij&&e===ij)return lj;let t=await fetch(`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_with_slugs.json`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=JSON.parse(await t.text());if(!Array.isArray(n)||!n.length)throw Error(`unexpected shape`);return lj=n,ij=e??`len:${n.length}`,n}function fj(){return uj||(uj=dj().catch(e=>{if(lj)return lj;throw e}).finally(()=>{uj=null}),uj)}function pj(e){return $(e.sku,e.mod,e.model).toUpperCase()?0:$(e.slug)?1:2}function mj(e){let t=[],n=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Map;for(let i of vj(Array.isArray(e)?e:[])){if(!i||typeof i!=`object`)continue;let e=$(i.slug).toLowerCase(),a=qA($(i.n,i.name,i.title)).trim(),o=$(i.imgs?.[0],i.i,i.image).split(`?`)[0],s=a&&o?`${a}\u0000${o}`:null;if(!e&&!s)continue;let c=pj(i),l=[];e&&l.push(n.get(e)),s&&l.push(r.get(s));let u=l.find(e=>e!==void 0);if(u&&u.ranke.described)).size===1&&(i.sort((e,t)=>t.images.length-e.images.length),r.set(e,i[0].images));return r}function vj(e){if(!Array.isArray(e))return e;let t=e.filter(gj);if(!t.length)return e;let n=_j(e),r=[],i=0,a=0;for(let t of e){if(!gj(t)){r.push(t);continue}let e=null;for(let r of hj($(t.n,t.name,t.title)))if(n.has(r)){e=n.get(r);break}if(e){r.push({...t,imgs:e,i:e[0],brand:`Malloca`}),i++;continue}r.push({...t,brand:`Malloca`}),a++}return t.length&&console.info(`[catalogue] Malloca misbranding: ${t.length} rows (name says Malloca, brand says otherwise). ${i} swapped to a real Malloca photo, ${a} relabelled, ${t.length-i-a} hidden.`),r}function yj(e){let t=[],n=e=>{let n=$(e).toUpperCase();n&&!t.includes(n)&&t.push(n)};n(e.sku),n(e.mod),n(e.model),n(e.SAP),n(e._source_alias),n(e.slug);let r=qA($(e.n,e.name,e.title_clean,e.title)).replace(/\s+/g,` `).trim();return r.length>8&&n(r),t}const bj=[[`name`,[`n`,`title_clean`,`title`]],[`priceNum`,[`p`,`pn`,`salePn`,`price_number`,`priceNumber`,`price`]],[`description`,[`sum`,`summary`,`desc`]],[`features`,[`feats`]],[`images`,[`imgs`,`i`,`image`]]];function xj(e){let t=e&&e.deleted;return t===!0||t===1||t===`true`||t===`1`}function Sj(e,t,n){let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Set;function o(e,t){for(let n of t){if(a.has(n))continue;let t=i.get(n);t===void 0?i.set(n,e):t!==e&&(i.delete(n),a.add(n))}}function s(e,t,n){let i=r.get(e);if(!i){r.set(e,{...t});return}let a={...i};if(n){for(let[e,r]of n)if(t[e]!==void 0)for(let e of r)delete a[e]}r.set(e,{...a,...t})}for(let e of Array.isArray(n)?n:[]){if(!e||typeof e!=`object`)continue;let t=yj(e);t.length&&(s(t[0],e),o(t[0],t))}for(let t of Array.isArray(e)?e:[]){if(!t||typeof t!=`object`)continue;let e=yj(t);if(!e.length)continue;let n=e.map(e=>i.get(e)).find(e=>e!==void 0)??e[0];s(n,t,bj),o(n,e)}let c=t&&typeof t==`object`&&t.productEdits&&typeof t.productEdits==`object`?t.productEdits:{};for(let[e,t]of Object.entries(c)){if(!t||typeof t!=`object`)continue;let n=yj(t),r=$(e).toUpperCase();if(!n.length&&!r)continue;let a=[...n,r].map(e=>i.get(e)).find(e=>e!==void 0)??r;s(a,t,bj),o(a,[...n,r])}let l=/* @__PURE__ */ new Map;for(let[e,t]of r){if(xj(t))continue;let n=nj(t);n&&l.set(e,n)}return l}function Cj(e){let t=2166136261,n=e=>{let n=String(e);for(let e=0;e>>0).toString(36)}-${e.size}`}let wj=null,Tj=null;function Ej(){return Tj||(Tj=(async()=>{let[e,t,n]=await Promise.all([sj(`catalogue/products.json`),sj(`catalogue/promos.json`).then(e=>(wj=e,e)).catch(()=>wj??{}),fj().then(e=>mj(e)).catch(()=>lj?mj(lj):[])]),r=Sj(e,t,n);return{items:r,signature:Cj(r),syncedAt:Date.now(),partial:!n.length}})().finally(()=>{Tj=null}),Tj)}async function Dj(){try{return await Ej()}catch{return null}}const Oj={name:6,model:4,brand:3,category:3,summary:1,feats:1,specs:1};function kj(e){let t={name:YA(e.name),model:YA(e.model),brand:YA(e.brand),category:YA(e.category),summary:YA(e.summary.slice(0,600)),feats:e.feats.flatMap(YA),specs:e.specs.flatMap(([e,t])=>YA(e).concat(YA(t)))},n=/* @__PURE__ */ new Map;for(let[e,r]of Object.entries(Oj))for(let i of new Set(t[e]||[]))(n.get(i)||0)2&&e.length>2&&(r.startsWith(e)||e.startsWith(r))&&(n=Math.max(n,i*.7));n&&(o+=n,s++)}s&&(o*=.55+.45*(s/r.length),i.length>3&&n.includes(i)&&(o*=1.35),a.push({sku:e.sku,score:o,product:e}))}return a.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),a.slice(0,n)}const Nj=qA;function Pj(e){return Nj(e).split(/\s+/).filter(e=>e.length>1)}const Fj=[`inox 304`,`inox sus304`,`inox304`,`inox`,`sus304`,`sus 304`,`nan oval`,`nan vuông`,`nan tron`,`nan dẹt`,`nan det`,`khung nhôm`,`nhôm`,`hợp kim`,`kính`,`gốm`,`đá granite`,`da granite`,`mây`,`thép`,`gang`,`nhựa abs`,`abs`,`thủy tinh`],Ij=[`malloca`,`eurogold`,`grob`,`canzy`,`demax`,`sunhouse`,`kangaroo`,`sharp`,`toshiba`,`panasonic`,`samsung`,`lg`,`electrolux`,`bosch`,`fischer`];function Lj(e){let t=/* @__PURE__ */ new Set,n=/(\d{1,4})\s*mm/gi,r=/[wdh]\s*[:=]?\s*(\d{1,4})/gi,i;for(;i=n.exec(e);)t.add(parseInt(i[1],10));for(;i=r.exec(e);)t.add(parseInt(i[1],10));return t}function Rj(e){let t=Nj((e.specs||[]).map(([e,t])=>`${e} ${t}`).join(` `));return{name:Nj(e.name||``),sku:Nj(e.model||e.sku||``),brand:Nj(e.brand||``),category:Nj(e.category||``),summary:Nj(e.summary||``),feats:Nj((e.feats||[]).join(` `)),specsText:t}}function zj(e,t,n){let{name:r,sku:i,brand:a,category:o,summary:s,feats:c,specsText:l}=Rj(e),u=Nj(String(t||``).trim()),d=0,f=u.replace(/[^a-z0-9]/g,``),p=r.replace(/[^a-z0-9]/g,``),m=i.replace(/[^a-z0-9]/g,``);f.length>=4&&(m===f?d+=1e3:p===f?d+=900:p.includes(f)||m.includes(f)?d+=550:m.length>=4&&f.includes(m)&&(d+=400));let h=n.filter(e=>e.length>1&&!/^\d{2,4}mm/.test(e));h.length&&h.every(e=>r.includes(e))&&(d+=300);let g=[r,a,o,Nj(e.summary||``),c,l].join(` `),_=String(t||``).trim();r===_?d+=200:i===_?d+=180:r.includes(_)?d+=100:i.includes(_)?d+=80:g.includes(_)&&(d+=50);let v=Lj(`${r} ${l} ${Nj(e.summary||``)} ${c} ${s}`),y=Lj(_);[...y].some(e=>v.has(e))?r.includes(_)?d+=40:r.split(` `).some(e=>/^\d{1,4}mm$/i.test(e))?d+=55:d+=l===``?40:50:y.size&&(d-=10);for(let e of n.filter(e=>/^\d{2,4}\s*mm$/.test(e))){let t=e.replace(/\s+/g,``);r.includes(t)?d+=60:i.includes(t)?d+=40:g.includes(t)&&(d+=25)}for(let t of Fj){let n=Nj(t);if(u.includes(n)&&(r.includes(n)||l.includes(n)||Nj(e.summary||``).includes(n))){d+=30;break}}let b=0,x=n.filter(e=>e.length>1&&!/^\d{2,4}\s*mm$/.test(e));for(let e of x)r.includes(e)?(d+=16,b++):i.includes(e)?d+=12:a.includes(e)?d+=8:o.includes(e)?d+=10:g.includes(e)&&(d+=3);b>=2?d+=35:b===1&&x.length>=2&&(d+=10);for(let e of x)o.includes(e)&&(d+=6);for(let e of Ij)u.includes(e)&&a.includes(e)&&(d+=50);return d}function Bj(e,t,n=24){let r=Pj(e);if(!r.length||!t?.size)return[];let i=[];for(let n of t.values()){let t=zj(n,String(e||``).trim(),r);t>0&&i.push({sku:n.sku,score:t,product:n})}return i.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),i.slice(0,n)}k.allowLocalModels=!1,k.backends.onnx.wasm.numThreads=1;let Vj,Hj,Uj=!1;const Wj=e=>self.postMessage(e);function Gj(){return Vj??=(async()=>{Wj({status:`loading`,label:`Đang tải mô hình tìm kiếm`});let[e,t,n,r]=await Promise.all([W.from_pretrained(`sentence-transformers/clip-ViT-B-32-multilingual-v1`),ev.from_pretrained(`bep40/clip-vit-b32-multilingual-vi-text`,{dtype:`fp32`,device:`wasm`,revision:`9e1d53553228b17abfe6986fbe92e22bd6bd6bad`,progress_callback:e=>{e.status===`progress`&&e.file?.endsWith(`.onnx`)&&Wj({status:`loading`,label:`Đang tải mô hình tìm kiếm`,progress:e.progress})}}),VA(BA+`image-embeddings.json`).then(e=>JSON.parse(new TextDecoder().decode(e))),VA(BA+`image-embeddings_25k-512-32bit.bin`)]),i=new Float32Array(r);if(i.length!==n.length*512)throw Error(`The image database and embeddings do not match.`);return HA(i,512),Wj({status:`loading`,label:`Đang khởi động tìm kiếm`,progress:100}),await t(e(`a photograph`,{padding:!0,truncation:!0})),Wj({status:`ready`,count:n.length}),{tokenizer:e,model:t,metadata:n,embeddings:i}})().catch(e=>{throw Vj=null,e})}async function Kj(){if(!Uj){Uj=!0;try{let{tokenizer:e,model:t,metadata:n,embeddings:r}=await Gj();for(;Hj;){let i=Hj;Hj=null;let a=performance.now();try{let{text_embeds:o}=await t(e(i.text,{padding:!0,truncation:!0}));if(Hj)continue;let s=UA(o.data,r,512,96).map(({index:e,score:t})=>({...n[e],score:t}));Wj({status:`complete`,id:i.id,text:i.text,output:s,elapsed:performance.now()-a})}catch(e){Wj({status:`error`,id:i.id,message:e.message})}}}catch(e){Wj({status:`error`,id:Hj?.id,message:e.message}),Hj=null}finally{Uj=!1}}}let qj=null;function Jj(){return qj??Ej().then(e=>(qj=e,e))}async function Yj(e=!1){let t=e?await Ej():await Dj();return t&&(qj=t),t}async function Xj(e,t,n){let r=performance.now();try{Wj({status:`products-loading`});let{items:i,signature:a}=await Jj(),o=Bj(e,i,n),s=Mj(e,i,n);Wj({status:`products-complete`,id:t,text:e,output:o,legacy:s,signature:a,count:i.size,elapsed:performance.now()-r})}catch(e){Wj({status:`products-error`,id:t,message:e.message})}}self.addEventListener(`message`,({data:e})=>{e.type===`init`?(Gj().catch(e=>Wj({status:`error`,message:e.message})),Jj().catch(()=>{})):e.type===`search`?(Hj={id:e.id,text:e.text},Kj()):e.type===`search-products`?Xj(e.text,e.id,e.limit??24):e.type===`refresh-catalogue`?Yj(e.force===!0).then(e=>e&&Wj({status:`catalogue-updated`,signature:e.signature,count:e.items.size,syncedAt:e.syncedAt})).catch(e=>Wj({status:`catalogue-error`,message:e.message})):e.type===`clear`&&(Hj=null)}); \ No newline at end of file diff --git a/dist/assets/worker-n0zt6z0K.js b/dist/assets/worker-n0zt6z0K.js deleted file mode 100644 index bab8fcd5a5d6622bbe653479603fd43463f4b0d4..0000000000000000000000000000000000000000 --- a/dist/assets/worker-n0zt6z0K.js +++ /dev/null @@ -1,45 +0,0 @@ -var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n=/* @__PURE__ */ (e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")}),r=/* @__PURE__ */ t({InferenceSession:()=>Me,TRACE:()=>Ce,TRACE_EVENT_BEGIN:()=>De,TRACE_EVENT_END:()=>Oe,TRACE_FUNC_BEGIN:()=>Te,TRACE_FUNC_END:()=>Ee,Tensor:()=>xe,default:()=>rr,env:()=>w,registerBackend:()=>h}),i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,c=(e=>typeof n<`u`?n:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof n<`u`?n:e)[t]}):e)(function(e){ -/*! -* ONNX Runtime Web v1.31.0-dev.20260914-8d85527a0 -* Copyright (c) Microsoft Corporation. All rights reserved. -* Licensed under the MIT License. -*/ -if(typeof n<`u`)return n.apply(this,arguments);throw Error(`Dynamic require of "`+e+`" is not supported`)}),l=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},u=(e,t)=>{for(var n in t)i(e,n,{get:t[n],enumerable:!0})},d=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(let c of o(t))!s.call(e,c)&&c!==n&&i(e,c,{get:()=>t[c],enumerable:!(r=a(t,c))||r.enumerable});return e},f=e=>d(i({},`__esModule`,{value:!0}),e),p,m,h,g,_,v=l(()=>{p=/* @__PURE__ */ new Map,m=[],h=(e,t,n)=>{if(t&&typeof t.init==`function`&&typeof t.createInferenceSessionHandler==`function`){let r=p.get(e);if(r===void 0)p.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let t=m.indexOf(e);t!==-1&&m.splice(t,1);for(let t=0;t{let t=p.get(e);if(!t)return`backend not found.`;if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(e){return n||(t.error=`${e}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},_=async e=>{let t=e.executionProviders||[],n=t.map(e=>typeof e==`string`?e:e.name),r=n.length===0?m:n,i,a=[],o=/* @__PURE__ */ new Set;for(let e of r){let t=await g(e);typeof t==`string`?a.push({name:e,err:t}):(i||=t,i===t&&o.add(e))}if(!i)throw Error(`no available backend found. ERR: ${a.map(e=>`[${e.name}] ${e.err}`).join(`, `)}`);for(let{name:e,err:t}of a)n.includes(e)&&console.warn(`removing requested execution provider "${e}" from session options because it is not available: ${t}`);let s=t.filter(e=>o.has(typeof e==`string`?e:e.name));return[i,new Proxy(e,{get:(e,t)=>t===`executionProviders`?s:Reflect.get(e,t)})]}}),y=l(()=>{v()}),b,x=l(()=>{b=`1.31.0-dev.20260911-2a43ec07e`}),S,C,ee=l(()=>{x(),S=`warning`,C={wasm:{},webgl:{},webgpu:{},versions:{common:b},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);S=e}},get logLevel(){return S}},Object.defineProperty(C,"logLevel",{enumerable:!0})}),w,te=l(()=>{ee(),w=C}),ne,re,ie=l(()=>{ne=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t!==void 0&&t.format!==void 0?t.format:`RGB`,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t{be(),ae=(e,t)=>{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:`RGB`,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,ae(o,s)}throw Error(`Can not access image data`)}else{if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(ae(e.data,s))}});throw Error(`Input data provided is not supported - aborted tensor creation`)}if(o!==void 0)return ae(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},se=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new ye({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ce=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new ye({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},le=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new ye({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},ue=(e,t,n)=>new ye({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]})}),de,fe,pe,me,he=l(()=>{de=/* @__PURE__ */ new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),fe=/* @__PURE__ */ new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]),pe=!1,me=()=>{if(!pe){pe=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<`u`&&n.from;e&&(de.set(`int64`,BigInt64Array),fe.set(BigInt64Array,`int64`)),t&&(de.set(`uint64`,BigUint64Array),fe.set(BigUint64Array,`uint64`)),r?(de.set(`float16`,n),fe.set(n,`float16`)):de.set(`float16`,Uint16Array)}}}),ge,_e,ve=l(()=>{be(),ge=e=>{let t=1;for(let n=0;n{switch(e.location){case`cpu`:return new ye(e.type,e.data,t);case`cpu-pinned`:return new ye({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new ye({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new ye({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new ye({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}}}),ye,be=l(()=>{ie(),T(),he(),ve(),ye=class{constructor(e,t,n){me();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=de.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`){if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=de.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray){if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`)}else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=fe.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=ge(i);if(this.cpuData&&a!==this.cpuData.length&&(r!==`uint4`&&r!==`int4`||Math.ceil(a/2)!==this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return oe(e,t)}static fromTexture(e,t){return se(e,t)}static fromGpuBuffer(e,t){return ce(e,t)}static fromMLTensor(e,t){return le(e,t)}static fromPinnedBuffer(e,t,n){return ue(e,t,n)}toDataURL(e){return ne(this,e)}toImageData(e){return re(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return _e(this,e)}}}),xe,Se=l(()=>{be(),xe=ye}),Ce,we,Te,Ee,De,Oe,ke=l(()=>{ee(),Ce=(e,t)=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.timeStamp(`${e}::ORT::${t}`)},we=(e,t)=>{let n=(/* @__PURE__ */ Error()).stack?.split(/\r\n|\r|\n/g)||[],r=!1;for(let i=0;i{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||we(`BEGIN`,e)},Ee=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||we(`END`,e)},De=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.time(`ORT::${e}`)},Oe=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.timeEnd(`ORT::${e}`)}}),Ae,je=l(()=>{v(),Se(),ke(),Ae=class e{constructor(e){this.handler=e}async run(e,t,n){Te(),De(`InferenceSession.run`);let r={},i={};if(typeof e!=`object`||!e||e instanceof xe||Array.isArray(e))throw TypeError(`'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.`);let a=!0;if(typeof t==`object`){if(t===null)throw TypeError(`Unexpected argument[1]: cannot be null.`);if(t instanceof xe)throw TypeError(`'fetches' cannot be a Tensor`);if(Array.isArray(t)){if(t.length===0)throw TypeError(`'fetches' cannot be an empty array.`);a=!1;for(let e of t){if(typeof e!=`string`)throw TypeError(`'fetches' must be a string array or an object.`);if(this.outputNames.indexOf(e)===-1)throw RangeError(`'fetches' contains invalid output name: ${e}.`);r[e]=null}if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else{let e=!1,o=Object.getOwnPropertyNames(t);for(let n of this.outputNames)if(o.indexOf(n)!==-1){let i=t[n];(i===null||i instanceof xe)&&(e=!0,a=!1,r[n]=i)}if(e){if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else i=t}}else if(typeof t<`u`)throw TypeError(`Unexpected argument[1]: must be 'fetches' or 'options'.`);for(let t of this.inputNames)if(typeof e[t]>`u`)throw Error(`input '${t}' is missing in 'feeds'.`);if(a)for(let e of this.outputNames)r[e]=null;let o=await this.handler.run(e,r,i),s={};for(let e in o)if(Object.hasOwnProperty.call(o,e)){let t=o[e];s[e]=t instanceof xe?t:new xe(t.type,t.data,t.dims)}return Oe(`InferenceSession.run`),Ee(),s}async release(){return this.handler.dispose()}static async create(t,n,r,i){Te(),De(`InferenceSession.create`);let a,o={};if(typeof t==`string`){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof Uint8Array){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&t instanceof SharedArrayBuffer){let e=t,s=0,c=t.byteLength;if(typeof n==`object`&&n)o=n;else if(typeof n==`number`){if(s=n,!Number.isSafeInteger(s))throw RangeError(`'byteOffset' must be an integer.`);if(s<0||s>=e.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${e.byteLength}).`);if(c=t.byteLength-s,typeof r==`number`){if(c=r,!Number.isSafeInteger(c))throw RangeError(`'byteLength' must be an integer.`);if(c<=0||s+c>e.byteLength)throw RangeError(`'byteLength' is out of range (0, ${e.byteLength-s}].`);if(typeof i==`object`&&i)o=i;else if(typeof i<`u`)throw TypeError(`'options' must be an object.`)}else if(typeof r<`u`)throw TypeError(`'byteLength' must be a number.`)}else if(typeof n<`u`)throw TypeError(`'options' must be an object.`);a=new Uint8Array(e,s,c)}else throw TypeError(`Unexpected argument[0]: must be 'path' or 'buffer'.`);let[s,c]=await _(o),l=await s.createInferenceSessionHandler(a,c);return Oe(`InferenceSession.create`),Ee(),new e(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),Me,Ne=l(()=>{je(),Me=Ae}),Pe=l(()=>{}),Fe=l(()=>{}),Ie=l(()=>{}),Le=l(()=>{}),Re={};u(Re,{InferenceSession:()=>Me,TRACE:()=>Ce,TRACE_EVENT_BEGIN:()=>De,TRACE_EVENT_END:()=>Oe,TRACE_FUNC_BEGIN:()=>Te,TRACE_FUNC_END:()=>Ee,Tensor:()=>xe,env:()=>w,registerBackend:()=>h});var ze=l(()=>{y(),te(),Ne(),Se(),Pe(),Fe(),ke(),Ie(),Le()}),Be=l(()=>{}),Ve={};u(Ve,{default:()=>We});var He,Ue,We,Ge=l(()=>{Dn(),ht(),ot(),He=`ort-wasm-proxy-worker`,Ue=globalThis.self?.name===He,Ue&&(self.onmessage=e=>{let{type:t,in:n}=e.data;try{switch(t){case`init-wasm`:mt(n.wasm).then(()=>{hn(n).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})})},e=>{postMessage({type:t,err:e})});break;case`init-ep`:{let{epName:e,env:r}=n;gn(r,e).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})});break}case`copy-from`:{let{buffer:e}=n,r=bn(e);postMessage({type:t,out:r});break}case`create`:{let{model:e,options:r}=n;xn(e,r).then(e=>{postMessage({type:t,out:e})},e=>{postMessage({type:t,err:e})});break}case`release`:Sn(n),postMessage({type:t});break;case`run`:{let{sessionId:e,inputIndices:r,inputs:i,outputIndices:a,options:o}=n;wn(e,r,i,a,Array(a.length).fill(null),o).then(e=>{e.some(e=>e[3]!==`cpu`)?postMessage({type:t,err:`Proxy does not support non-cpu tensor location.`}):postMessage({type:t,out:e},En([...i,...e]))},e=>{postMessage({type:t,err:e})});break}case`end-profiling`:Tn(n),postMessage({type:t})}}catch(e){postMessage({type:t,err:e})}}),We=Ue?null:e=>new Worker(e??Ye,{type:`module`,name:He})}),Ke,qe,Je,Ye,Xe,Ze,Qe,$e,et,tt,nt,rt,it,at,ot=l(()=>{Be(),Ke=typeof location>`u`?void 0:location.origin,qe=import.meta.url>`file:`&&import.meta.url<`file;`,Je=()=>qe?new URL(new URL(`ort.webgpu.min.mjs`,import.meta.url).href,Ke).href:import.meta.url,Ye=Je(),Xe=()=>{if(Ye&&!Ye.startsWith(`blob:`))return Ye.substring(0,Ye.lastIndexOf(`/`)+1)},Ze=(e,t)=>{try{let n=t??Ye;return(n?new URL(e,n):new URL(e)).origin===Ke}catch{return!1}},Qe=(e,t)=>{let n=t??Ye;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},$e=(e,t)=>`${t??`./`}${e}`,et=async e=>{let t=await(await fetch(e,{credentials:`same-origin`})).blob();return URL.createObjectURL(t)},tt=async e=>(await import( -/*webpackIgnore:true*/ -/*@vite-ignore*/ -e)).default,nt=(Ge(),f(Ve)).default,rt=async()=>{if(!Ye)throw Error(`Failed to load proxy worker: cannot determine the script source URL.`);if(Ze(Ye))return[void 0,nt()];let e=await et(Ye);return[e,nt(e)]},it=void 0,at=async(e,t,n,r)=>{let i=it&&!(e||t);if(i){if(Ye)i=Ze(Ye)||r&&!n;else if(r&&!n)i=!0;else throw Error(`cannot determine the script source URL.`)}if(i)return[void 0,it];{let r=`ort-wasm-simd-threaded.asyncify.mjs`,i=e??Qe(r,t),a=n&&i&&!Ze(i,t),o=a?await et(i):i??$e(r,t);return[a?o:void 0,await tt(o)]}}}),st,ct,lt,ut,dt,ft,pt,mt,E,ht=l(()=>{ot(),ct=!1,lt=!1,ut=!1,dt=()=>{if(typeof SharedArrayBuffer>`u`)return!1;try{return typeof MessageChannel<`u`&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},ft=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},pt=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},mt=async e=>{if(ct)return Promise.resolve();if(lt)throw Error(`multiple calls to 'initializeWebAssembly()' detected.`);if(ut)throw Error(`previous call to 'initializeWebAssembly()' failed.`);lt=!0;let t=e.initTimeout,n=e.numThreads;if(e.simd!==!1){if(e.simd===`relaxed`){if(!pt())throw Error(`Relaxed WebAssembly SIMD is not supported in the current environment.`)}else if(!ft())throw Error(`WebAssembly SIMD is not supported in the current environment.`)}let r=dt();n>1&&!r&&(typeof self<`u`&&!self.crossOriginIsolated&&console.warn(`env.wasm.numThreads is set to `+n+`, but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info.`),console.warn(`WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading.`),e.numThreads=n=1);let i=e.wasmPaths,a=typeof i==`string`?i:void 0,o=i?.mjs,s=o?.href??o,c=i?.wasm,l=c?.href??c,u=e.wasmBinary,[d,f]=await at(s,a,n>1,!!u||!!l),p=!1,m=[];if(t>0&&m.push(new Promise(e=>{setTimeout(()=>{p=!0,e()},t)})),m.push(new Promise((e,t)=>{let r={numThreads:n};if(u)r.wasmBinary=u,r.locateFile=e=>e;else if(l||a)r.locateFile=e=>l??a+e;else if(s&&s.indexOf(`blob:`)!==0)r.locateFile=e=>new URL(e,s).href;else if(d){let e=Xe();e&&(r.locateFile=t=>e+t)}f(r).then(t=>{lt=!1,ct=!0,st=t,e(),d&&URL.revokeObjectURL(d)},e=>{lt=!1,ut=!0,t(e)})})),await Promise.race(m),p)throw Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},E=()=>{if(ct&&st)return st;throw Error(`WebAssembly is not initialized yet.`)}}),gt,_t,D,vt=l(()=>{ht(),gt=(e,t)=>{let n=E(),r=n.lengthBytesUTF8(e)+1,i=n._malloc(r);return n.stringToUTF8(e,i,r),t.push(i),i},_t=(e,t,n,r)=>{if(typeof e==`object`&&e){if(n.has(e))throw Error(`Circular reference in options`);n.add(e)}Object.entries(e).forEach(([e,i])=>{let a=t?t+e:e;if(typeof i==`object`)_t(i,a+`.`,n,r);else if(typeof i==`string`||typeof i==`number`)r(a,i.toString());else if(typeof i==`boolean`)r(a,i?`1`:`0`);else throw Error(`Can't handle extra config type: ${typeof i}`)})},D=e=>{let t=E(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetLastError(r,r+n);let i=Number(t.getValue(r,n===4?`i32`:`i64`)),a=t.getValue(r+n,`*`),o=a?t.UTF8ToString(a):``;throw Error(`${e} ERROR_CODE: ${i}, ERROR_MESSAGE: ${o}`)}finally{t.stackRestore(n)}}}),yt,bt=l(()=>{ht(),vt(),yt=e=>{let t=E(),n=0,r=[],i=e||{};try{if(e?.logSeverityLevel===void 0)i.logSeverityLevel=2;else if(typeof e.logSeverityLevel!=`number`||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw Error(`log severity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)i.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!=`number`||!Number.isInteger(e.logVerbosityLevel))throw Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(i.terminate=!1);let a=0;return e?.tag!==void 0&&(a=gt(e.tag,r)),n=t._OrtCreateRunOptions(i.logSeverityLevel,i.logVerbosityLevel,!!i.terminate,a),n===0&&D(`Can't create run options.`),e?.extra!==void 0&&_t(e.extra,``,/* @__PURE__ */ new WeakSet,(e,i)=>{let a=gt(e,r),o=gt(i,r);t._OrtAddRunConfigEntry(n,a,o)!==0&&D(`Can't set a run config entry: ${e} - ${i}.`)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(e=>t._free(e)),e}}}),xt,St,Ct,wt,Tt,Et,Dt,Ot=l(()=>{ht(),vt(),xt=e=>{switch(e){case`disabled`:return 0;case`basic`:return 1;case`extended`:return 2;case`layout`:return 3;case`all`:return 99;default:throw Error(`unsupported graph optimization level: ${e}`)}},St=e=>{switch(e){case`sequential`:return 0;case`parallel`:return 1;default:throw Error(`unsupported execution mode: ${e}`)}},Ct=e=>{e.extra||={},e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||=`1`,e.executionProviders&&e.executionProviders.some(e=>(typeof e==`string`?e:e.name)===`webgpu`)&&(e.enableMemPattern=!1)},wt=(e,t,n,r)=>{let i=gt(t,r),a=gt(n,r);E()._OrtAddSessionConfigEntry(e,i,a)!==0&&D(`Can't set a session config entry: ${t} - ${n}.`)},Tt=(e,t,n,r)=>{let i=gt(t,r),a=gt(n,r);e.push([i,a])},Et=async(e,t,n)=>{let r=t.executionProviders;for(let i of r){let r=typeof i==`string`?i:i.name,a=[];switch(r){case`webnn`:if(r=`WEBNN`,wt(e,`session.disable_quant_qdq`,`1`,n),wt(e,`session.disable_qdq_constant_folding`,`1`,n),typeof i!=`string`){let t=i?.deviceType;t&&wt(e,`deviceType`,t,n)}break;case`webgpu`:{r=`WebGPU`;let e;if(typeof i!=`string`){let r=i;if(r.device){if(typeof GPUDevice<`u`&&r.device instanceof GPUDevice)e=r.device;else throw Error(`Invalid GPU device set in WebGPU EP options.`)}let{enableGraphCapture:o}=t;if(typeof o==`boolean`&&o&&Tt(a,`enableGraphCapture`,`1`,n),typeof r.preferredLayout==`string`&&Tt(a,`preferredLayout`,r.preferredLayout,n),r.forceCpuNodeNames){let e=Array.isArray(r.forceCpuNodeNames)?r.forceCpuNodeNames:[r.forceCpuNodeNames];Tt(a,`forceCpuNodeNames`,e.join(` -`),n)}r.validationMode&&Tt(a,`validationMode`,r.validationMode,n),typeof r.enableMatmulFp32Accumulation==`boolean`&&Tt(a,`enableMatmulFp32Accumulation`,r.enableMatmulFp32Accumulation?`1`:`0`,n);for(let e of[`storageBufferCacheMode`,`uniformBufferCacheMode`,`queryResolveBufferCacheMode`,`defaultBufferCacheMode`]){let t=r[e];if(t){if(t!==`disabled`&&t!==`lazyRelease`&&t!==`simple`&&t!==`bucket`)throw Error(`${e} must be one of 'disabled', 'lazyRelease', 'simple' or 'bucket': ${t}`);Tt(a,e,t,n)}}}let o=E().webgpuRegisterDevice(e);if(o){let[e,t,r]=o;Tt(a,`deviceId`,e.toString(),n),Tt(a,`webgpuInstance`,t.toString(),n),Tt(a,`webgpuDevice`,r.toString(),n)}}break;case`wasm`:case`cpu`:continue;default:throw Error(`not supported execution provider: ${r}`)}let o=gt(r,n),s=a.length,c=0,l=0;if(s>0){c=E()._malloc(s*E().PTR_SIZE),n.push(c),l=E()._malloc(s*E().PTR_SIZE),n.push(l);for(let e=0;e{let t=E(),n=0,r=[],i=e||{};Ct(i);try{let e=xt(i.graphOptimizationLevel??`all`),a=St(i.executionMode??`sequential`),o=typeof i.logId==`string`?gt(i.logId,r):0,s=i.logSeverityLevel??2;if(!Number.isInteger(s)||s<0||s>4)throw Error(`log severity level is not valid: ${s}`);let c=i.logVerbosityLevel??0;if(!Number.isInteger(c)||c<0||c>4)throw Error(`log verbosity level is not valid: ${c}`);let l=typeof i.optimizedModelFilePath==`string`?gt(i.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(e,!!i.enableCpuMemArena,!!i.enableMemPattern,a,!!i.enableProfiling,0,o,s,c,l),n===0&&D(`Can't create session options.`),i.executionProviders&&await Et(n,i,r),i.enableGraphCapture!==void 0){if(typeof i.enableGraphCapture!=`boolean`)throw Error(`enableGraphCapture must be a boolean value: ${i.enableGraphCapture}`);wt(n,`enableGraphCapture`,i.enableGraphCapture.toString(),r)}if(i.freeDimensionOverrides)for(let[e,a]of Object.entries(i.freeDimensionOverrides)){if(typeof e!=`string`)throw Error(`free dimension override name must be a string: ${e}`);if(typeof a!=`number`||!Number.isInteger(a)||a<0)throw Error(`free dimension override value must be a non-negative integer: ${a}`);let i=gt(e,r);t._OrtAddFreeDimensionOverride(n,i,a)!==0&&D(`Can't set a free dimension override: ${e} - ${a}.`)}return i.extra!==void 0&&_t(i.extra,``,/* @__PURE__ */ new WeakSet,(e,t)=>{wt(n,e,t,r)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&D(`Can't release session options.`),r.forEach(e=>t._free(e)),e}}}),kt,At,jt,Mt,Nt,Pt,Ft,It,Lt=l(()=>{kt=e=>{switch(e){case`int8`:return 3;case`uint8`:return 2;case`bool`:return 9;case`int16`:return 5;case`uint16`:return 4;case`int32`:return 6;case`uint32`:return 12;case`float16`:return 10;case`float32`:return 1;case`float64`:return 11;case`string`:return 8;case`int64`:return 7;case`uint64`:return 13;case`int4`:return 22;case`uint4`:return 21;default:throw Error(`unsupported data type: ${e}`)}},At=e=>{switch(e){case 3:return`int8`;case 2:return`uint8`;case 9:return`bool`;case 5:return`int16`;case 4:return`uint16`;case 6:return`int32`;case 12:return`uint32`;case 10:return`float16`;case 1:return`float32`;case 11:return`float64`;case 8:return`string`;case 7:return`int64`;case 13:return`uint64`;case 22:return`int4`;case 21:return`uint4`;default:throw Error(`unsupported data type: ${e}`)}},jt=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t==`number`?t:t.reduce((e,t)=>e*t,1);return n>0?Math.ceil(r*n):void 0},Mt=e=>{switch(e){case`float16`:return typeof Float16Array<`u`?Float16Array:Uint16Array;case`float32`:return Float32Array;case`uint8`:return Uint8Array;case`int8`:return Int8Array;case`uint16`:return Uint16Array;case`int16`:return Int16Array;case`int32`:return Int32Array;case`bool`:return Uint8Array;case`float64`:return Float64Array;case`uint32`:return Uint32Array;case`int64`:return BigInt64Array;case`uint64`:return BigUint64Array;default:throw Error(`unsupported type: ${e}`)}},Nt=e=>{switch(e){case`verbose`:return 0;case`info`:return 1;case`warning`:return 2;case`error`:return 3;case`fatal`:return 4;default:throw Error(`unsupported logging level: ${e}`)}},Pt=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,Ft=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint64`||e===`int8`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,It=e=>{switch(e){case`none`:return 0;case`cpu`:return 1;case`cpu-pinned`:return 2;case`texture`:return 3;case`gpu-buffer`:return 4;case`ml-tensor`:return 5;default:throw Error(`unsupported data location: ${e}`)}}}),Rt,zt=l(()=>{Be(),Rt=async e=>{if(typeof e==`string`){let t=await fetch(e);if(!t.ok)throw Error(`failed to load external data file: ${e}`);let n=t.headers.get(`Content-Length`),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw Error(`failed to load external data file: ${e}, no response body.`);let n=t.body.getReader(),i;try{i=new ArrayBuffer(r)}catch(e){if(e instanceof RangeError){let e=Math.ceil(r/65536);i=new WebAssembly.Memory({initial:e,maximum:e}).buffer}else throw e}let a=0;for(;;){let{done:e,value:t}=await n.read();if(e)break;let r=t.byteLength;new Uint8Array(i,a,r).set(t),a+=r}return new Uint8Array(i,0,r)}}return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}}),Bt,Vt=l(()=>{Lt(),Bt=(e,t)=>new(Mt(t))(e)}),Ht,Ut,Wt,Gt,Kt,qt,Jt,Yt=l(()=>{Lt(),Ht=[`V`,`I`,`W`,`E`,`F`],Ut=(e,t)=>{console.log(`[${Ht[e]},${(/* @__PURE__ */ new Date()).toISOString()}]${t}`)},Kt=(e,t)=>{Wt=e,Gt=t},qt=(e,t)=>{let n=Nt(e);n>=Nt(Wt)&&Ut(n,typeof t==`function`?t():t)},Jt=(...e)=>{Gt&&qt(...e)}}),Xt,Zt,Qt,$t,en,tn,nn,rn,an,on,sn,cn=l(()=>{Lt(),Yt(),Xt=/* @__PURE__ */ new Map([[`float32`,32],[`float16`,16],[`int32`,32],[`uint32`,32],[`int64`,64],[`uint64`,64],[`int8`,8],[`uint8`,8],[`int4`,4],[`uint4`,4]]),Zt=(e,t)=>{if(t===`int32`)return e;let n=Xt.get(t);if(!n)throw Error(`WebNN backend does not support data type: ${t}`);let r=n/8;if(e.byteLength%r!==0)throw Error(`Invalid Uint8Array length - must be a multiple of ${r}.`);let i=e.byteLength/r,a=new(Mt(t))(e.buffer,e.byteOffset,i);switch(t){case`int64`:case`uint64`:{let e=new Int32Array(i);for(let t=0;t2147483647n||n<-2147483648n)throw Error(`Can not convert int64 data to int32 - value out of range.`);e[t]=Number(n)}return new Uint8Array(e.buffer)}case`int8`:case`uint8`:case`uint32`:{if(t===`uint32`&&a.some(e=>e>2147483647))throw Error(`Can not convert uint32 data to int32 - value out of range.`);let e=Int32Array.from(a,Number);return new Uint8Array(e.buffer)}default:throw Error(`Unsupported data conversion from ${t} to 'int32'`)}},Qt=(e,t)=>{if(t===`int32`)return e;if(e.byteLength%4!=0)throw Error(`Invalid Uint8Array length - must be a multiple of 4 (int32).`);let n=e.byteLength/4,r=new Int32Array(e.buffer,e.byteOffset,n);switch(t){case`int64`:{let e=BigInt64Array.from(r,BigInt);return new Uint8Array(e.buffer)}case`uint64`:{if(r.some(e=>e<0))throw Error(`Can not convert int32 data to uin64 - negative value found.`);let e=BigUint64Array.from(r,BigInt);return new Uint8Array(e.buffer)}case`int8`:{if(r.some(e=>e<-128||e>127))throw Error(`Can not convert int32 data to int8 - value out of range.`);let e=Int8Array.from(r,Number);return new Uint8Array(e.buffer)}case`uint8`:if(r.some(e=>e<0||e>255))throw Error(`Can not convert int32 data to uint8 - value out of range.`);return Uint8Array.from(r,Number);case`uint32`:{if(r.some(e=>e<0))throw Error(`Can not convert int32 data to uint32 - negative value found.`);let e=Uint32Array.from(r,Number);return new Uint8Array(e.buffer)}default:throw Error(`Unsupported data conversion from 'int32' to ${t}`)}},$t=1,en=()=>$t++,tn=/* @__PURE__ */ new Map([[`int8`,`int32`],[`uint8`,`int32`],[`uint32`,`int32`],[`int64`,`int32`]]),nn=(e,t)=>{let n=Xt.get(e);if(!n)throw Error(`WebNN backend does not support data type: ${e}`);return t.length>0?Math.ceil(t.reduce((e,t)=>e*t)*n/8):0},rn=class{constructor(e){this.isDataConverted=!1;let{sessionId:t,context:n,tensor:r,dataType:i,shape:a,fallbackDataType:o}=e;this.sessionId=t,this.mlContext=n,this.mlTensor=r,this.dataType=i,this.tensorShape=a,this.fallbackDataType=o}get tensor(){return this.mlTensor}get type(){return this.dataType}get fallbackType(){return this.fallbackDataType}get shape(){return this.tensorShape}get byteLength(){return nn(this.dataType,this.tensorShape)}destroy(){Jt(`verbose`,()=>`[WebNN] TensorWrapper.destroy`),this.mlTensor.destroy()}write(e){this.mlContext.writeTensor(this.mlTensor,e)}async read(e){if(this.fallbackDataType){let t=await this.mlContext.readTensor(this.mlTensor),n=Qt(new Uint8Array(t),this.dataType);if(e){(e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)).set(n);return}return new Uint8Array(n).buffer}return e?this.mlContext.readTensor(this.mlTensor,e):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(e,t,n){return this.mlContext===e&&this.dataType===t&&this.tensorShape.length===n.length&&this.tensorShape.every((e,t)=>e===n[t])}setIsDataConverted(e){this.isDataConverted=e}},an=class{constructor(e,t){this.tensorManager=e,this.wrapper=t}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(e,t,n,r){let i=this.tensorManager.getMLContext(e),a=this.tensorManager.getMLOpSupportLimits(e),o;if(!a?.input.dataTypes.includes(t)){if(o=tn.get(t),!o||!a?.input.dataTypes.includes(o))throw Error(`WebNN backend does not support data type: ${t}`);Jt(`verbose`,()=>`[WebNN] TensorIdTracker.ensureTensor: fallback dataType from ${t} to ${o}`)}if(this.wrapper){if(this.wrapper.canReuseTensor(i,t,n))return this.wrapper.tensor;if(r){if(this.wrapper.byteLength!==nn(t,n))throw Error(`Unable to copy data to tensor with different size.`);this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let s=typeof MLTensorUsage>`u`?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(e,t,n,s,!0,!0,o),r&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(e){let t=e;if(this.wrapper){if(this.wrapper.fallbackType){if(this.wrapper.fallbackType===`int32`)t=Zt(e,this.wrapper.type),this.wrapper.setIsDataConverted(!0);else throw Error(`Unsupported fallback data type: ${this.wrapper.fallbackType}`)}if(e.byteLength===this.wrapper.byteLength){this.wrapper.write(t);return}Jt(`verbose`,()=>`Data size does not match tensor size. Releasing tensor.`),this.releaseTensor()}this.activeUpload?this.activeUpload.set(t):this.activeUpload=new Uint8Array(t)}async download(e){if(this.activeUpload){let t=this.wrapper?.isDataConverted?Qt(this.activeUpload,this.wrapper?.type):this.activeUpload;if(e){e instanceof ArrayBuffer?new Uint8Array(e).set(t):new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(t);return}return t.buffer}if(!this.wrapper)throw Error(`Tensor has not been created.`);return e?this.wrapper.read(e):this.wrapper.read()}},on=class{constructor(e){this.backend=e,this.tensorTrackersById=/* @__PURE__ */ new Map,this.freeTensors=[],this.externalTensors=/* @__PURE__ */ new Set}getMLContext(e){let t=this.backend.getMLContext(e);if(!t)throw Error(`MLContext not found for session.`);return t}getMLOpSupportLimits(e){return this.backend.getMLOpSupportLimits(e)}reserveTensorId(){let e=en();return this.tensorTrackersById.set(e,new an(this)),e}releaseTensorId(e){let t=this.tensorTrackersById.get(e);t&&(this.tensorTrackersById.delete(e),t.tensorWrapper&&this.releaseTensor(t.tensorWrapper))}async ensureTensor(e,t,n,r,i){Jt(`verbose`,()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${t}, dataType: ${n}, shape: ${r}, copyOld: ${i}}`);let a=this.tensorTrackersById.get(t);if(!a)throw Error(`Tensor not found.`);return a.ensureTensor(e,n,r,i)}upload(e,t){let n=this.tensorTrackersById.get(e);if(!n)throw Error(`Tensor not found.`);n.upload(t)}async download(e,t){Jt(`verbose`,()=>`[WebNN] TensorManager.download {tensorId: ${e}, dstBuffer: ${t?.byteLength}}`);let n=this.tensorTrackersById.get(e);if(!n)throw Error(`Tensor not found.`);return n.download(t)}releaseTensorsForSession(e){for(let t of this.freeTensors)t.sessionId===e&&t.destroy();this.freeTensors=this.freeTensors.filter(t=>t.sessionId!==e)}registerTensor(e,t,n,r){let i=this.getMLContext(e),a=en(),o=new rn({sessionId:e,context:i,tensor:t,dataType:n,shape:r});return this.tensorTrackersById.set(a,new an(this,o)),this.externalTensors.add(o),a}async getCachedTensor(e,t,n,r,i,a,o){let s=this.getMLContext(e);for(let[r,i]of this.freeTensors.entries())if(i.canReuseTensor(s,t,n)){Jt(`verbose`,()=>`[WebNN] Reusing tensor {dataType: ${t}, ${o?`fallbackDataType: ${o},`:``} shape: ${n}`);let i=this.freeTensors.splice(r,1)[0];return i.sessionId=e,i}Jt(`verbose`,()=>`[WebNN] MLContext.createTensor {dataType: ${t}, ${o?`fallbackDataType: ${o},`:``} shape: ${n}}`);let c=await s.createTensor({dataType:o??t,shape:n,dimensions:n,usage:r,writable:i,readable:a});return new rn({sessionId:e,context:s,tensor:c,dataType:t,shape:n,fallbackDataType:o})}releaseTensor(e){this.externalTensors.has(e)&&this.externalTensors.delete(e),this.freeTensors.push(e)}},sn=(...e)=>new on(...e)}),ln={};u(ln,{WebNNBackend:()=>fn});var un,dn,fn,pn=l(()=>{Lt(),ht(),Vt(),cn(),Yt(),un=/* @__PURE__ */ new Map([[1,`float32`],[10,`float16`],[6,`int32`],[12,`uint32`],[7,`int64`],[13,`uint64`],[22,`int4`],[21,`uint4`],[3,`int8`],[2,`uint8`],[9,`uint8`]]),dn=(e,t)=>{if(e===t)return!0;if(e===void 0||t===void 0)return!1;let n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((n,i)=>n===r[i]&&e[n]===t[n])},fn=class{constructor(e){this.tensorManager=sn(this),this.mlContextBySessionId=/* @__PURE__ */ new Map,this.sessionIdsByMLContext=/* @__PURE__ */ new Map,this.mlContextCache=[],this.sessionGraphInputs=/* @__PURE__ */ new Map,this.sessionGraphOutputs=/* @__PURE__ */ new Map,this.temporaryGraphInputs=[],this.temporaryGraphOutputs=[],this.temporarySessionTensorIds=/* @__PURE__ */ new Map,this.mlOpSupportLimitsBySessionId=/* @__PURE__ */ new Map,Kt(e.logLevel,!!e.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw Error(`No active session`);return this.activeSessionId}onRunStart(e){Jt(`verbose`,()=>`[WebNN] onRunStart {sessionId: ${e}}`),this.activeSessionId=e}onRunEnd(e){Jt(`verbose`,()=>`[WebNN] onRunEnd {sessionId: ${e}}`);let t=this.temporarySessionTensorIds.get(e);if(t){for(let e of t)Jt(`verbose`,()=>`[WebNN] releasing temporary tensor {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e);this.temporarySessionTensorIds.delete(e),this.activeSessionId=void 0}}async createMLContext(e){if(e instanceof GPUDevice){let t=this.mlContextCache.findIndex(t=>t.gpuDevice===e);if(t!==-1)return this.mlContextCache[t].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({gpuDevice:e,mlContext:t}),t}}if(e===void 0){let e=this.mlContextCache.findIndex(e=>e.options===void 0&&e.gpuDevice===void 0);if(e!==-1)return this.mlContextCache[e].mlContext;{let e=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:e}),e}}let t=this.mlContextCache.findIndex(t=>dn(t.options,e));if(t!==-1)return this.mlContextCache[t].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({options:e,mlContext:t}),t}}registerMLContext(e,t){this.mlContextBySessionId.set(e,t);let n=this.sessionIdsByMLContext.get(t);n||(n=/* @__PURE__ */ new Set,this.sessionIdsByMLContext.set(t,n)),n.add(e),this.mlOpSupportLimitsBySessionId.has(e)||this.mlOpSupportLimitsBySessionId.set(e,t.opSupportLimits()),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(e,this.temporaryGraphInputs),this.temporaryGraphInputs=[]),this.temporaryGraphOutputs.length>0&&(this.sessionGraphOutputs.set(e,this.temporaryGraphOutputs),this.temporaryGraphOutputs=[])}onReleaseSession(e){this.sessionGraphInputs.delete(e),this.sessionGraphOutputs.delete(e);let t=this.mlContextBySessionId.get(e);if(!t)return;this.tensorManager.releaseTensorsForSession(e),this.mlContextBySessionId.delete(e),this.mlOpSupportLimitsBySessionId.delete(e);let n=this.sessionIdsByMLContext.get(t);if(n.delete(e),n.size===0){this.sessionIdsByMLContext.delete(t);let e=this.mlContextCache.findIndex(e=>e.mlContext===t);e!==-1&&this.mlContextCache.splice(e,1)}}getMLContext(e){return this.mlContextBySessionId.get(e)}getMLOpSupportLimits(e){return this.mlOpSupportLimitsBySessionId.get(e)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(e){Jt(`verbose`,()=>`[WebNN] releaseTensorId {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e)}async ensureTensor(e,t,n,r,i){let a=un.get(n);if(!a)throw Error(`Unsupported ONNX data type: ${n}`);return this.tensorManager.ensureTensor(e??this.currentSessionId,t,a,r,i)}async createTemporaryTensor(e,t,n){Jt(`verbose`,()=>`[WebNN] createTemporaryTensor {onnxDataType: ${t}, shape: ${n}}`);let r=un.get(t);if(!r)throw Error(`Unsupported ONNX data type: ${t}`);let i=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(e,i,r,n,!1);let a=this.temporarySessionTensorIds.get(e);return a?a.push(i):this.temporarySessionTensorIds.set(e,[i]),i}uploadTensor(e,t){if(!E().shouldTransferToMLTensor)throw Error(`Trying to upload to a MLTensor while shouldTransferToMLTensor is false`);Jt(`verbose`,()=>`[WebNN] uploadTensor {tensorId: ${e}, data: ${t.byteLength}}`),this.tensorManager.upload(e,t)}async downloadTensor(e,t){return this.tensorManager.download(e,t)}createMLTensorDownloader(e,t){return async()=>{let n=await this.tensorManager.download(e);return Bt(n,t)}}registerMLTensor(e,t,n,r){let i=un.get(n);if(!i)throw Error(`Unsupported ONNX data type: ${n}`);let a=this.tensorManager.registerTensor(e,t,i,r);return Jt(`verbose`,()=>`[WebNN] registerMLTensor {tensor: ${t}, dataType: ${i}, dimensions: ${r}} -> {tensorId: ${a}}`),a}registerGraphInput(e){this.temporaryGraphInputs.push(e)}registerGraphOutput(e){this.temporaryGraphOutputs.push(e)}isGraphInput(e,t){let n=this.sessionGraphInputs.get(e);return n?n.includes(t):!1}isGraphOutput(e,t){let n=this.sessionGraphOutputs.get(e);return n?n.includes(t):!1}isGraphInputOutputTypeSupported(e,t,n=!0){let r=un.get(kt(t)),i=this.mlOpSupportLimitsBySessionId.get(e);return typeof r>`u`?!1:n?!!i?.input.dataTypes.includes(r):!!i?.output.dataTypes.includes(r)}flush(){}}}),mn,hn,gn,_n,vn,yn,bn,xn,Sn,Cn,wn,Tn,En,Dn=l(()=>{ze(),bt(),Ot(),Lt(),ht(),vt(),zt(),mn=(e,t)=>{E()._OrtInit(e,t)!==0&&D(`Can't initialize onnxruntime.`)},hn=async e=>{mn(e.wasm.numThreads,Nt(e.logLevel))},gn=async(e,t)=>{E().asyncInit?.();let n=e.webgpu.adapter;if(t===`webgpu`){if(typeof navigator>`u`||!navigator.gpu)throw Error(`WebGPU is not supported in current environment`);if(n){if(typeof n.limits!=`object`||typeof n.features!=`object`||typeof n.requestDevice!=`function`)throw Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let t=e.webgpu.powerPreference;if(t!==void 0&&t!==`low-power`&&t!==`high-performance`)throw Error(`Invalid powerPreference setting: "${t}"`);let r=e.webgpu.forceFallbackAdapter;if(r!==void 0&&typeof r!=`boolean`)throw Error(`Invalid forceFallbackAdapter setting: "${r}"`);if(n=await navigator.gpu.requestAdapter({powerPreference:t,forceFallbackAdapter:r}),!n)throw Error(`Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.`)}}if(t===`webnn`&&(typeof navigator>`u`||!navigator.ml))throw Error(`WebNN is not supported in current environment`);if(t===`webgpu`&&E().webgpuInit(t=>{e.webgpu.device=t}),t===`webnn`){let t=new(pn(),f(ln)).WebNNBackend(e);E().webnnInit([t,()=>t.reserveTensorId(),e=>t.releaseTensorId(e),async(e,n,r,i,a)=>t.ensureTensor(e,n,r,i,a),(e,n)=>{t.uploadTensor(e,n)},async(e,n)=>t.downloadTensor(e,n),(e,n)=>t.registerMLContext(e,n),!!e.trace])}},_n=/* @__PURE__ */ new Map,vn=e=>{let t=E(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetInputOutputCount(e,r,r+n)!==0&&D(`Can't get session input/output count.`);let i=n===4?`i32`:`i64`;return[Number(t.getValue(r,i)),Number(t.getValue(r+n,i))]}finally{t.stackRestore(n)}},yn=(e,t)=>{let n=E(),r=n.stackSave(),i=0;try{let r=n.PTR_SIZE,a=n.stackAlloc(2*r);n._OrtGetInputOutputMetadata(e,t,a,a+r)!==0&&D(`Can't get session input/output metadata.`);let o=Number(n.getValue(a,`*`));i=Number(n.getValue(a+r,`*`));let s=n.HEAP32[i/4];if(s===0)return[o,0];let c=n.HEAPU32[i/4+1],l=[];for(let e=0;e{let t=E(),n=t._malloc(e.byteLength);if(n===0)throw Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},xn=async(e,t)=>{let n,r,i=E();Array.isArray(e)?[n,r]=e:e.buffer===i.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=bn(e);let a=0,o=0,s=0,c=[],l=[],u=[];try{if([o,c]=await Dt(t),t?.externalData&&i.mountExternalData){let e=[];for(let n of t.externalData){let t=typeof n==`string`?n:n.path,r=typeof n==`string`?n:n.data;e.push(Rt(r).then(e=>{i.mountExternalData(t,e)}))}await Promise.all(e)}for(let e of t?.executionProviders??[])if((typeof e==`string`?e:e.name)===`webnn`){if(i.shouldTransferToMLTensor=!1,typeof e!=`string`){let t=e,n=t?.context,r=t?.gpuDevice,a=t?.deviceType,o=t?.powerPreference;i.currentContext=n||(r?await i.webnnCreateMLContext(r):await i.webnnCreateMLContext({deviceType:a,powerPreference:o}))}else i.currentContext=await i.webnnCreateMLContext();break}a=await i._OrtCreateSession(n,r,o),i.webgpuOnCreateSession?.(a),a===0&&D(`Can't create a session.`),i.jsepOnCreateSession?.(),i.currentContext&&(i.webnnRegisterMLContext(a,i.currentContext),i.currentContext=void 0,i.shouldTransferToMLTensor=!0);let[e,d]=vn(a),f=!!t?.enableGraphCapture,p=[],m=[],h=[],g=[],_=[];for(let t=0;te===`gpu-buffer`||e===`ml-tensor`||e===`ml-tensor-cpu-output`)&&(s=i._OrtCreateBinding(a),s===0&&D(`Can't create IO binding.`),v={handle:s,outputPreferredLocations:_,outputPreferredLocationsEncoded:_.map(e=>e===`ml-tensor-cpu-output`?`ml-tensor`:e).map(e=>It(e))}),_n.set(a,[a,l,u,v,f,!1]),[a,p,m,h,g]}catch(e){throw l.forEach(e=>i._OrtFree(e)),u.forEach(e=>i._OrtFree(e)),s!==0&&i._OrtReleaseBinding(s)!==0&&D(`Can't release IO binding.`),a!==0&&i._OrtReleaseSession(a)!==0&&D(`Can't release session.`),e}finally{i._free(n),o!==0&&i._OrtReleaseSessionOptions(o)!==0&&D(`Can't release session options.`),c.forEach(e=>i._free(e)),i.unmountExternalData?.()}},Sn=e=>{let t=E(),n=_n.get(e);if(!n)throw Error(`cannot release session. invalid session id: ${e}`);let[r,i,a,o,s]=n;o&&(s&&t._OrtClearBoundOutputs(o.handle)!==0&&D(`Can't clear bound outputs.`),t._OrtReleaseBinding(o.handle)!==0&&D(`Can't release IO binding.`)),t.jsepOnReleaseSession?.(e),t.webnnOnReleaseSession?.(e),t.webgpuOnReleaseSession?.(e),i.forEach(e=>t._OrtFree(e)),a.forEach(e=>t._OrtFree(e)),t._OrtReleaseSession(r)!==0&&D(`Can't release session.`),_n.delete(e)},Cn=async(e,t,n,r,i,a,o=!1)=>{if(!e){t.push(0);return}let s=E(),c=s.PTR_SIZE,l=e[0],u=e[1],d=e[3],f=d,p,m;if(l===`string`&&(d===`gpu-buffer`||d===`ml-tensor`))throw Error(`String tensor is not supported on GPU.`);if(o&&d!==`gpu-buffer`)throw Error(`External buffer must be provided for input/output index ${a} when enableGraphCapture is true.`);if(d===`gpu-buffer`){let t=e[2].gpuBuffer;m=jt(kt(l),u);{let e=s.webgpuRegisterBuffer;if(!e)throw Error(`Tensor location "gpu-buffer" is not supported without using WebGPU.`);p=e(t,r)}}else if(d===`ml-tensor`){let t=e[2].mlTensor;m=jt(kt(l),u);let n=s.webnnRegisterMLTensor;if(!n)throw Error(`Tensor location "ml-tensor" is not supported without using WebNN.`);p=n(r,t,kt(l),u)}else{let t=e[2];if(Array.isArray(t)){m=c*t.length,p=s._malloc(m),n.push(p);for(let e=0;es.setValue(g+t*c,e,c===4?`i32`:`i64`));let e=s._OrtCreateTensor(kt(l),p,m,g,u.length,It(f));e===0&&D(`Can't create tensor for input/output. session=${r}, index=${a}.`),t.push(e)}finally{s.stackRestore(h)}},wn=async(e,t,n,r,i,a)=>{let o=E(),s=o.PTR_SIZE,c=_n.get(e);if(!c)throw Error(`cannot run inference. invalid session id: ${e}`);let l=c[0],u=c[1],d=c[2],f=c[3],p=c[4],m=c[5],h=t.length,g=r.length,_=0,v=[],y=[],b=[],x=[],S=[],C=o.stackSave(),ee=o.stackAlloc(h*s),w=o.stackAlloc(h*s),te=o.stackAlloc(g*s),ne=o.stackAlloc(g*s);try{[_,v]=yt(a),De(`wasm prepareInputOutputTensor`);for(let r=0;re*t,1);u=At(a);let _=f?.outputPreferredLocations[r[t]];if(u===`string`){if(_===`gpu-buffer`||_===`ml-tensor`)throw Error(`String tensor is not supported on GPU.`);let e=[];for(let t=0;t0){let t=o.webgpuGetBuffer;if(!t)throw Error(`preferredLocation "gpu-buffer" is not supported without using WebGPU.`);let r=t(d),i=jt(a,g);if(i===void 0||!Pt(u))throw Error(`Unsupported data type: ${u}`);l=!0;{o.webgpuRegisterBuffer(r,e,d);let t=o.webgpuCreateDownloader(r,i,e);C.push([u,h,{gpuBuffer:r,download:async()=>{let e=await t();return new(Mt(u))(e)},dispose:()=>{o._OrtReleaseTensor(n)!==0&&D(`Can't release tensor.`)}},`gpu-buffer`])}}else if(_===`ml-tensor`&&g>0){let t=o.webnnEnsureTensor,r=o.webnnIsGraphInputOutputTypeSupported;if(!t||!r)throw Error(`preferredLocation "ml-tensor" is not supported without using WebNN.`);if(jt(a,g)===void 0||!Ft(u))throw Error(`Unsupported data type: ${u}`);if(!r(e,u,!1))throw Error(`preferredLocation "ml-tensor" for ${u} output is not supported by current WebNN Context.`);let i=await t(e,d,a,h,!1);l=!0,C.push([u,h,{mlTensor:i,download:o.webnnCreateMLTensorDownloader(d,u),dispose:()=>{o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n)}},`ml-tensor`])}else if(_===`ml-tensor-cpu-output`&&g>0){let e=o.webnnCreateMLTensorDownloader(d,u)(),t=C.length;l=!0,re.push((async()=>{let r=[t,await e];return o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n),r})()),C.push([u,h,[],`cpu`])}else{let e=new(Mt(u))(g);new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(o.HEAPU8.subarray(d,d+e.byteLength)),C.push([u,h,e,`cpu`])}}finally{o.stackRestore(a),u===`string`&&d&&o._free(d),l||o._OrtReleaseTensor(n)}}f&&!p&&(o._OrtClearBoundOutputs(f.handle)!==0&&D(`Can't clear bound outputs.`),_n.set(e,[l,u,d,f,p,!1]));for(let[e,t]of await Promise.all(re))C[e][2]=t;return Oe(`wasm ProcessOutputTensor`),C}finally{o.webnnOnRunEnd?.(l),o.stackRestore(C),n.forEach(e=>{e&&e[3]===`gpu-buffer`&&o.webgpuUnregisterBuffer(e[2].gpuBuffer)}),i.forEach(e=>{e&&e[3]===`gpu-buffer`&&o.webgpuUnregisterBuffer(e[2].gpuBuffer)}),y.forEach(e=>o._OrtReleaseTensor(e)),b.forEach(e=>o._OrtReleaseTensor(e)),x.forEach(e=>o._free(e)),_!==0&&o._OrtReleaseRunOptions(_),v.forEach(e=>o._free(e))}},Tn=e=>{let t=E(),n=_n.get(e);if(!n)throw Error(`invalid session id`);let r=n[0],i=t._OrtEndProfiling(r);i===0&&D(`Can't get an profile file name.`),t._OrtFree(i)},En=e=>{let t=[];for(let n of e){let e=n[2];!Array.isArray(e)&&`buffer`in e&&t.push(e.buffer)}return t}}),On,kn,An,jn,Mn,Nn,Pn,Fn,In,Ln,Rn,zn,Bn,Vn,Hn,Un,Wn,Gn,Kn=l(()=>{ze(),Dn(),ht(),ot(),On=()=>!!w.wasm.proxy&&typeof document<`u`,An=!1,jn=!1,Mn=!1,Fn=/* @__PURE__ */ new Map,In=(e,t)=>{let n=Fn.get(e);n?n.push(t):Fn.set(e,[t])},Ln=()=>{if(An||!jn||Mn||!kn)throw Error(`worker not ready`)},Rn=e=>{switch(e.data.type){case`init-wasm`:An=!1,e.data.err?(Mn=!0,Pn[1](e.data.err)):(jn=!0,Pn[0]()),Nn&&=(URL.revokeObjectURL(Nn),void 0);break;case`init-ep`:case`copy-from`:case`create`:case`release`:case`run`:case`end-profiling`:{let t=Fn.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}}},zn=async()=>{if(!jn){if(An)throw Error(`multiple calls to 'initWasm()' detected.`);if(Mn)throw Error(`previous call to 'initWasm()' failed.`);if(An=!0,On())return new Promise((e,t)=>{kn?.terminate(),rt().then(([n,r])=>{try{kn=r,kn.onerror=e=>t(e),kn.onmessage=Rn,Pn=[e,t];let i={type:`init-wasm`,in:w};if(!i.in.wasm.wasmPaths&&n){let e=Xe();e&&(i.in.wasm.wasmPaths=e)}kn.postMessage(i),Nn=n}catch(e){t(e)}},t)});try{await mt(w.wasm),await hn(w),jn=!0}catch(e){throw Mn=!0,e}finally{An=!1}}},Bn=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`init-ep`,[t,n]);let r={type:`init-ep`,in:{epName:e,env:w}};kn.postMessage(r)});await gn(w,e)},Vn=async e=>On()?(Ln(),new Promise((t,n)=>{In(`copy-from`,[t,n]);let r={type:`copy-from`,in:{buffer:e}};kn.postMessage(r,[e.buffer])})):bn(e),Hn=async(e,t)=>{if(On()){if(t?.preferredOutputLocation)throw Error(`session option "preferredOutputLocation" is not supported for proxy.`);return Ln(),new Promise((n,r)=>{In(`create`,[n,r]);let i={type:`create`,in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),kn.postMessage(i,a)})}return xn(e,t)},Un=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`release`,[t,n]);let r={type:`release`,in:e};kn.postMessage(r)});Sn(e)},Wn=async(e,t,n,r,i,a)=>{if(On()){if(n.some(e=>e[3]!==`cpu`))throw Error(`input tensor on GPU is not supported for proxy.`);if(i.some(e=>e))throw Error(`pre-allocated output tensor is not supported for proxy.`);return Ln(),new Promise((i,o)=>{In(`run`,[i,o]);let s=n,c={type:`run`,in:{sessionId:e,inputIndices:t,inputs:s,outputIndices:r,options:a}};kn.postMessage(c,En(s))})}return wn(e,t,n,r,i,a)},Gn=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`end-profiling`,[t,n]);let r={type:`end-profiling`,in:e};kn.postMessage(r)});Tn(e)}}),qn,Jn,Yn,Xn=l(()=>{ze(),Kn(),Lt(),Be(),zt(),qn=(e,t)=>{switch(e.location){case`cpu`:return[e.type,e.dims,e.data,`cpu`];case`gpu-buffer`:return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},`gpu-buffer`];case`ml-tensor`:return[e.type,e.dims,{mlTensor:e.mlTensor},`ml-tensor`];default:throw Error(`invalid data location: ${e.location} for ${t()}`)}},Jn=e=>{switch(e[3]){case`cpu`:return new xe(e[0],e[2],e[1]);case`gpu-buffer`:{let t=e[0];if(!Pt(t))throw Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:i}=e[2];return xe.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:i})}case`ml-tensor`:{let t=e[0];if(!Ft(t))throw Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:i}=e[2];return xe.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:i})}default:throw Error(`invalid data location: ${e[3]}`)}},Yn=class{async fetchModelAndCopyToWasmMemory(e){return Vn(await Rt(e))}async loadModel(e,t){Te();let n;n=typeof e==`string`?await this.fetchModelAndCopyToWasmMemory(e):e,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await Hn(n,t),Ee()}async dispose(){return Un(this.sessionId)}async run(e,t,n){Te();let r=[],i=[];Object.entries(e).forEach(e=>{let t=e[0],n=e[1],a=this.inputNames.indexOf(t);if(a===-1)throw Error(`invalid input '${t}'`);r.push(n),i.push(a)});let a=[],o=[];Object.entries(t).forEach(e=>{let t=e[0],n=e[1],r=this.outputNames.indexOf(t);if(r===-1)throw Error(`invalid output '${t}'`);a.push(n),o.push(r)});let s=r.map((e,t)=>qn(e,()=>`input "${this.inputNames[i[t]]}"`)),c=a.map((e,t)=>e?qn(e,()=>`output "${this.outputNames[o[t]]}"`):null),l=await Wn(this.sessionId,i,s,o,c,n),u={};for(let e=0;e$n,initializeFlags:()=>Qn,wasmBackend:()=>er});var Qn,$n,er,tr=l(()=>{ze(),Kn(),Xn(),Qn=()=>{(typeof w.wasm.initTimeout!=`number`||w.wasm.initTimeout<0)&&(w.wasm.initTimeout=0);let e=w.wasm.simd;if(typeof e!=`boolean`&&e!==void 0&&e!==`fixed`&&e!==`relaxed`&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${e}". Reset it to \`false\` and ignore SIMD feature checking.`),w.wasm.simd=!1),typeof w.wasm.proxy!=`boolean`&&(w.wasm.proxy=!1),typeof w.wasm.trace!=`boolean`&&(w.wasm.trace=!1),typeof w.wasm.numThreads!=`number`||!Number.isInteger(w.wasm.numThreads)||w.wasm.numThreads<=0){if(typeof self<`u`&&!self.crossOriginIsolated)w.wasm.numThreads=1;else{let e=typeof navigator>`u`?c(`node:os`).cpus().length:navigator.hardwareConcurrency;w.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}}},$n=class{async init(e){Qn(),await zn(),await Bn(e)}async createInferenceSessionHandler(e,t){let n=new Yn;return await n.loadModel(e,t),n}},er=new $n});ze(),ze(),ze();var nr=`1.31.0-dev.20260914-8d85527a0`,rr=Re;{let e=(tr(),f(Zn)).wasmBackend;h(`webgpu`,e,5),h(`webnn`,e,5),h(`cpu`,e,10),h(`wasm`,e,10)}Object.defineProperty(w.versions,"web",{value:nr,enumerable:!0});let ir=`warning`;Object.defineProperty({wasm:{},webgl:{},webgpu:{},versions:{common:`1.30.0`},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);ir=e}},get logLevel(){return ir}},"logLevel",{enumerable:!0});const ar=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t===void 0||t.format===void 0?`RGB`:t.format,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat===void 0||t.tensorFormat===void 0?`RGB`:t.tensorFormat,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,sr(o,s)}throw Error(`Can not access image data`)}else if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(sr(e.data,s))}});else throw Error(`Input data provided is not supported - aborted tensor creation`);if(o!==void 0)return sr(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},lr=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new yr({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ur=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yr({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},dr=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yr({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},fr=(e,t,n)=>new yr({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]}),pr=/* @__PURE__ */ new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),mr=/* @__PURE__ */ new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]);let hr=!1;const gr=()=>{if(!hr){hr=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=n!==void 0&&n.from;e&&(pr.set(`int64`,BigInt64Array),mr.set(BigInt64Array,`int64`)),t&&(pr.set(`uint64`,BigUint64Array),mr.set(BigUint64Array,`uint64`)),r?(pr.set(`float16`,n),mr.set(n,`float16`)):pr.set(`float16`,Uint16Array)}},_r=e=>{let t=1;for(let n=0;n{switch(e.location){case`cpu`:return new yr(e.type,e.data,t);case`cpu-pinned`:return new yr({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new yr({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new yr({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new yr({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}};var yr=class{constructor(e,t,n){gr();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=pr.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`){if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=pr.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray){if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`)}else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=mr.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=_r(i);if(this.cpuData&&a!==this.cpuData.length&&(r!==`uint4`&&r!==`int4`||Math.ceil(a/2)!==this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return cr(e,t)}static fromTexture(e,t){return lr(e,t)}static fromGpuBuffer(e,t){return ur(e,t)}static fromMLTensor(e,t){return dr(e,t)}static fromPinnedBuffer(e,t,n){return fr(e,t,n)}toDataURL(e){return ar(this,e)}toImageData(e){return or(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return vr(this,e)}};const br=yr;var xr=Object.defineProperty,Sr=(e,t)=>{for(var n in t)xr(e,n,{get:t[n],enumerable:!0})},Cr={},wr={},Tr={},Er=`4.3.0`,Dr=typeof self<`u`,Or=!Qr(Cr),kr=!Qr(wr),Ar=Dr&&`caches`in self,jr=globalThis.Deno!==void 0;globalThis.Bun;var Mr=jr&&Ar&&!Or,Nr=typeof process<`u`,Pr=Nr&&process?.release?.name===`node`&&!Mr,Fr=typeof window<`u`&&window.document!==void 0,Ir=Dr&&[`DedicatedWorkerGlobalScope`,`ServiceWorkerGlobalScope`,`SharedWorkerGlobalScope`].includes(self.constructor?.name),Lr=Fr||Ir||Mr,Rr=Pr||typeof navigator<`u`&&`gpu`in navigator,zr=typeof navigator<`u`&&`ml`in navigator,Br=typeof crypto<`u`&&typeof crypto.getRandomValues==`function`,Vr=typeof chrome<`u`&&chrome.runtime!==void 0&&typeof chrome.runtime.id==`string`,Hr=typeof ServiceWorkerGlobalScope<`u`&&Dr&&self instanceof ServiceWorkerGlobalScope,Ur=(()=>{if(typeof navigator>`u`)return!1;let e=navigator.userAgent;if(!((navigator.vendor||``).indexOf(`Apple`)>-1&&!e.match(/CriOS|FxiOS|EdgiOS|OPiOS|mercury|brave/i)&&!e.includes(`Chrome`)&&!e.includes(`Android`)))return!1;let t=e.match(/Version\/(\d+)/);return t?parseInt(t[1],10)<26:!1})(),O=Object.freeze({IS_BROWSER_ENV:Fr,IS_WEBWORKER_ENV:Ir,IS_WEB_ENV:Lr,IS_SERVICE_WORKER_ENV:Hr,IS_DENO_WEB_RUNTIME:Mr,IS_WEB_CACHE_AVAILABLE:Ar,IS_WEBGPU_AVAILABLE:Rr,IS_WEBNN_AVAILABLE:zr,IS_SAFARI_BELOW_26:Ur,IS_PROCESS_AVAILABLE:Nr,IS_NODE_ENV:Pr,IS_FS_AVAILABLE:Or,IS_PATH_AVAILABLE:kr,IS_CRYPTO_AVAILABLE:Br,IS_CHROME_AVAILABLE:Vr}),Wr=Or&&kr,Gr=`./`;if(Wr){let e=import.meta.url;e?Gr=wr.dirname(wr.dirname(Tr.fileURLToPath(e))):typeof __dirname<`u`&&(Gr=wr.dirname(__dirname))}var Kr=Wr?wr.join(Gr,`/.cache/`):null,qr=`/models/`,Jr=Wr?wr.join(Gr,qr):qr,Yr=typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):void 0,Xr=Object.freeze({DEBUG:10,INFO:20,WARNING:30,ERROR:40,NONE:50}),Zr=Xr.WARNING,k={version:Er,backends:{onnx:{}},get logLevel(){return Zr},set logLevel(e){Zr=e,k.backends.onnx?.setLogLevel?.(e)},allowRemoteModels:!0,remoteHost:`https://huggingface.co/`,remotePathTemplate:`{model}/resolve/{revision}/`,allowLocalModels:!(Fr||Ir||Mr),localModelPath:Jr,useFS:Or,useBrowserCache:Ar,useFSCache:Or,cacheDir:Kr,useCustomCache:!1,customCache:null,useWasmCache:Ar||Or,cacheKey:`transformers-cache`,experimental_useCrossOriginStorage:!1,fetch:Yr};function Qr(e){return Object.keys(e).length===0}var $r=class{constructor(){let e=function(...t){return e._call(...t)};return Object.setPrototypeOf(e,new.target.prototype)}_call(...e){throw Error(`Must implement _call method in subclass`)}};function ei(e,t){e&&e(t)}var ti=class extends $r{constructor(e,t){super(),this.callback=e,this.files_loading=t,this.loads=/* @__PURE__ */ new Map}_call(e){if(e.status===`progress`){this.files_loading[e.file]={loaded:e.loaded,total:e.total};let t=Object.values(this.files_loading).reduce((e,t)=>e+t.loaded,0),n=Object.values(this.files_loading).reduce((e,t)=>e+t.total,0),r=n>0?t/n*100:0;this.callback({status:`progress_total`,name:e.name,progress:r,loaded:t,total:n,files:structuredClone(this.files_loading)})}this.callback(e)}};function ni(e){return Number.isInteger(e)||typeof e==`bigint`}function ri(e){return e==null||e===-1}function ii(e){let t=[],n=e;for(;Array.isArray(n);)t.push(n.length),n=n[0];return t}function ai(...e){return Array.prototype.concat.apply([],e)}function oi(...e){return e.reduce((e,t)=>e.flatMap(e=>t.map(t=>[e,t])))}function si(e,t){return Math.abs((e+t)%(2*t)-t)}function ci(e,t){return Object.assign({},...t.map(t=>{if(e[t]!==void 0)return{[t]:e[t]}}))}function li(e,t){let n=0;for(let r of e)r===t&&++n;return n}var A={error(...e){k.logLevel<=Xr.ERROR&&console.error(...e)},warn(...e){k.logLevel<=Xr.WARNING&&console.warn(...e)},info(...e){k.logLevel<=Xr.INFO&&console.log(...e)},debug(...e){k.logLevel<=Xr.DEBUG&&console.log(...e)},log(...e){this.info(...e)}},ui=class{constructor(e){this.trie=this._build_trie(e)}_build_trie(e){let t=/* @__PURE__ */ Object.create(null);for(let n of e){let e=t;for(let t=0;tr&&t.push(e.slice(r,i)),t.push(o),i+=o.length,r=i):++i}return r{try{return new RegExp(e,t)}catch(n){if(!(n instanceof SyntaxError))throw n;let r=/* @__PURE__ */ new Map,i=e.replace(/(\\[pP])\{([^}=]+)\}/g,(t,n,i,a)=>{let o=0;for(let t=a-1;t>=0&&e[t]===`\\`;--t)++o;if(o%2==1)return t;let s=r.get(i);if(s===void 0){try{RegExp(`\\p{${i}}`,`u`),s=i}catch{s=`Script=${i}`}r.set(i,s)}return`${n}{${s}}`});if(i===e)throw n;try{return new RegExp(i,t)}catch{throw n}}},pi=e=>e.replace(/ \./g,`.`).replace(/ \?/g,`?`).replace(/ \!/g,`!`).replace(/ ,/g,`,`).replace(/ \' /g,`'`).replace(/ n't/g,`n't`).replace(/ 'm/g,`'m`).replace(/ 's/g,`'s`).replace(/ 've/g,`'ve`).replace(/ 're/g,`'re`),mi=(e,t=!0)=>{if(e.Regex!==void 0)return fi(Qi(Bi(e.Regex)),`gu`);if(e.String!==void 0){let n=$i(e.String);return new RegExp(t?n:`(${n})`,`gu`)}return console.warn(`Unknown pattern type:`,e),null},hi=`\\p{Alphabetic}\\p{M}\\p{Nd}\\p{Pc}`,gi=`${hi}\\u00B2\\u00B3\\u00B9\\u00BC-\\u00BE`,_i=`[${gi}]`,vi=`[^${gi}]`,yi=`(?:(?|[:=!>])/,ji=/^\\([pPxu])\{([^}]*)\}/,Mi=/^\{(\d+(?:,\d*)?|,\d+)\}/,Ni=/^\[:(\^?)(\p{Alphabetic}+):\]/u,Pi=/^\[:\^:\]/,Fi=/^\[(?:\.[^\]]*\.\]|=[^\]]*=\])/,Ii=/^(?:\\x[0-9A-Fa-f]{2}|\\u[0-9A-Fa-f]{4}|\\c[A-Za-z])/,Li=e=>e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`,Ri=(e,t)=>String.fromCodePoint(e.codePointAt(t)),zi=e=>{if(!/^[0-9A-Fa-f]{1,8}$/.test(e))return null;let t=Number.parseInt(e,16);if(t>127)return null;let n=String.fromCharCode(t);return Li(n)?`[${n.toLowerCase()}${n.toUpperCase()}]`:null},Bi=e=>e.replace(/\[\^\(\\s\|\[([^\]]+)\]\)\]/g,`[^()|\\s$1]`),Vi=`[\\s\\S]`,Hi=256,Ui=()=>({fragment:``,alternatives:[],tail:null,contains_complex_set:!1}),Wi=e=>{throw SyntaxError(`Unsupported range with a set-valued character-class operand at index ${e}`)},Gi=(e,t,n,r=!0)=>{e.tail===`range`&&Wi(n),e.alternatives.push(t),e.tail=`set`,e.contains_complex_set=e.contains_complex_set||r},Ki=(e,t,n=!1,r=-1)=>{if(n&&e.tail===`range`&&Wi(r),e.tail===`range`){e.fragment+=t,e.tail=`complete_range`;return}e.fragment+=t,e.tail=n?`set`:`scalar`,e.contains_complex_set=e.contains_complex_set||n},qi=(e,t,n)=>{let r=ji.exec(e.slice(t));if(r){let[e,i,a]=r;return i===`P`&&a===`Word`?Gi(n,`[^${hi}]`,t):Ki(n,i===`x`?`\\u{${a}}`:i===`p`&&a===`Word`?hi:e,i===`p`||i===`P`,t),t+e.length}let i=Ii.exec(e.slice(t));if(i)return Ki(n,i[0]),t+i[0].length;if(t+1>=e.length)throw SyntaxError(`Unterminated escape in character class at index ${t}`);let a=Ri(e,t+1),o=t+1+a.length,s=Di.get(a);if(s!==void 0)return Ki(n,s),o;let c=Ei.get(a);if(c!==void 0)return Gi(n,c,t),o;let l=Ti.get(a),u,d=!1;return l===void 0?u=/[A-Za-z0-9]/.test(a)||ki.includes(a)||a===`-`?`\\${a}`:a:(u=l,d=a!==`a`&&a!==`e`),Ki(n,u,d,t),o},Ji=e=>e.length===1?e[0]:`(?:(?=(?:${e.join(`|`)}))${Vi})`,Yi=e=>Ji(e.fragment.length===0?e.alternatives:[`[${e.fragment}]`,...e.alternatives]),Xi=e=>{let t=fi(`^(?:${e})$`,`u`),n=``;for(let e=0;e<26;++e){let r=String.fromCharCode(65+e),i=String.fromCharCode(97+e),a=t.test(r);a!==t.test(i)&&(n+=a?i:r)}return n},Zi=(e,t,n,r=!0,i=1)=>{if(i>Hi)throw SyntaxError(`Maximum character-class nesting depth of ${Hi} exceeded at index ${t}`);let a=t+1,o=e[a]===`^`;o&&++a;let s=a,c=[Ui()],l=c[0],u=!1;for(;a1?SyntaxError(`Malformed character-class intersection with an empty operand at index ${a}`):SyntaxError(`Empty character class at index ${t}`);let e=c.some(e=>e.contains_complex_set);if(o&&c.length>1&&u)throw SyntaxError(`Unsupported outer-negated character-class intersection with a nested negated class containing a Unicode property, POSIX class, or shorthand at index ${t}`);let i=Yi(c[0]),d=i;if(c.length>1){let e=``;for(let t=1;t0&&(f?(p+=e,d=`[${p}]`):d=Ji([d,`[${e}]`]))}return{atom:o?f?`[^${p}]`:`(?:(?!${d})${Vi})`:d,end:a+1,negated:o,contains_complex_set:e,contains_nested_negated_complex_set:u}}if(e.startsWith(`&&`,a)){if(l.tail===null)throw SyntaxError(`Malformed character-class intersection with an empty operand at index ${a}`);l=Ui(),c.push(l),a+=2;continue}if(d===`[`){let t=e.slice(a);if(Pi.test(t))throw SyntaxError(`Malformed empty negated POSIX character class at index ${a}`);let r=Ni.exec(t);if(r){let[,e,t]=r,i=Oi.get(t);if(i===void 0)throw SyntaxError(`Unsupported POSIX character class "${t}" at index ${a}`);if(n&&e&&(t===`lower`||t===`upper`))throw SyntaxError(`Unsupported negated POSIX ${t} class inside an inline case-insensitive group`);e?Gi(l,`[^${i}]`,a):Ki(l,i,!0,a),a+=r[0].length;continue}if(Fi.test(t))throw SyntaxError(`Unsupported POSIX collating or equivalence bracket expression at index ${a}`);let o=Zi(e,a,n,!1,i+1);Gi(l,o.atom,a,o.contains_complex_set),u||=o.contains_nested_negated_complex_set||o.negated&&o.contains_complex_set,a=o.end;continue}if(d===`-`){let t=e[a+1]===`]`||e.startsWith(`&&`,a+1);l.tail===`set`&&!t&&Wi(a),l.tail===null||l.tail===`range`||l.tail===`complete_range`||t?Ki(l,`\\-`):(l.fragment+=`-`,l.tail=`range`),++a;continue}Ki(l,d===`^`&&l.fragment.length===0?`\\^`:d),a+=d.length}throw SyntaxError(`${c.length>1?`Unterminated character-class intersection`:`Unterminated character class`} at index ${t}`)},Qi=e=>{let t=``,n=-1,r=!1,i=!1,a=[],o=e=>{n=t.length,t+=e,r=!1};for(let s=0;s=e.length){t+=c;break}let a=Ri(e,s+1);if(s+=1+a.length,a===`G`)continue;let l=Di.get(a);if(l!==void 0){o(l);continue}let u=wi.get(a),d;d=u===void 0?/[A-Za-z0-9]/.test(a)||ki.includes(a)?`\\${a}`:a:u,o(d);continue}switch(c){case`[`:{let t=Zi(e,s,i);o(t.atom),s=t.end;continue}case`]`:o(`\\]`),++s;continue;case`.`:o(`[^\\n]`),++s;continue;case`^`:o(xi),++s;continue;case`$`:o(Si),++s;continue;case`(`:{let n=e.startsWith(`(?i:`,s),o=n?`(?i:`:Ai.exec(e.slice(s))?.[0]??`(`,c=n||o===`(?>`?`(?:`:o;a.push([t.length,i]),n&&(i=!0),t+=c,r=!1,s+=o.length;continue}case`)`:t+=c,[n,i]=a.pop()??[-1,!1],r=!1,++s;continue;case`|`:t+=c,n=-1,r=!1,++s;continue;case`{`:{let i=Mi.exec(e.slice(s));if(!i||n<0){o(`\\{`),++s;continue}let a=i[1].startsWith(`,`)?`0${i[1]}`:i[1];s+=i[0].length;let c=e[s];c===`+`||c===`*`?(t=`${t.slice(0,n)}(?:${t.slice(n)}{${a}})${c}`,++s):t+=`{${a}}`,r=!0;continue}case`}`:o(`\\}`),++s;continue;case`+`:if(r){++s;continue}t+=c,r=!0,++s;continue;case`*`:case`?`:t+=c,r=!0,++s;continue;default:o(i&&Li(c)?`[${c.toLowerCase()}${c.toUpperCase()}]`:c),s+=c.length;continue}}return t},$i=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),ea=(e,t,n)=>{let r=[],i=0;for(;ie>=19968&&e<=40959||e>=13312&&e<=19903||e>=131072&&e<=173791||e>=173824&&e<=177983||e>=177984&&e<=178207||e>=178208&&e<=183983||e>=63744&&e<=64255||e>=194560&&e<=195103,na=e=>Number.isInteger(e)||typeof e==`bigint`,ra=e=>{let t=0;for(let n of e)++t;return t},ia=e=>ca(e.toLowerCase()),aa=(...e)=>Array.prototype.concat.apply([],e),oa=e=>new Map(Object.entries(e)),sa=(e,t)=>{let n=[],r=0;for(let i of e.matchAll(t)){let t=i[0];r0&&n.push(t),r=i.index+t.length}return re.replace(/\p{M}/gu,``),la=(e,t,n=[])=>{if(!e||Array.isArray(e)||typeof e!=`object`)return`${t} must be a valid object`;for(let r of n)if(!(r in e))return`${t} must contain a "${r}" property`;return null},ua=e=>e.match(/\S+/g)||[],da=class{constructor(){let e=function(...t){return e._call(...t)};return Object.setPrototypeOf(e,new.target.prototype)}},fa=class extends da{constructor(e){super(),this.config=e}_call(e){return this.normalize(e)}},pa=class extends fa{tokenize_chinese_chars(e){let t=[];for(let n=0;ne.normalize(`NFKC`)).join(`~`):e.normalize(`NFKC`),e}},ha=class extends fa{constructor(e){super(e),this.normalizers=(e.normalizers??[]).map(e=>Da(e))}normalize(e){return this.normalizers.reduce((e,t)=>t?t.normalize(e):e,e)}},ga=class extends fa{constructor(e){super(e),this.pattern=mi(this.config.pattern??{})}normalize(e){return this.pattern===null?e:e.replaceAll(this.pattern,this.config.content??``)}},_a=class extends fa{constructor(){super(...arguments),this.form=`NFC`}normalize(e){return e=e.normalize(this.form),e}},va=class extends _a{constructor(){super(...arguments),this.form=`NFC`}},ya=class extends _a{constructor(){super(...arguments),this.form=`NFD`}},ba=class extends _a{constructor(){super(...arguments),this.form=`NFKC`}},xa=class extends _a{constructor(){super(...arguments),this.form=`NFKD`}},Sa=class extends fa{normalize(e){return this.config.strip_left&&this.config.strip_right?e=e.trim():(this.config.strip_left&&(e=e.trimStart()),this.config.strip_right&&(e=e.trimEnd())),e}},Ca=class extends fa{normalize(e){return ca(e)}},wa=class extends fa{normalize(e){return e.toLowerCase()}},Ta=class extends fa{normalize(e){return e=this.config.prepend+e,e}};function Ea(e){if(e===null)return null;switch(e.type){case`BertNormalizer`:return new pa(e);case`Precompiled`:return new ma(e);case`Sequence`:return new ha(e);case`Replace`:return new ga(e);case`NFC`:return new va(e);case`NFD`:return new ya(e);case`NFKC`:return new ba(e);case`NFKD`:return new xa(e);case`Strip`:return new Sa(e);case`StripAccents`:return new Ca(e);case`Lowercase`:return new wa(e);case`Prepend`:return new Ta(e);default:throw Error(`Unknown Normalizer type: ${e.type}`)}}var Da=Ea,Oa=class extends da{pre_tokenize(e,t){return(Array.isArray(e)?e.map(e=>this.pre_tokenize_text(e,t)):this.pre_tokenize_text(e,t)).flat()}_call(e,t){return this.pre_tokenize(e,t)}},ka=(()=>{let e=[...Array.from({length:94},(e,t)=>t+33),...Array.from({length:12},(e,t)=>t+161),...Array.from({length:82},(e,t)=>t+174)],t=e.slice(),n=0;for(let r=0;r<256;++r)e.includes(r)||(e.push(r),t.push(256+n),n+=1);let r=t.map(e=>String.fromCharCode(e));return Object.fromEntries(e.map((e,t)=>[e,r[t]]))})(),Aa=(e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[t,e])))(ka),ja=`\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E`,Ma=class extends Oa{constructor(e){super(),this.config=e,this.add_prefix_space=this.config.add_prefix_space??!1,this.trim_offsets=this.config.trim_offsets??!1,this.use_regex=this.config.use_regex??!0,this.pattern=/'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu,this.byte_encoder=ka,this.text_encoder=new TextEncoder}pre_tokenize_text(e,t){return this.add_prefix_space&&!e.startsWith(` `)&&(e=` `+e),(this.use_regex?e.match(this.pattern)||[]:[e]).map(e=>Array.from(this.text_encoder.encode(e),e=>this.byte_encoder[e]).join(``))}},Na=class extends Oa{pre_tokenize_text(e,t){return e.match(/\w+|[^\w\s]+/g)||[]}},Pa=class extends Oa{constructor(e){super(),this.replacement=e.replacement??`▁`,this.str_rep=e.str_rep||this.replacement,this.prepend_scheme=e.prepend_scheme??`always`}pre_tokenize_text(e,t){let{section_index:n=void 0}=t??{},r=e.replaceAll(` `,this.str_rep);return!r.startsWith(this.replacement)&&(this.prepend_scheme===`always`||this.prepend_scheme===`first`&&n===0)&&(r=this.str_rep+r),[r]}},Fa=class extends Oa{constructor(e){super(),this.config=e,this.pattern=mi(this.config.pattern??{},this.config.invert??!0)}pre_tokenize_text(e){return this.pattern===null?[]:this.config.invert?(e.match(this.pattern)||[]).filter(e=>e):this.config.behavior?.toLowerCase()===`removed`?e.split(this.pattern).filter(e=>e):sa(e,this.pattern)}},Ia=class extends Oa{constructor(e){super(),this.config=e,this.pattern=RegExp(`[^${ja}]+|[${ja}]+`,`gu`)}pre_tokenize_text(e){return e.match(this.pattern)||[]}},La=class extends Oa{constructor(e){super(),this.config=e;let t=`[^\\d]+|\\d${this.config.individual_digits?``:`+`}`;this.pattern=new RegExp(t,`gu`)}pre_tokenize_text(e){return e.match(this.pattern)||[]}},Ra=class extends Oa{constructor(){super(),this.pattern=RegExp(`[^\\s${ja}]+|[${ja}]`,`gu`)}pre_tokenize_text(e,t){return e.trim().match(this.pattern)||[]}},za=class extends Oa{constructor(e){super(),this.config=e,this.pattern=mi(this.config.pattern??{}),this.content=this.config.content??``}pre_tokenize_text(e){return this.pattern===null?[e]:[e.replaceAll(this.pattern,this.config.content??``)]}},Ba=class extends Oa{constructor(e){super(),this.tokenizers=(e.pretokenizers??[]).map(e=>Wa(e))}pre_tokenize_text(e,t){return this.tokenizers.reduce((e,n)=>n?n.pre_tokenize(e,t):e,[e])}},Va=class extends Oa{pre_tokenize_text(e){return ua(e)}},Ha=class extends Oa{constructor(e){super(),this.config=e,this._length=e.length}pre_tokenize_text(e){let t=[];for(let n=0;nthis.max_input_chars_per_word){t.push(this.unk_token);continue}let r=!1,i=0,a=[];for(;i0&&(r=this.config.continuing_subword_prefix+r),this.tokens_to_ids.has(r)){n=r;break}--t}if(n===null){r=!0;break}a.push(n),i=t}r?t.push(this.unk_token):t.push(...a)}return t}},qa=class e{constructor(e,t){this.is_leaf=e,this.children=t}static default(){return new e(!1,/* @__PURE__ */ new Map)}},Ja=class{constructor(){this.root=qa.default()}extend(e){for(let t of e)this.push(t)}push(e){let t=this.root;for(let n of e){let e=t.children.get(n);e===void 0&&(e=qa.default(),t.children.set(n,e)),t=e}t.is_leaf=!0}*common_prefix_search(e,t=0){let n=this.root;if(n===void 0)return;let r=``;for(let i=t;i[]),this.end_nodes=Array.from({length:this.len+1},()=>[]);let r=new Ya(this.bos_token_id??0,0,0,0,0),i=new Ya(this.eos_token_id??0,1,this.len,0,0);this.nodes.push(r.clone()),this.nodes.push(i.clone()),this.begin_nodes[this.len].push(i),this.end_nodes[0].push(r)}insert(e,t,n,r){let i=this.nodes.length,a=new Ya(r,i,e,t,n);this.begin_nodes[e].push(a),this.end_nodes[e+t].push(a),this.nodes.push(a)}viterbi(){let e=this.len,t=0;for(;t<=e;){if(this.begin_nodes[t].length==0)return[];for(let e of this.begin_nodes[t]){e.prev=null;let n=0,r=null;for(let i of this.end_nodes[t]){let t=i.backtrace_score+e.score;(r===null||t>n)&&(r=i.clone(),n=t)}if(r!==null)e.prev=r,e.backtrace_score=n;else return[]}++t}let n=[],r=this.begin_nodes[e][0].prev;if(r===null)return[];let i=r.clone();for(;i.prev!==null;)n.push(i.clone()),i=i.clone().prev.clone();return n.reverse(),n}piece(e){return this.chars.slice(e.pos,e.pos+e.length).join(``)}tokens(){return this.viterbi().map(e=>this.piece(e))}token_ids(){return this.viterbi().map(e=>e.token_id)}};function Za(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;r[e,t])),this.bos_token=` `,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=t,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.unk_token=this.vocab[this.unk_token_id],this.min_score=Za(this.scores)[0],this.unk_score=this.min_score-10,this.scores[this.unk_token_id]=this.unk_score,this.trie=new Ja,this.trie.extend(this.vocab),this.fuse_unk=!0}populate_nodes(e){let t=e.chars,n=0;for(;ne>t,t=1/0){this._heap=[],this._comparator=e,this._max_size=t}get size(){return this._heap.length}is_empty(){return this.size===0}peek(){return this._heap[0]}push(...e){return this.extend(e)}extend(e){for(let t of e)if(this.size0&&this._swap(0,t),this._heap.pop(),this._sift_down(),e}replace(e){let t=this.peek();return this._heap[0]=e,this._sift_down(),t}_parent(e){return(e+1>>>1)-1}_left(e){return(e<<1)+1}_right(e){return e+1<<1}_greater(e,t){return this._comparator(this._heap[e],this._heap[t])}_swap(e,t){let n=this._heap[e];this._heap[e]=this._heap[t],this._heap[t]=n}_sift_up(){this._sift_up_from(this.size-1)}_sift_up_from(e){for(;e>0&&this._greater(e,this._parent(e));)this._swap(e,this._parent(e)),e=this._parent(e)}_sift_down(){let e=0;for(;this._left(e)this.capacity&&this.cache.delete(this.cache.keys().next().value)}clear(){this.cache.clear()}},to=class extends Ga{constructor(e){super(e),this.tokens_to_ids=oa(e.vocab),this.unk_token_id=this.tokens_to_ids.get(e.unk_token),this.unk_token=e.unk_token,this.vocab=Array(this.tokens_to_ids.size);for(let[e,t]of this.tokens_to_ids)this.vocab[t]=e;let t=Array.isArray(e.merges[0]);this.merges=t?e.merges:e.merges.map(e=>e.split(` `,2)),this.bpe_ranks=new Map(this.merges.map((e,t)=>[JSON.stringify(e),t])),this.end_of_word_suffix=e.end_of_word_suffix,this.continuing_subword_suffix=e.continuing_subword_suffix??null,this.byte_fallback=this.config.byte_fallback??!1,this.byte_fallback&&(this.text_encoder=new TextEncoder),this.ignore_merges=this.config.ignore_merges??!1,this.max_length_to_cache=256,this.cache_capacity=1e4,this.cache=new eo(this.cache_capacity)}clear_cache(){this.cache.clear()}bpe(e){if(e.length===0)return[];let t=this.cache.get(e);if(t!==void 0)return t;let n=Array.from(e);this.end_of_word_suffix&&(n[n.length-1]+=this.end_of_word_suffix);let r=[];if(n.length>1){let e=new $a((e,t)=>e.score`<0x${e.toString(16).toUpperCase().padStart(2,`0`)}>`);e.every(e=>this.tokens_to_ids.has(e))?t.push(...e):this.unk_token!=null&&t.push(this.unk_token)}else this.unk_token!=null&&t.push(this.unk_token)}return t}},no=class extends Ga{constructor(e,t){super(e);let n=e.vocab;this.tokens_to_ids=oa(t.target_lang?n[t.target_lang]:n),this.bos_token=t.bos_token,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=t.eos_token,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.pad_token=t.pad_token,this.pad_token_id=this.tokens_to_ids.get(this.pad_token),this.unk_token=t.unk_token,this.unk_token_id=this.tokens_to_ids.get(this.unk_token),this.vocab=Array(this.tokens_to_ids.size);for(let[e,t]of this.tokens_to_ids)this.vocab[t]=e}encode(e){return e}};function ro(e,t){switch(e.type){case`WordPiece`:return new Ka(e);case`Unigram`:return new Qa(e,t.eos_token);case`BPE`:return new to(e);default:if(e.vocab)return Array.isArray(e.vocab)?new Qa(e,t.eos_token):Object.hasOwn(e,`continuing_subword_prefix`)&&Object.hasOwn(e,`unk_token`)?Object.hasOwn(e,`merges`)?new to(e):new Ka(e):new no(e,{target_lang:t.target_lang,bos_token:t.bos_token,eos_token:t.eos_token,pad_token:t.pad_token,unk_token:t.unk_token});throw Error(`Unknown TokenizerModel type: ${e?.type}`)}}var io=ro,ao=class extends da{constructor(e){super(),this.config=e}_call(e,...t){return this.post_process(e,...t)}},oo=class extends ao{post_process(e,t=null,n=!0){let r=t===null?this.config.single:this.config.pair,i=[],a=[];for(let o of r)`SpecialToken`in o?n&&(i.push(o.SpecialToken.id),a.push(o.SpecialToken.type_id)):`Sequence`in o&&(o.Sequence.id===`A`?(i=aa(i,e),a=aa(a,Array(e.length).fill(o.Sequence.type_id))):o.Sequence.id===`B`&&(i=aa(i,t),a=aa(a,Array(t.length).fill(o.Sequence.type_id))));return{tokens:i,token_type_ids:a}}},so=class extends ao{post_process(e,t=null){return{tokens:e,tokens_pair:t}}},co=class extends ao{constructor(e){super(e),this.sep=e.sep,this.cls=e.cls}post_process(e,t=null,n=!0){n&&(e=aa([this.cls[0]],e,[this.sep[0]]));let r=Array(e.length).fill(0);if(t){let i=[],a=n?[this.sep[0]]:[];e=aa(e,i,t,a),r=aa(r,Array(t.length+i.length+a.length).fill(1))}return{tokens:e,token_type_ids:r}}},lo=class extends ao{constructor(e){super(e),this.sep=e.sep,this.cls=e.cls}post_process(e,t,n=!0){n&&(e=aa([this.cls[0]],e,[this.sep[0]]));let r=Array(e.length).fill(0);if(t){let i=n?[this.sep[0]]:[],a=n?[this.sep[0]]:[];e=aa(e,i,t,a),r=aa(r,Array(t.length+i.length+a.length).fill(1))}return{tokens:e,token_type_ids:r}}},uo=class extends ao{constructor(e){super(e),this.processors=(e.processors??[]).map(e=>po(e))}post_process(e,t=null,n=!0){let r={tokens:e,tokens_pair:t};for(let e of this.processors)r=e.post_process(r.tokens,r.tokens_pair,n);return r}};function fo(e){if(e===null)return null;switch(e.type){case`TemplateProcessing`:return new oo(e);case`ByteLevel`:return new so(e);case`BertProcessing`:return new co(e);case`RobertaProcessing`:return new lo(e);case`Sequence`:return new uo(e);default:throw Error(`Unknown PostProcessor type: ${e.type}`)}}var po=fo,mo=class extends da{constructor(e){super(),this.config=e,this.added_tokens=[],this.end_of_word_suffix=null,this.trim_offsets=`trim_offsets`in e&&e.trim_offsets}_call(e){return this.decode(e)}decode(e){return this.decode_chain(e).join(``)}},ho=class extends mo{constructor(e){super(e),this.byte_decoder=Aa,this.text_decoder=new TextDecoder(`utf-8`,{fatal:!1,ignoreBOM:!0}),this.end_of_word_suffix=null}convert_tokens_to_string(e){let t=e.join(``),n=new Uint8Array([...t].map(e=>this.byte_decoder[e]));return this.text_decoder.decode(n)}decode_chain(e){let t=[],n=[];for(let r of e)this.added_tokens.find(e=>e.content===r)===void 0?n.push(r):(n.length>0&&(t.push(this.convert_tokens_to_string(n)),n=[]),t.push(r));return n.length>0&&t.push(this.convert_tokens_to_string(n)),t}},go=class extends mo{constructor(e){super(e),this.cleanup=e.cleanup}decode_chain(e){return e.map((e,t)=>{if(t!==0){let t=this.config.prefix;e=t&&e.startsWith(t)?e.replace(t,``):` `+e}return this.cleanup&&(e=pi(e)),e})}},_o=class extends mo{constructor(e){super(e),this.replacement=e.replacement??`▁`}decode_chain(e){let t=[];for(let n=0;nt.replaceAll(this.suffix,n===e.length-1?``:` `))}},yo=class extends mo{constructor(e){super(e),this.pad_token=e.pad_token??``,this.word_delimiter_token=e.word_delimiter_token??``,this.cleanup=e.cleanup}convert_tokens_to_string(e){if(e.length===0)return``;let t=[e[0]];for(let n=1;ne!==this.pad_token).join(``);return this.cleanup&&(n=pi(n).replaceAll(this.word_delimiter_token,` `).trim()),n}decode_chain(e){return[this.convert_tokens_to_string(e)]}},bo=class extends mo{constructor(e){super(e),this.decoders=(e.decoders??[]).map(e=>Eo(e))}decode_chain(e){return this.decoders.reduce((e,t)=>t.decode_chain(e),e)}},xo=class extends mo{constructor(e){super(e),this.pattern=mi(this.config.pattern)}decode_chain(e){let t=this.config.content??``,n=this.pattern;return n===null?e:e.map(e=>e.replaceAll(n,t))}},So=class extends mo{decode_chain(e){return[e.join(``)]}},Co=class extends mo{constructor(e){super(e),this.content=e.content??``,this.start=e.start??0,this.stop=e.stop??0}decode_chain(e){return e.map(e=>{let t=0;for(let n=0;n`)){let t=parseInt(r.slice(3,5),16);isNaN(t)||(e=t)}if(e!==null)n.push(e);else{if(n.length>0){let e=this.text_decoder.decode(Uint8Array.from(n));t.push(e),n=[]}t.push(r)}}if(n.length>0){let e=this.text_decoder.decode(Uint8Array.from(n));t.push(e),n=[]}return t}};function To(e){if(e===null)return null;switch(e.type){case`ByteLevel`:return new ho(e);case`WordPiece`:return new go(e);case`Metaspace`:return new _o(e);case`BPEDecoder`:return new vo(e);case`CTC`:return new yo(e);case`Sequence`:return new bo(e);case`Replace`:return new xo(e);case`Fuse`:return new So(e);case`Strip`:return new Co(e);case`ByteFallback`:return new wo(e);default:throw Error(`Unknown Decoder type: ${e.type}`)}}var Eo=To,Do=class{constructor(e,t){let n=la(e,`Tokenizer`,[`model`,`decoder`,`post_processor`,`pre_tokenizer`,`normalizer`]);if(n)throw Error(n);let r=la(t,`Config`);if(r)throw Error(r);this.tokenizer=e,this.config=t,this.normalizer=Da(this.tokenizer.normalizer),this.pre_tokenizer=Wa(this.tokenizer.pre_tokenizer),this.model=io(this.tokenizer.model,this.config),this.post_processor=po(this.tokenizer.post_processor),this.decoder=Eo(this.tokenizer.decoder),this.special_tokens=[],this.all_special_ids=[],this.added_tokens=[];let i=[],a=[];this.added_tokens_map=/* @__PURE__ */ new Map;for(let e of this.tokenizer.added_tokens){let t=new di(e);if(this.added_tokens.push(t),this.model.tokens_to_ids.set(t.content,t.id),this.model.vocab[t.id]=t.content,t.special&&(this.special_tokens.push(t.content),this.all_special_ids.push(t.id)),this.added_tokens_map.set(t.content,t),t.normalized&&this.normalizer!==null){let e=this.normalizer(t.content);a.push(e),this.added_tokens_map.set(e,t)}else i.push(t.content)}(this.config.additional_special_tokens??[]).forEach(e=>{this.special_tokens.includes(e)||this.special_tokens.push(e)}),this.decoder&&(this.decoder.added_tokens=this.added_tokens,this.decoder.end_of_word_suffix=this.model.end_of_word_suffix),this.splitter_unnormalized=new ui(i),this.splitter_normalized=new ui(a),this.remove_space=this.config.remove_space,this.clean_up_tokenization_spaces=this.config.clean_up_tokenization_spaces??!0,this.do_lowercase_and_remove_accent=this.config.do_lowercase_and_remove_accent??!1}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{tokens:i,token_type_ids:a}=this.tokenize_helper(e,{text_pair:t,add_special_tokens:n}),o=i.map(e=>this.added_tokens_map.get(e)?.id??this.model.tokens_to_ids.get(e)??this.model.unk_token_id),s={ids:o,tokens:i,attention_mask:Array(o.length).fill(1)};return r&&a&&(s.token_type_ids=a),s}decode(e,t={}){if(!Array.isArray(e)||e.length===0||!na(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);let n=e.map(e=>this.model.vocab[Number(e)]??this.model.unk_token);t.skip_special_tokens&&(n=n.filter(e=>!this.special_tokens.includes(e)));let r=this.decoder?this.decoder(n):n.join(` `);return this.decoder&&this.decoder.end_of_word_suffix&&(r=r.replaceAll(this.decoder.end_of_word_suffix,` `),t.skip_special_tokens&&(r=r.trim())),(t.clean_up_tokenization_spaces??this.clean_up_tokenization_spaces)&&(r=pi(r)),r}tokenize(e,{text_pair:t=null,add_special_tokens:n=!1}={}){return this.tokenize_helper(e,{text_pair:t,add_special_tokens:n}).tokens}encode_text(e){if(e===null)return null;let t=this.splitter_unnormalized.split(e);return t.forEach((e,n)=>{let r=this.added_tokens_map.get(e);r&&(r.lstrip&&n>0&&(t[n-1]=t[n-1].trimEnd()),r.rstrip&&n{if(e.length===0)return[];if(this.added_tokens_map.has(e))return[e];if(this.remove_space===!0&&(e=e.trim().split(/\s+/).join(` `)),this.do_lowercase_and_remove_accent&&(e=ia(e)),this.normalizer!==null&&(e=this.normalizer(e)),e.length===0)return[];let n=this.splitter_normalized.split(e);return n.forEach((e,t)=>{let r=this.added_tokens_map.get(e);r&&(r.lstrip&&t>0&&(n[t-1]=n[t-1].trimEnd()),r.rstrip&&t{if(e.length===0)return[];if(this.added_tokens_map.has(e))return[e];let n=this.pre_tokenizer===null?[e]:this.pre_tokenizer(e,{section_index:t});return this.model(n)})})}tokenize_helper(e,{text_pair:t=null,add_special_tokens:n=!0}){let r=this.encode_text(e),i=this.encode_text(t||null);return this.post_processor?this.post_processor(r,i,n):{tokens:aa(r??[],i??[])}}token_to_id(e){return this.model.tokens_to_ids.get(e)}id_to_token(e){return this.model.vocab[e]}get_added_tokens_decoder(){let e=/* @__PURE__ */ new Map;for(let t of this.added_tokens)e.set(t.id,t);return e}get_vocab(e=!0){let t=/* @__PURE__ */ new Map;for(let n=0;nt in e?Oo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ao=(e,t,n)=>(ko(e,typeof t==`symbol`?t:t+``,n),n),j=Object.freeze({Text:`Text`,NumericLiteral:`NumericLiteral`,StringLiteral:`StringLiteral`,Identifier:`Identifier`,Equals:`Equals`,OpenParen:`OpenParen`,CloseParen:`CloseParen`,OpenStatement:`OpenStatement`,CloseStatement:`CloseStatement`,OpenExpression:`OpenExpression`,CloseExpression:`CloseExpression`,OpenSquareBracket:`OpenSquareBracket`,CloseSquareBracket:`CloseSquareBracket`,OpenCurlyBracket:`OpenCurlyBracket`,CloseCurlyBracket:`CloseCurlyBracket`,Comma:`Comma`,Dot:`Dot`,Colon:`Colon`,Pipe:`Pipe`,CallOperator:`CallOperator`,AdditiveBinaryOperator:`AdditiveBinaryOperator`,MultiplicativeBinaryOperator:`MultiplicativeBinaryOperator`,ExponentiationBinaryOperator:`ExponentiationBinaryOperator`,ComparisonBinaryOperator:`ComparisonBinaryOperator`,UnaryOperator:`UnaryOperator`,Comment:`Comment`}),jo=class{constructor(e,t){this.value=e,this.type=t}};function Mo(e){return/\w/.test(e)}function No(e){return/[0-9]/.test(e)}function Po(e){return/\s/.test(e)}var Fo=[[`{%`,j.OpenStatement],[`%}`,j.CloseStatement],[`{{`,j.OpenExpression],[`}}`,j.CloseExpression],[`(`,j.OpenParen],[`)`,j.CloseParen],[`{`,j.OpenCurlyBracket],[`}`,j.CloseCurlyBracket],[`[`,j.OpenSquareBracket],[`]`,j.CloseSquareBracket],[`,`,j.Comma],[`.`,j.Dot],[`:`,j.Colon],[`|`,j.Pipe],[`<=`,j.ComparisonBinaryOperator],[`>=`,j.ComparisonBinaryOperator],[`==`,j.ComparisonBinaryOperator],[`!=`,j.ComparisonBinaryOperator],[`<`,j.ComparisonBinaryOperator],[`>`,j.ComparisonBinaryOperator],[`+`,j.AdditiveBinaryOperator],[`-`,j.AdditiveBinaryOperator],[`~`,j.AdditiveBinaryOperator],[`**`,j.ExponentiationBinaryOperator],[`*`,j.MultiplicativeBinaryOperator],[`//`,j.MultiplicativeBinaryOperator],[`/`,j.MultiplicativeBinaryOperator],[`%`,j.MultiplicativeBinaryOperator],[`=`,j.Equals]],Io=/* @__PURE__ */ new Map([[`n`,` -`],[`t`,` `],[`r`,`\r`],[`b`,`\b`],[`f`,`\f`],[`v`,`\v`],[`'`,`'`],[`"`,`"`],[`\\`,`\\`]]);function Lo(e,t={}){return e.endsWith(` -`)&&(e=e.slice(0,-1)),t.lstrip_blocks&&(e=e.replace(/^[ \t]*({[#%-])/gm,`$1`)),t.trim_blocks&&(e=e.replace(/([#%-]})\n/g,`$1`)),e.replace(/(\s*){%(-?)\s*(?:end)?generation\s*(-?)%}(\s*)/gs,(e,t,n,r,i)=>(n?``:t)+(r?``:i))}function Ro(e,t={}){let n=[],r=Lo(e,t),i=0,a=0,o=e=>{let t=``;for(;e(r[i]);){if(r[i]===`\\`){if(++i,i>=r.length)throw SyntaxError(`Unexpected end of input`);let e=r[i++],n=Io.get(e);if(n===void 0)throw SyntaxError(`Unexpected escaped character: ${e}`);t+=n;continue}if(t+=r[i++],i>=r.length)throw SyntaxError(`Unexpected end of input`)}return t},s=()=>{let e=n.at(-1);e&&e.type===j.Text&&(e.value=e.value.trimEnd(),e.value===``&&n.pop())},c=()=>{for(;i0){n.push(new jo(e,j.Text));continue}}if(r[i]===`{`&&r[i+1]===`#`){i+=2;let e=r[i]===`-`;e&&++i;let t=``;for(;r[i]!==`#`||r[i+1]!==`}`;){if(i+2>=r.length)throw SyntaxError(`Missing end of comment tag`);t+=r[i++]}let a=t.endsWith(`-`);a&&(t=t.slice(0,-1)),e&&s(),n.push(new jo(t,j.Comment)),i+=2,a&&c();continue}if(r.slice(i,i+3)===`{%-`){s(),n.push(new jo(`{%`,j.OpenStatement)),i+=3;continue}if(r.slice(i,i+3)===`{{-`){s(),n.push(new jo(`{{`,j.OpenExpression)),a=0,i+=3;continue}if(o(Po),r.slice(i,i+3)===`-%}`){n.push(new jo(`%}`,j.CloseStatement)),i+=3,c();continue}if(r.slice(i,i+3)===`-}}`){n.push(new jo(`}}`,j.CloseExpression)),i+=3,c();continue}let t=r[i];if(t===`-`||t===`+`){let e=n.at(-1)?.type;if(e===j.Text||e===void 0)throw SyntaxError(`Unexpected character: ${t}`);switch(e){case j.Identifier:case j.NumericLiteral:case j.StringLiteral:case j.CloseParen:case j.CloseSquareBracket:break;default:{++i;let e=o(No);if(e.length>0&&r[i]===`.`&&No(r[i+1])){++i;let t=o(No);e=`${e}.${t}`}n.push(new jo(`${t}${e}`,e.length>0?j.NumericLiteral:j.UnaryOperator));continue}}}for(let[e,t]of Fo)if(!(e===`}}`&&a>0)&&r.slice(i,i+e.length)===e){n.push(new jo(e,t)),t===j.OpenExpression?a=0:t===j.OpenCurlyBracket?++a:t===j.CloseCurlyBracket&&--a,i+=e.length;continue main}if(t===`'`||t===`"`){++i;let e=o(e=>e!==t);n.push(new jo(e,j.StringLiteral)),++i;continue}if(No(t)){let e=o(No);if(n.at(-1)?.type!==j.Dot&&r[i]===`.`&&No(r[i+1])){++i;let t=o(No);e=`${e}.${t}`}n.push(new jo(e,j.NumericLiteral));continue}if(Mo(t)){let e=o(Mo);n.push(new jo(e,j.Identifier));continue}throw SyntaxError(`Unexpected character: ${t}`)}return n}var zo=class{type=`Statement`},Bo=class extends zo{constructor(e){super(),this.body=e}type=`Program`},Vo=class extends zo{constructor(e,t,n){super(),this.test=e,this.body=t,this.alternate=n}type=`If`},Ho=class extends zo{constructor(e,t,n,r){super(),this.loopvar=e,this.iterable=t,this.body=n,this.defaultBlock=r}type=`For`},Uo=class extends zo{type=`Break`},Wo=class extends zo{type=`Continue`},Go=class extends zo{constructor(e,t,n){super(),this.assignee=e,this.value=t,this.body=n}type=`Set`},Ko=class extends zo{constructor(e,t,n){super(),this.name=e,this.args=t,this.body=n}type=`Macro`},qo=class extends zo{constructor(e){super(),this.value=e}type=`Comment`},Jo=class extends zo{type=`Expression`},Yo=class extends Jo{constructor(e,t,n){super(),this.object=e,this.property=t,this.computed=n}type=`MemberExpression`},Xo=class extends Jo{constructor(e,t){super(),this.callee=e,this.args=t}type=`CallExpression`},Zo=class extends Jo{constructor(e){super(),this.value=e}type=`Identifier`},Qo=class extends Jo{constructor(e){super(),this.value=e}type=`Literal`},$o=class extends Qo{type=`IntegerLiteral`},es=class extends Qo{type=`FloatLiteral`},ts=class extends Qo{type=`StringLiteral`},ns=class extends Qo{type=`ArrayLiteral`},rs=class extends Qo{type=`TupleLiteral`},is=class extends Qo{type=`ObjectLiteral`},as=class extends Jo{constructor(e,t,n){super(),this.operator=e,this.left=t,this.right=n}type=`BinaryExpression`},os=class extends Jo{constructor(e,t){super(),this.operand=e,this.filter=t}type=`FilterExpression`},ss=class extends zo{constructor(e,t){super(),this.filter=e,this.body=t}type=`FilterStatement`},cs=class extends Jo{constructor(e,t){super(),this.lhs=e,this.test=t}type=`SelectExpression`},ls=class extends Jo{constructor(e,t,n){super(),this.operand=e,this.negate=t,this.test=n}type=`TestExpression`},us=class extends Jo{constructor(e,t){super(),this.operator=e,this.argument=t}type=`UnaryExpression`},ds=class extends Jo{constructor(e=void 0,t=void 0,n=void 0){super(),this.start=e,this.stop=t,this.step=n}type=`SliceExpression`},fs=class extends Jo{constructor(e,t){super(),this.key=e,this.value=t}type=`KeywordArgumentExpression`},ps=class extends Jo{constructor(e){super(),this.argument=e}type=`SpreadExpression`},ms=class extends Jo{constructor(e){super(),this.argument=e}type=`KeywordSpreadExpression`},hs=class extends zo{constructor(e,t,n){super(),this.call=e,this.callerArgs=t,this.body=n}type=`CallStatement`},gs=class extends Jo{constructor(e,t,n){super(),this.condition=e,this.trueExpr=t,this.falseExpr=n}type=`Ternary`};function _s(e){let t=new Bo([]),n=0;function r(t,r){let i=e[n++];if(!i||i.type!==t)throw Error(`Parser Error: ${r}. ${i.type} !== ${t}.`);return i}function i(e){if(!c(e))throw SyntaxError(`Expected ${e}`);++n}function a(){switch(e[n].type){case j.Comment:return new qo(e[n++].value);case j.Text:return l();case j.OpenStatement:return u();case j.OpenExpression:return d();default:throw SyntaxError(`Unexpected token type: ${e[n].type}`)}}function o(...t){return n+t.length<=e.length&&t.every((t,r)=>t===e[n+r].type)}function s(...t){return e[n]?.type===j.OpenStatement&&e[n+1]?.type===j.Identifier&&t.includes(e[n+1]?.value)}function c(...t){return n+t.length<=e.length&&t.every((t,r)=>e[n+r].type===`Identifier`&&t===e[n+r].value)}function l(){return new ts(r(j.Text,`Expected text token`).value)}function u(){if(r(j.OpenStatement,`Expected opening statement token`),e[n].type!==j.Identifier)throw SyntaxError(`Unknown statement, got ${e[n].type}`);let t=e[n].value,c;switch(t){case`set`:++n,c=f();break;case`if`:++n,c=p(),r(j.OpenStatement,`Expected {% token`),i(`endif`),r(j.CloseStatement,`Expected %} token`);break;case`macro`:++n,c=m(),r(j.OpenStatement,`Expected {% token`),i(`endmacro`),r(j.CloseStatement,`Expected %} token`);break;case`for`:++n,c=g(),r(j.OpenStatement,`Expected {% token`),i(`endfor`),r(j.CloseStatement,`Expected %} token`);break;case`call`:{++n;let e=null;o(j.OpenParen)&&(e=te(`parameters`));let t=ue();if(t.type!==`Identifier`)throw SyntaxError(`Expected identifier following call statement`);let l=te(`call`);r(j.CloseStatement,`Expected closing statement token`);let u=[];for(;!s(`endcall`);)u.push(a());r(j.OpenStatement,`Expected '{%'`),i(`endcall`),r(j.CloseStatement,`Expected closing statement token`),c=new hs(new Xo(t,l),e,u);break}case`break`:++n,r(j.CloseStatement,`Expected closing statement token`),c=new Uo;break;case`continue`:++n,r(j.CloseStatement,`Expected closing statement token`),c=new Wo;break;case`filter`:{++n;let e=ue();e instanceof Zo&&o(j.OpenParen)&&(e=w(e)),r(j.CloseStatement,`Expected closing statement token`);let t=[];for(;!s(`endfilter`);)t.push(a());r(j.OpenStatement,`Expected '{%'`),i(`endfilter`),r(j.CloseStatement,`Expected '%}'`),c=new ss(e,t);break}default:throw SyntaxError(`Unknown statement type: ${t}`)}return c}function d(){r(j.OpenExpression,`Expected opening expression token`);let e=_();return r(j.CloseExpression,`Expected closing expression token`),e}function f(){let e=h(),t=null,c=[];if(o(j.Equals))++n,t=h();else{for(r(j.CloseStatement,`Expected %} token`);!s(`endset`);)c.push(a());r(j.OpenStatement,`Expected {% token`),i(`endset`)}return r(j.CloseStatement,`Expected closing statement token`),new Go(e,t,c)}function p(){let e=_();r(j.CloseStatement,`Expected closing statement token`);let t=[],i=[];for(;!s(`elif`,`else`,`endif`);)t.push(a());if(s(`elif`)){++n,++n;let e=p();i.push(e)}else if(s(`else`))for(++n,++n,r(j.CloseStatement,`Expected closing statement token`);!s(`endif`);)i.push(a());return new Vo(e,t,i)}function m(){let e=ue();if(e.type!==`Identifier`)throw SyntaxError(`Expected identifier following macro statement`);let t=te(`parameters`);r(j.CloseStatement,`Expected closing statement token`);let n=[];for(;!s(`endmacro`);)n.push(a());return new Ko(e,t,n)}function h(e=!1){let t=e?ue:_,r=[t()],i=o(j.Comma);for(;i&&(++n,r.push(t()),o(j.Comma)););return i?new rs(r):r[0]}function g(){let e=h(!0);if(!(e instanceof Zo||e instanceof rs))throw SyntaxError(`Expected identifier/tuple for the loop variable, got ${e.type} instead`);if(!c(`in`))throw SyntaxError("Expected `in` keyword following loop variable");++n;let t=_();r(j.CloseStatement,`Expected closing statement token`);let i=[];for(;!s(`endfor`,`else`);)i.push(a());let o=[];if(s(`else`))for(++n,++n,r(j.CloseStatement,`Expected closing statement token`);!s(`endfor`);)o.push(a());return new Ho(e,t,i,o)}function _(){return v()}function v(){let e=y();if(c(`if`)){++n;let t=y();return c(`else`)?(++n,new gs(t,e,v())):new cs(e,t)}return e}function y(){let t=b();for(;c(`or`);){let r=e[n];++n;let i=b();t=new as(r,t,i)}return t}function b(){let t=x();for(;c(`and`);){let r=e[n];++n;let i=x();t=new as(r,t,i)}return t}function x(){let t;for(;c(`not`);){let r=e[n];++n,t=new us(r,x())}return t??S()}function S(){let t=C();for(;;){let r;if(c(`not`,`in`))r=new jo(`not in`,j.Identifier),n+=2;else if(c(`in`))r=e[n++];else if(o(j.ComparisonBinaryOperator))r=e[n++];else break;let i=C();t=new as(r,t,i)}return t}function C(){let t=ae();for(;o(j.AdditiveBinaryOperator);){let r=e[n];++n;let i=ae();t=new as(r,t,i)}return t}function ee(){let e=ie(ue());return o(j.OpenParen)?w(e):e}function w(e){let t=new Xo(e,te(`call`));return t=ie(t),o(j.OpenParen)&&(t=w(t)),t}function te(e){r(j.OpenParen,`Expected opening parenthesis for arguments list`);let t=ne(e);return r(j.CloseParen,`Expected closing parenthesis for arguments list`),t}function ne(t){let r=[],i=/* @__PURE__ */ new Set,a=!1,s=!1;for(;!o(j.CloseParen);){let c=o(j.ExponentiationBinaryOperator),l=o(j.MultiplicativeBinaryOperator)&&e[n].value===`*`;if(t===`parameters`&&(c||l))throw SyntaxError(`Argument unpacking is not allowed in parameter declarations`);if(c){if(++n,r.push(new ms(_())),o(j.Comma)&&++n,!o(j.CloseParen))throw SyntaxError("Expected closing parenthesis: `**` must be applied to the final argument");break}let u;if(l){if(s)throw SyntaxError("Only one `*` argument unpacking is allowed");s=!0,++n,u=new ps(_())}else{if(u=_(),o(j.Equals)){if(++n,!(u instanceof Zo))throw SyntaxError(t===`parameters`?`Expected identifier for parameter declaration`:`Expected identifier for keyword argument`);let e=_();u=new fs(u,e)}if(t===`parameters`){if(!(u instanceof Zo||u instanceof fs))throw SyntaxError(`Expected identifier for parameter declaration`);let e=u instanceof Zo?u.value:u.key.value;if(i.has(e))throw SyntaxError(`Duplicate parameter name: ${e}`);i.add(e)}if(u instanceof fs)a=!0;else if(a)throw SyntaxError(t===`call`?`Positional arguments must come before keyword arguments`:`Non-default argument follows default argument`);else if(s)throw SyntaxError("Positional arguments must not follow `*` argument unpacking")}r.push(u),o(j.Comma)&&++n}return r}function re(){let e=[],t=!1;for(;!o(j.CloseSquareBracket);)o(j.Colon)?(e.push(void 0),++n,t=!0):(e.push(_()),o(j.Colon)&&(++n,t=!0));if(e.length===0)throw SyntaxError(`Expected at least one argument for member/slice expression`);if(t){if(e.length>3)throw SyntaxError(`Expected 0-3 arguments for slice expression`);return new ds(...e)}return e[0]}function ie(t){for(;o(j.Dot)||o(j.OpenSquareBracket);){let i=e[n];++n;let a,o=i.type===j.OpenSquareBracket;if(o)a=re(),r(j.CloseSquareBracket,`Expected closing square bracket`);else if(a=ue(),a.type!==`Identifier`&&a.type!==`IntegerLiteral`)throw SyntaxError(`Expected identifier or integer following dot operator`);t=new Yo(t,a,o)}return t}function ae(){let t=oe();for(;o(j.MultiplicativeBinaryOperator);){let r=e[n++],i=oe();t=new as(r,t,i)}return t}function oe(){let t=se();for(;o(j.ExponentiationBinaryOperator);){let r=e[n++],i=se();t=new as(r,t,i)}return t}function se(){let e=ce();for(;c(`is`);){++n;let t=c(`not`);t&&++n;let r=ue();if(!(r instanceof Zo))throw SyntaxError(`Expected identifier for the test`);e=new ls(e,t,r)}return e}function ce(){let e=le();for(;o(j.Pipe);){++n;let t=ue();if(!(t instanceof Zo))throw SyntaxError(`Expected identifier for the filter`);o(j.OpenParen)&&(t=w(t)),e=new os(e,t)}return e}function le(){let t=e[n];if(t&&(t.type===j.UnaryOperator||t.type===j.AdditiveBinaryOperator)&&(t.value===`-`||t.value===`+`)){let t=e[n++];return new us(t,le())}return ee()}function ue(){let t=e[n++];switch(t.type){case j.NumericLiteral:{let e=t.value;return e.includes(`.`)?new es(Number(e)):new $o(Number(e))}case j.StringLiteral:{let r=t.value;for(;o(j.StringLiteral);)r+=e[n++].value;return new ts(r)}case j.Identifier:return new Zo(t.value);case j.OpenParen:{let e=h();return r(j.CloseParen,"Expected closing parenthesis, got ${tokens[current].type} instead."),e}case j.OpenSquareBracket:{let e=[];for(;!o(j.CloseSquareBracket);)e.push(_()),o(j.Comma)&&++n;return++n,new ns(e)}case j.OpenCurlyBracket:{let e=/* @__PURE__ */ new Map;for(;!o(j.CloseCurlyBracket);){let t=_();r(j.Colon,`Expected colon between key and value in object literal`);let i=_();e.set(t,i),o(j.Comma)&&++n}return++n,new is(e)}default:throw SyntaxError(`Unexpected token: ${t.type}`)}}for(;n0)for(let i=e;it;i+=n)r.push(i);return r}function ys(e,t,n,r=1){let i=Math.sign(r);i>=0?(t=(t??=0)<0?Math.max(e.length+t,0):Math.min(t,e.length),n=(n??=e.length)<0?Math.max(e.length+n,0):Math.min(n,e.length)):(t=(t??=e.length-1)<0?Math.max(e.length+t,-1):Math.min(t,e.length-1),n=(n??=-1)<-1?Math.max(e.length+n,-1):Math.min(n,e.length-1));let a=[];for(let o=t;i*oe.toUpperCase())}function xs(e){return Ss(/* @__PURE__ */ new Date,e)}function Ss(e,t){let n=new Intl.DateTimeFormat(void 0,{month:`long`}),r=new Intl.DateTimeFormat(void 0,{month:`short`}),i=e=>e<10?`0`+e:e.toString();return t.replace(/%[YmdbBHM%]/g,t=>{switch(t){case`%Y`:return e.getFullYear().toString();case`%m`:return i(e.getMonth()+1);case`%d`:return i(e.getDate());case`%b`:return r.format(e);case`%B`:return n.format(e);case`%H`:return i(e.getHours());case`%M`:return i(e.getMinutes());case`%%`:return`%`;default:return t}})}function Cs(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ws(e,t,n,r){if(r===0)return e;let i=r==null||r<0?1/0:r,a=t.length===0?/* @__PURE__ */ RegExp(`(?=)`,`gu`):new RegExp(Cs(t),`gu`);return e.replaceAll(a,e=>i>0?(--i,n):e)}var Ts=class extends Error{},Es=class extends Error{},Ds=/* @__PURE__ */ new Map,Os=class{type=`RuntimeValue`;value;get builtins(){return Ds}constructor(e=void 0){this.value=e}__bool__(){return new F(!!this.value)}toString(){return String(this.value)}},M=class extends Os{type=`IntegerValue`},N=class extends Os{type=`FloatValue`;toString(){return Object.is(this.value,-0)?`-0.0`:this.value%1==0?this.value.toFixed(1):this.value.toString()}},P=class extends Os{type=`StringValue`;_builtins;get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`upper`,new L(()=>new P(this.value.toUpperCase()))],[`lower`,new L(()=>new P(this.value.toLowerCase()))],[`strip`,new L(()=>new P(this.value.trim()))],[`title`,new L(()=>new P(bs(this.value)))],[`capitalize`,new L(()=>new P(this.value.charAt(0).toUpperCase()+this.value.slice(1)))],[`length`,new M(this.value.length)],[`rstrip`,new L(()=>new P(this.value.trimEnd()))],[`lstrip`,new L(()=>new P(this.value.trimStart()))],[`startswith`,new L(e=>{if(e.length===0)throw Error(`startswith() requires at least one argument`);let t=e[0];if(t instanceof P)return new F(this.value.startsWith(t.value));if(t instanceof I){for(let e of t.value){if(!(e instanceof P))throw Error(`startswith() tuple elements must be strings`);if(this.value.startsWith(e.value))return new F(!0)}return new F(!1)}throw Error(`startswith() argument must be a string or tuple of strings`)})],[`endswith`,new L(e=>{if(e.length===0)throw Error(`endswith() requires at least one argument`);let t=e[0];if(t instanceof P)return new F(this.value.endsWith(t.value));if(t instanceof I){for(let e of t.value){if(!(e instanceof P))throw Error(`endswith() tuple elements must be strings`);if(this.value.endsWith(e.value))return new F(!0)}return new F(!1)}throw Error(`endswith() argument must be a string or tuple of strings`)})],[`split`,new L(e=>{let t=e[0]??new R;if(!(t instanceof P||t instanceof R))throw Error(`sep argument must be a string or null`);let n=e[1]??new M(-1);if(!(n instanceof M))throw Error(`maxsplit argument must be a number`);let r=[];if(t instanceof R){let e=this.value.trimStart();for(let{0:t,index:i}of e.matchAll(/\S+/g)){if(n.value!==-1&&r.length>=n.value&&i!==void 0){r.push(t+e.slice(i+t.length));break}r.push(t)}}else{if(t.value===``)throw Error(`empty separator`);r=this.value.split(t.value),n.value!==-1&&r.length>n.value&&r.push(r.splice(n.value).join(t.value))}return new I(r.map(e=>new P(e)))})],[`replace`,new L(e=>{if(e.length<2)throw Error(`replace() requires at least two arguments`);let t=e[0],n=e[1];if(!(t instanceof P&&n instanceof P))throw Error(`replace() arguments must be strings`);let r;if(r=e.length>2?e[2].type===`KeywordArgumentsValue`?e[2].value.get(`count`)??new R:e[2]:new R,!(r instanceof M||r instanceof R))throw Error(`replace() count argument must be a number or null`);return new P(ws(this.value,t.value,n.value,r.value))})]])}},F=class extends Os{type=`BooleanValue`},ks=/[\x7f-\uffff]/g;function As(e){return e.replace(ks,e=>`\\u`+e.charCodeAt(0).toString(16).padStart(4,`0`))}function js(e,t={},n=0,r=!0){let{indent:i=null,ensureAscii:a=!1,separators:o=null,sortKeys:s=!1}=t,c,l;switch(o?[c,l]=o:i?(c=`,`,l=`: `):(c=`, `,l=`: `),e.type){case`NullValue`:return`null`;case`UndefinedValue`:return r?`null`:`undefined`;case`IntegerValue`:case`FloatValue`:case`BooleanValue`:return JSON.stringify(e.value);case`StringValue`:{let t=JSON.stringify(e.value);return a&&(t=As(t)),t}case`ArrayValue`:case`NamespaceValue`:case`ObjectValue`:{let o=i?` `.repeat(i):``,u=` -`+o.repeat(n),d=u+o;if(e.type===`ArrayValue`){let a=e.value.map(e=>js(e,t,n+1,r));return i?`[${d}${a.join(`${c}${d}`)}${u}]`:`[${a.join(c)}]`}{let o=Array.from(e.value.entries());s&&(o=o.sort(([e],[t])=>e.localeCompare(t)));let f=o.map(([e,o])=>{let s=JSON.stringify(e);a&&(s=As(s));let c=`${s}${l}${js(o,t,n+1,r)}`;return i?`${d}${c}`:c});return i?`{${f.join(c)}${u}}`:`{${f.join(c)}}`}}default:throw Error(`Cannot convert to JSON: ${e.type}`)}}var Ms=class extends Os{type=`ObjectValue`;_builtins;__bool__(){return new F(this.value.size>0)}get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`get`,new L(([e,t])=>{if(!(e instanceof P))throw Error(`Object key must be a string: got ${e.type}`);return this.value.get(e.value)??t??new R})],[`items`,new L(()=>this.items())],[`keys`,new L(()=>this.keys())],[`values`,new L(()=>this.values())],[`dictsort`,new L(e=>{let t=/* @__PURE__ */ new Map,n=e.filter(e=>e instanceof Ns?(t=e.value,!1):!0),r=n.at(0)??t.get(`case_sensitive`)??new F(!1);if(!(r instanceof F))throw Error(`case_sensitive must be a boolean`);let i=n.at(1)??t.get(`by`)??new P(`key`);if(!(i instanceof P))throw Error(`by must be a string`);if(![`key`,`value`].includes(i.value))throw Error(`by must be either 'key' or 'value'`);let a=n.at(2)??t.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);return new I(Array.from(this.value.entries()).map(([e,t])=>new I([new P(e),t])).sort((e,t)=>{let n=i.value===`key`?0:1,o=e.value[n],s=t.value[n],c=Ws(o,s,r.value);return a.value?-c:c}))})]])}items(){return new I(Array.from(this.value.entries()).map(([e,t])=>new I([new P(e),t])))}keys(){return new I(Array.from(this.value.keys()).map(e=>new P(e)))}values(){return new I(Array.from(this.value.values()))}toString(){return js(this,{},0,!1)}},Ns=class extends Ms{type=`KeywordArgumentsValue`},Ps=class extends Os{type=`NamespaceValue`;toString(){return js(this,{},0,!1)}},I=class extends Os{type=`ArrayValue`;_builtins;get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`length`,new M(this.value.length)]])}__bool__(){return new F(this.value.length>0)}toString(){return js(this,{},0,!1)}},Fs=class extends I{type=`TupleValue`},L=class extends Os{type=`FunctionValue`},R=class extends Os{type=`NullValue`},z=class extends Os{type=`UndefinedValue`};function Is(e){let t;if(e instanceof I?t=e.value:e instanceof P&&(t=Array.from(e.value,e=>new P(e))),!t||t.length!==2)throw Error(`namespace expected an object or an iterable of [key, value] pairs`);let[n,r]=t;if(!(n instanceof P))throw Error(`namespace keys must be strings`);return[n,r]}var Ls=class{constructor(e){this.parent=e}variables=/* @__PURE__ */ new Map([[`namespace`,new L(e=>{let t=e.slice(),n;if(t.at(-1)instanceof Ns&&(n=t.pop()),t.length>1)throw Error(`namespace expected at most 1 argument, got ${t.length}`);let r=/* @__PURE__ */ new Map;if(t.length===1){let e=t[0];if(e instanceof Ms)for(let[t,n]of e.value)r.set(t,n);else if(e instanceof I)for(let t of e.value){let[e,n]=Is(t);r.set(e.value,n)}else throw Error(`'${e.type}' object is not iterable`)}if(n)for(let[e,t]of n.value)r.set(e,t);return new Ps(r)})]]);tests=Ls.TESTS;set(e,t){return this.declareVariable(e,Ys(t))}declareVariable(e,t){if(this.variables.has(e))throw SyntaxError(`Variable already declared: ${e}`);return this.variables.set(e,t),t}setVariable(e,t){return this.variables.set(e,t),t}resolve(e){if(this.variables.has(e))return this;if(this.parent)return this.parent.resolve(e);throw Error(`Unknown variable: ${e}`)}lookupVariable(e){try{return this.resolve(e).variables.get(e)??new z}catch{return new z}}},Rs=Ls;Ao(Rs,`TESTS`,/* @__PURE__ */ new Map([[`boolean`,e=>e.type===`BooleanValue`],[`callable`,e=>e instanceof L],[`odd`,e=>{if(!(e instanceof M))throw Error(`cannot odd on ${e.type}`);return e.value%2!=0}],[`even`,e=>{if(!(e instanceof M))throw Error(`cannot even on ${e.type}`);return e.value%2==0}],[`false`,e=>e.type===`BooleanValue`&&!e.value],[`true`,e=>e.type===`BooleanValue`&&e.value],[`none`,e=>e.type===`NullValue`],[`string`,e=>e.type===`StringValue`],[`number`,e=>e instanceof M||e instanceof N],[`integer`,e=>e instanceof M],[`iterable`,e=>e.type===`ArrayValue`||e.type===`StringValue`],[`mapping`,e=>e instanceof Ms],[`sequence`,e=>e instanceof I||e instanceof Ms||e instanceof P],[`lower`,e=>{let t=e.value;return e.type===`StringValue`&&t===t.toLowerCase()}],[`upper`,e=>{let t=e.value;return e.type===`StringValue`&&t===t.toUpperCase()}],[`none`,e=>e.type===`NullValue`],[`defined`,e=>e.type!==`UndefinedValue`],[`undefined`,e=>e.type===`UndefinedValue`],[`equalto`,(e,t)=>e.value===t.value],[`eq`,(e,t)=>e.value===t.value]]));function zs(e){e.set(`false`,!1),e.set(`true`,!0),e.set(`none`,null),e.set(`raise_exception`,e=>{throw Error(e)}),e.set(`range`,vs),e.set(`strftime_now`,xs),e.set(`True`,!0),e.set(`False`,!1),e.set(`None`,null)}function Bs(e){return e instanceof Ms||e instanceof Ps}function Vs(e){return e instanceof M||e instanceof N||e instanceof F}function Hs(e){return e instanceof F?Number(e.value):e.value}function Us(e,t){let n=t.split(`.`),r=e;for(let e of n)if(Bs(r))r=r.value.get(e)??new z;else if(r instanceof I){let t=parseInt(e,10);if(!isNaN(t)&&t>=0&&tr)}if(e.type!==t.type)throw Error(`Cannot compare different types: ${e.type} and ${t.type}`);switch(e.type){case`StringValue`:{let r=e.value,i=t.value;return n||(r=r.toLowerCase(),i=i.toLowerCase()),ri)}default:throw Error(`Cannot compare type: ${e.type}`)}}function Gs(e){if(e.type===`Identifier`)return{name:e.value};let t=e;return{name:t.key.value,defaultValue:t.value}}function Ks(e){return e===`kwargs`||e===`varargs`}function qs(e,t){let n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set,i=e=>{Ks(e)&&n.add(e)},a=e=>{if(e.type===`Identifier`)i(e.value);else if(e.type===`TupleLiteral`)for(let t of e.value)a(t)},o=e=>{i(Gs(e).name)},s=e=>{for(let t of e){let e=Gs(t);e.defaultValue&&l(e.defaultValue)}},c=e=>{e.type===`CallExpression`&&l(e.args)},l=e=>{if(Array.isArray(e)){for(let t of e)l(t);return}if(e instanceof Map){for(let[t,n]of e)l(t),l(n);return}if(e instanceof zo)switch(e.type){case`For`:{let t=e;if(a(t.loopvar),t.iterable.type===`SelectExpression`){let e=t.iterable;l(e.lhs),l(t.body),l(t.defaultBlock),l(e.test);return}l(t.iterable),l(t.body),l(t.defaultBlock);return}case`Set`:{let t=e;a(t.assignee),l(t.value),l(t.body);return}case`Macro`:{let t=e;for(let e of t.args)o(e);s(t.args),l(t.body);return}case`CallStatement`:{let t=e;l(t.call);for(let e of t.callerArgs??[])o(e);s(t.callerArgs??[]),l(t.body);return}case`FilterStatement`:{let t=e;l(t.body),c(t.filter);return}case`Identifier`:{let t=e.value;Ks(t)&&!n.has(t)&&r.add(t);return}case`MemberExpression`:{let t=e;l(t.object),t.computed&&l(t.property);return}case`FilterExpression`:{let t=e;l(t.operand),c(t.filter);return}case`TestExpression`:l(e.operand);return;case`SelectExpression`:{let t=e;l(t.test),l(t.lhs);return}case`KeywordArgumentExpression`:l(e.value);return;default:for(let t of Object.values(e))l(t)}};for(let t of e)o(t);return l(t),r}var Js=class{global;constructor(e){this.global=e??new Rs}run(e){return this.evaluate(e,this.global)}evaluateBinaryExpression(e,t){let n=this.evaluate(e.left,t);switch(e.operator.value){case`and`:return n.__bool__().value?this.evaluate(e.right,t):n;case`or`:return n.__bool__().value?n:this.evaluate(e.right,t)}let r=this.evaluate(e.right,t);switch(e.operator.value){case`==`:return new F(n.value==r.value);case`!=`:return new F(n.value!=r.value)}if(n instanceof z||r instanceof z){if(r instanceof z&&[`in`,`not in`].includes(e.operator.value))return new F(e.operator.value===`not in`);throw Error(`Cannot perform operation ${e.operator.value} on undefined values`)}if(n instanceof R||r instanceof R)throw Error(`Cannot perform operation on null values`);if(e.operator.value===`~`)return new P(n.value.toString()+r.value.toString());if(e.operator.value===`**`&&Vs(n)&&Vs(r)){let e=Hs(n),t=Hs(r);if(e===0&&t<0)throw Error(`0.0 cannot be raised to a negative power`);let i=e**t;if(!Number.isFinite(i))throw Error(`Exponentiation result is not a finite real number`);return n instanceof N||r instanceof N||t<0?new N(i):new M(i)}if((n instanceof M||n instanceof N)&&(r instanceof M||r instanceof N)){let t=n.value,i=r.value;switch(e.operator.value){case`+`:case`-`:case`*`:{let a=e.operator.value===`+`?t+i:e.operator.value===`-`?t-i:t*i;return n instanceof N||r instanceof N?new N(a):new M(a)}case`/`:return new N(t/i);case`//`:{let e=Math.floor(t/i);return n instanceof N||r instanceof N?new N(e):new M(e)}case`%`:{let e=t%i;return n instanceof N||r instanceof N?new N(e):new M(e)}case`<`:return new F(t`:return new F(t>i);case`>=`:return new F(t>=i);case`<=`:return new F(t<=i)}}else if(n instanceof I&&r instanceof I)switch(e.operator.value){case`+`:return new I(n.value.concat(r.value))}else if(r instanceof I){let t=r.value.find(e=>e.value===n.value)!==void 0;switch(e.operator.value){case`in`:return new F(t);case`not in`:return new F(!t)}}if(n instanceof P||r instanceof P)switch(e.operator.value){case`+`:return new P(n.value.toString()+r.value.toString())}if(n instanceof P&&r instanceof P)switch(e.operator.value){case`in`:return new F(r.value.includes(n.value));case`not in`:return new F(!r.value.includes(n.value))}if(n instanceof P&&r instanceof Ms)switch(e.operator.value){case`in`:return new F(r.value.has(n.value));case`not in`:return new F(!r.value.has(n.value))}throw SyntaxError(`Unknown operator "${e.operator.value}" between ${n.type} and ${r.type}`)}evaluateArguments(e,t){let n=[],r=/* @__PURE__ */ new Map,i=(e,t)=>{if(r.has(e))throw Error(`Got multiple values for keyword argument '${e}'`);r.set(e,t)};for(let r of e)if(r.type===`SpreadExpression`){let e=r,i=this.evaluate(e.argument,t);if(!(i instanceof I))throw Error(`Cannot unpack non-iterable type: ${i.type}`);for(let e of i.value)n.push(e)}else r.type!==`KeywordArgumentExpression`&&r.type!==`KeywordSpreadExpression`&&n.push(this.evaluate(r,t));for(let n of e)if(n.type===`KeywordArgumentExpression`){let e=n;i(e.key.value,this.evaluate(e.value,t))}else if(n.type===`KeywordSpreadExpression`){let e=n,r=this.evaluate(e.argument,t);if(!(r instanceof Ms))throw Error(`Argument after ** must be a mapping, not ${r.type}`);for(let[e,t]of r.value)i(e,t)}return[n,r]}applyFilter(e,t,n){if(t.type===`Identifier`){let r=t;if(r.value===`safe`)return e;if(r.value===`tojson`)return new P(js(e,{}));if(e instanceof I)switch(r.value){case`list`:return e;case`first`:return e.value[0];case`last`:return e.value[e.value.length-1];case`length`:return new M(e.value.length);case`reverse`:return new I(e.value.slice().reverse());case`sort`:return new I(e.value.slice().sort((e,t)=>Ws(e,t,!1)));case`join`:return new P(e.value.map(e=>e.value).join(``));case`string`:return new P(js(e,{},0,!1));case`unique`:{let t=/* @__PURE__ */ new Set,n=[];for(let r of e.value)t.has(r.value)||(t.add(r.value),n.push(r));return new I(n)}default:throw Error(`Unknown ArrayValue filter: ${r.value}`)}else if(e instanceof P)switch(r.value){case`length`:case`upper`:case`lower`:case`title`:case`capitalize`:{let t=e.builtins.get(r.value);if(t instanceof L)return t.value([],n);if(t instanceof M)return t;throw Error(`Unknown StringValue filter: ${r.value}`)}case`trim`:return new P(e.value.trim());case`indent`:return new P(e.value.split(` -`).map((e,t)=>t===0||e.length===0?e:` `+e).join(` -`));case`join`:case`string`:return e;case`int`:{let t=parseInt(e.value,10);return new M(isNaN(t)?0:t)}case`float`:{let t=parseFloat(e.value);return new N(isNaN(t)?0:t)}default:throw Error(`Unknown StringValue filter: ${r.value}`)}else if(e instanceof M||e instanceof N)switch(r.value){case`abs`:return e instanceof M?new M(Math.abs(e.value)):new N(Math.abs(e.value));case`int`:return new M(Math.floor(e.value));case`float`:return new N(e.value);case`string`:return new P(e.toString());default:throw Error(`Unknown NumericValue filter: ${r.value}`)}else if(e instanceof Ms)switch(r.value){case`items`:return new I(Array.from(e.value.entries()).map(([e,t])=>new I([new P(e),t])));case`length`:return new M(e.value.size);default:{let t=e.builtins.get(r.value);if(t)return t instanceof L?t.value([],n):t;throw Error(`Unknown ObjectValue filter: ${r.value}`)}}else if(e instanceof F)switch(r.value){case`bool`:return new F(e.value);case`int`:return new M(+!!e.value);case`float`:return new N(+!!e.value);case`string`:return new P(e.value?`true`:`false`);default:throw Error(`Unknown BooleanValue filter: ${r.value}`)}throw Error(`Cannot apply filter "${r.value}" to type: ${e.type}`)}if(t.type===`CallExpression`){let r=t;if(r.callee.type!==`Identifier`)throw Error(`Unknown filter: ${r.callee.type}`);let i=r.callee.value;if(i===`tojson`){let[,t]=this.evaluateArguments(r.args,n),i=t.get(`indent`)??new R;if(!(i instanceof M||i instanceof R))throw Error(`If set, indent must be a number`);let a=t.get(`ensure_ascii`)??new F(!1);if(!(a instanceof F))throw Error(`If set, ensure_ascii must be a boolean`);let o=t.get(`sort_keys`)??new F(!1);if(!(o instanceof F))throw Error(`If set, sort_keys must be a boolean`);let s=t.get(`separators`)??new R,c=null;if(s instanceof I||s instanceof Fs){if(s.value.length!==2)throw Error(`separators must be a tuple of two strings`);let[e,t]=s.value;if(!(e instanceof P)||!(t instanceof P))throw Error(`separators must be a tuple of two strings`);c=[e.value,t.value]}else if(!(s instanceof R))throw Error(`If set, separators must be a tuple of two strings`);return new P(js(e,{indent:i.value,ensureAscii:a.value,sortKeys:o.value,separators:c}))}if(i===`join`){let t;if(e instanceof P)t=Array.from(e.value);else if(e instanceof I)t=e.value.map(e=>e.value);else throw Error(`Cannot apply filter "${i}" to type: ${e.type}`);let[a,o]=this.evaluateArguments(r.args,n),s=a.at(0)??o.get(`separator`)??new P(``);if(!(s instanceof P))throw Error(`separator must be a string`);return new P(t.join(s.value))}if(i===`int`||i===`float`){let[t,a]=this.evaluateArguments(r.args,n),o=t.at(0)??a.get(`default`)??(i===`int`?new M(0):new N(0));if(e instanceof P){let t=i===`int`?parseInt(e.value,10):parseFloat(e.value);return isNaN(t)?o:i===`int`?new M(t):new N(t)}if(e instanceof M||e instanceof N)return e;if(e instanceof F)return i===`int`?new M(+!!e.value):new N(+!!e.value);throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}if(i==="default"){let[t,i]=this.evaluateArguments(r.args,n),a=t[0]??new P(``),o=t[1]??i.get(`boolean`)??new F(!1);if(!(o instanceof F))throw Error("`default` filter flag must be a boolean");return e instanceof z||o.value&&!e.__bool__().value?a:e}if(e instanceof I){switch(i){case`sort`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);let o=t.at(1)??i.get(`case_sensitive`)??new F(!1);if(!(o instanceof F))throw Error(`case_sensitive must be a boolean`);let s=t.at(2)??i.get(`attribute`)??new R;if(!(s instanceof P||s instanceof M||s instanceof R))throw Error(`attribute must be a string, integer, or null`);let c=e=>s instanceof R?e:Us(e,s instanceof M?String(s.value):s.value);return new I(e.value.slice().sort((e,t)=>{let n=Ws(c(e),c(t),o.value);return a.value?-n:n}))}case`selectattr`:case`rejectattr`:{let t=i===`selectattr`;if(e.value.some(e=>!Bs(e)))throw Error(`\`${i}\` can only be applied to array of objects`);if(r.args.some(e=>e.type!==`StringLiteral`))throw Error(`arguments of \`${i}\` must be strings`);let[a,o,s]=r.args.map(e=>this.evaluate(e,n)),c;if(o){let e=n.tests.get(o.value);if(!e)throw Error(`Unknown test: ${o.value}`);c=e}else c=(...e)=>e[0].__bool__().value;return new I(e.value.filter(e=>{let n=e.value.get(a.value),r=n?c(n,s):!1;return t?r:!r}))}case`map`:{let[,t]=this.evaluateArguments(r.args,n);if(t.has(`attribute`)){let n=t.get(`attribute`);if(!(n instanceof P))throw Error(`attribute must be a string`);let r=t.get(`default`);return new I(e.value.map(e=>{if(!Bs(e))throw Error(`items in map must be an object`);let t=Us(e,n.value);return t instanceof z?r??new z:t}))}throw Error("`map` expressions without `attribute` set are not currently supported.")}}throw Error(`Unknown ArrayValue filter: ${i}`)}if(e instanceof P){switch(i){case`indent`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`width`)??new M(4);if(!(a instanceof M))throw Error(`width must be a number`);let o=t.at(1)??i.get(`first`)??new F(!1),s=t.at(2)??i.get(`blank`)??new F(!1),c=e.value.split(` -`),l=` `.repeat(a.value);return new P(c.map((e,t)=>!o.value&&t===0||!s.value&&e.length===0?e:l+e).join(` -`))}case`replace`:{let t=e.builtins.get(`replace`);if(!(t instanceof L))throw Error(`replace filter not available`);let[i,a]=this.evaluateArguments(r.args,n);return t.value([...i,new Ns(a)],n)}}throw Error(`Unknown StringValue filter: ${i}`)}if(e instanceof Ms){let t=e.builtins.get(i);if(t&&t instanceof L){let[e,i]=this.evaluateArguments(r.args,n);return i.size>0&&e.push(new Ns(i)),t.value(e,n)}throw Error(`Unknown ObjectValue filter: ${i}`)}throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}throw Error(`Unknown filter: ${t.type}`)}evaluateFilterExpression(e,t){let n=this.evaluate(e.operand,t);return this.applyFilter(n,e.filter,t)}evaluateTestExpression(e,t){let n=this.evaluate(e.operand,t),r=t.tests.get(e.test.value);if(!r)throw Error(`Unknown test: ${e.test.value}`);let i=r(n);return new F(e.negate?!i:i)}evaluateSelectExpression(e,t){return this.evaluate(e.test,t).__bool__().value?this.evaluate(e.lhs,t):new z}evaluateUnaryExpression(e,t){let n=this.evaluate(e.argument,t);switch(e.operator.value){case`not`:return new F(!n.value);case`+`:case`-`:{let t=e.operator.value===`-`?-1:1;if(n instanceof M||n instanceof N||n instanceof F){let e=t*(n instanceof F?+!!n.value:n.value);return n instanceof N?new N(e):new M(e)}throw SyntaxError(`Unknown operator "${e.operator.value}" for ${n.type}`)}default:throw SyntaxError(`Unknown operator: ${e.operator.value}`)}}evaluateTernaryExpression(e,t){return this.evaluate(e.condition,t).__bool__().value?this.evaluate(e.trueExpr,t):this.evaluate(e.falseExpr,t)}evalProgram(e,t){return this.evaluateBlock(e.body,t)}evaluateBlock(e,t){let n=``;for(let r of e){let e=this.evaluate(r,t);e.type!==`NullValue`&&e.type!==`UndefinedValue`&&(n+=e.toString())}return new P(n)}evaluateIdentifier(e,t){return t.lookupVariable(e.value)}evaluateCallExpression(e,t){let[n,r]=this.evaluateArguments(e.args,t);r.size>0&&n.push(new Ns(r));let i=this.evaluate(e.callee,t);if(i.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${i.type}`);return i.value(n,t)}evaluateSliceExpression(e,t,n){if(!(e instanceof I||e instanceof P))throw Error(`Slice object must be an array or string`);let r=this.evaluate(t.start,n),i=this.evaluate(t.stop,n),a=this.evaluate(t.step,n);if(!(r instanceof M||r instanceof z))throw Error(`Slice start must be numeric or undefined`);if(!(i instanceof M||i instanceof z))throw Error(`Slice stop must be numeric or undefined`);if(!(a instanceof M||a instanceof z))throw Error(`Slice step must be numeric or undefined`);return e instanceof I?new I(ys(e.value,r.value,i.value,a.value)):new P(ys(Array.from(e.value),r.value,i.value,a.value).join(``))}evaluateMemberExpression(e,t){let n=this.evaluate(e.object,t),r;if(e.computed){if(e.property.type===`SliceExpression`)return this.evaluateSliceExpression(n,e.property,t);r=this.evaluate(e.property,t)}else r=e.property.type===`IntegerLiteral`?new M(e.property.value):new P(e.property.value);let i;if(Bs(n)){if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.value.get(r.value)??(n instanceof Ms?n.builtins.get(r.value):void 0)}else if(n instanceof I||n instanceof P){if(r instanceof M)i=n.value.at(r.value),n instanceof P&&(i=new P(n.value.at(r.value)));else if(r instanceof P)i=n.builtins.get(r.value);else throw Error(`Cannot access property with non-string/non-number: got ${r.type}`)}else{if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.builtins.get(r.value)}return i instanceof Os?i:new z}evaluateSet(e,t){let n=e.value?this.evaluate(e.value,t):this.evaluateBlock(e.body,t);if(e.assignee.type===`Identifier`){let r=e.assignee.value;t.setVariable(r,n)}else if(e.assignee.type===`TupleLiteral`){let r=e.assignee;if(!(n instanceof I))throw Error(`Cannot unpack non-iterable type in set: ${n.type}`);let i=n.value;if(i.length!==r.value.length)throw Error(`Too ${r.value.length>i.length?`few`:`many`} items to unpack in set`);for(let e=0;et.setVariable(e.loopvar.value,c);else if(e.loopvar.type===`TupleLiteral`){let t=e.loopvar;if(c.type!==`ArrayValue`)throw Error(`Cannot unpack non-iterable type: ${c.type}`);let n=c;if(t.value.length!==n.value.length)throw Error(`Too ${t.value.length>n.value.length?`few`:`many`} items to unpack`);l=e=>{for(let r=0;r0?a[t-1]:new z],[`nextitem`,t0)throw Error(`macro ${e} takes no keyword argument '${o.keys().next().value}'`);if(n.has(`varargs`))i.setVariable(`varargs`,new I(a.slice(t.length)));else if(a.length>t.length)throw Error(`macro ${e} takes not more than ${t.length} argument(s)`);for(let[e,t]of s)i.setVariable(e,this.evaluate(t,i))}evaluateMacro(e,t){let n=qs(e.args,e.body);return t.setVariable(e.name.value,new L((t,r)=>{let i=new Rs(r);return this.bindMacroArguments(`'${e.name.value}'`,e.args,n,t,i),this.evaluateBlock(e.body,i)})),new R}evaluateCallStatement(e,t){let n=e.callerArgs??[],r=qs(n,e.body),i=new L(i=>{let a=new Rs(t);return this.bindMacroArguments(`None`,n,r,i,a),this.evaluateBlock(e.body,a)}),[a,o]=this.evaluateArguments(e.call.args,t);a.push(new Ns(o));let s=this.evaluate(e.call.callee,t);if(s.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${s.type}`);let c=new Rs(t);return c.setVariable(`caller`,i),s.value(a,c)}evaluateFilterStatement(e,t){let n=this.evaluateBlock(e.body,t);return this.applyFilter(n,e.filter,t)}evaluate(e,t){if(!e)return new z;switch(e.type){case`Program`:return this.evalProgram(e,t);case`Set`:return this.evaluateSet(e,t);case`If`:return this.evaluateIf(e,t);case`For`:return this.evaluateFor(e,t);case`Macro`:return this.evaluateMacro(e,t);case`CallStatement`:return this.evaluateCallStatement(e,t);case`Break`:throw new Ts;case`Continue`:throw new Es;case`IntegerLiteral`:return new M(e.value);case`FloatLiteral`:return new N(e.value);case`StringLiteral`:return new P(e.value);case`ArrayLiteral`:return new I(e.value.map(e=>this.evaluate(e,t)));case`TupleLiteral`:return new Fs(e.value.map(e=>this.evaluate(e,t)));case`ObjectLiteral`:{let n=/* @__PURE__ */ new Map;for(let[r,i]of e.value){let e=this.evaluate(r,t);if(!(e instanceof P))throw Error(`Object keys must be strings: got ${e.type}`);n.set(e.value,this.evaluate(i,t))}return new Ms(n)}case`Identifier`:return this.evaluateIdentifier(e,t);case`CallExpression`:return this.evaluateCallExpression(e,t);case`MemberExpression`:return this.evaluateMemberExpression(e,t);case`UnaryExpression`:return this.evaluateUnaryExpression(e,t);case`BinaryExpression`:return this.evaluateBinaryExpression(e,t);case`FilterExpression`:return this.evaluateFilterExpression(e,t);case`FilterStatement`:return this.evaluateFilterStatement(e,t);case`TestExpression`:return this.evaluateTestExpression(e,t);case`SelectExpression`:return this.evaluateSelectExpression(e,t);case`Ternary`:return this.evaluateTernaryExpression(e,t);case`Comment`:return new R;default:throw SyntaxError(`Unknown node type: ${e.type}`)}}};function Ys(e){switch(typeof e){case`number`:return Number.isInteger(e)?new M(e):new N(e);case`string`:return new P(e);case`boolean`:return new F(e);case`undefined`:return new z;case`object`:return e===null?new R:Array.isArray(e)?new I(e.map(Ys)):new Ms(new Map(Object.entries(e).map(([e,t])=>[e,Ys(t)])));case`function`:return new L((t,n)=>Ys(e(...t.map(e=>e.value))??null));default:throw Error(`Cannot convert to runtime value: ${e}`)}}var Xs=` -`,Zs=`{%- `,Qs=` -%}`,$s=Object.freeze({CONDITIONAL:0,LOGICAL_OR:1,LOGICAL_AND:2,LOGICAL_NOT:3,COMPARISON:4,ADDITIVE:5,MULTIPLICATIVE:6,EXPONENTIATION:7,TEST:8,FILTER:9,UNARY_SIGN:10,ATOM:11});function ec(e){switch(e.operator.type){case`ExponentiationBinaryOperator`:return $s.EXPONENTIATION;case`MultiplicativeBinaryOperator`:return $s.MULTIPLICATIVE;case`AdditiveBinaryOperator`:return $s.ADDITIVE;case`ComparisonBinaryOperator`:return $s.COMPARISON;case`Identifier`:return e.operator.value===`and`?$s.LOGICAL_AND:e.operator.value===`in`||e.operator.value===`not in`?$s.COMPARISON:$s.LOGICAL_OR}return $s.LOGICAL_OR}function tc(e){switch(e.type){case`SelectExpression`:case`Ternary`:return $s.CONDITIONAL;case`BinaryExpression`:return ec(e);case`UnaryExpression`:return e.operator.value===`not`?$s.LOGICAL_NOT:$s.UNARY_SIGN;case`TestExpression`:return $s.TEST;case`FilterExpression`:return $s.FILTER;default:return $s.ATOM}}function nc(e,t){let n=B(e);return tc(e)sc(e,t,n)).join(Xs)}function oc(e){return e.map(e=>B(e)).join(`, `)}function sc(e,t,n){let r=n.repeat(t);switch(e.type){case`Program`:return ac(e.body,t,n);case`If`:return cc(e,t,n);case`For`:return lc(e,t,n);case`Set`:return uc(e,t,n);case`Macro`:return dc(e,t,n);case`Break`:return r+ic(`break`);case`Continue`:return r+ic(`continue`);case`CallStatement`:return fc(e,t,n);case`FilterStatement`:return pc(e,t,n);case`Comment`:return r+`{# `+e.value+` #}`;default:return r+`{{- `+B(e)+` -}}`}}function cc(e,t,n){let r=n.repeat(t),i=[],a=e;for(;a&&(i.push({test:a.test,body:a.body}),a.alternate.length===1&&a.alternate[0].type===`If`);)a=a.alternate[0];let o=r+ic(`if`,B(i[0].test))+Xs+ac(i[0].body,t+1,n);for(let e=1;e0&&(o+=Xs+r+ic(`else`)+Xs+ac(a.alternate,t+1,n)),o+=Xs+r+ic(`endif`),o}function lc(e,t,n){let r=n.repeat(t),i=``;if(e.iterable.type===`SelectExpression`){let t=e.iterable;i=`${B(t.lhs)} if ${B(t.test)}`}else i=B(e.iterable);let a=r+ic(`for`,B(e.loopvar),`in`,i)+Xs+ac(e.body,t+1,n);return e.defaultBlock.length>0&&(a+=Xs+r+ic(`else`)+Xs+ac(e.defaultBlock,t+1,n)),a+=Xs+r+ic(`endfor`),a}function uc(e,t,n){let r=n.repeat(t),i=B(e.assignee),a=e.value?B(e.value):``,o=r+ic(`set`,`${i}${e.value?` = `+a:``}`);return e.body.length===0?o:o+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endset`)}function dc(e,t,n){let r=n.repeat(t),i=oc(e.args);return r+ic(`macro`,`${e.name.value}(${i})`)+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endmacro`)}function fc(e,t,n){let r=n.repeat(t),i=e.callerArgs&&e.callerArgs.length>0?`(${oc(e.callerArgs)})`:``,a=B(e.call),o=r+ic(`call${i}`,a)+Xs;return o+=ac(e.body,t+1,n)+Xs,o+=r+ic(`endcall`),o}function pc(e,t,n){let r=n.repeat(t),i=r+ic(`filter`,e.filter.type===`Identifier`?e.filter.value:B(e.filter))+Xs;return i+=ac(e.body,t+1,n)+Xs,i+=r+ic(`endfilter`),i}function B(e){switch(e.type){case`SpreadExpression`:return`*${B(e.argument)}`;case`KeywordSpreadExpression`:return`**${B(e.argument)}`;case`Identifier`:return e.value;case`IntegerLiteral`:return`${e.value}`;case`FloatLiteral`:{let t=e.value;return Object.is(t,-0)?`-0.0`:t%1==0?t.toFixed(1):t.toString()}case`StringLiteral`:return JSON.stringify(e.value);case`BinaryExpression`:{let t=e,n=ec(t),r=nc(t.left,n),i=nc(t.right,n+1);return`${r} ${t.operator.value} ${i}`}case`UnaryExpression`:{let t=e,n=t.argument.type===`UnaryExpression`?tc(t):$s.ATOM;return t.operator.value+(t.operator.value===`not`?` `:``)+nc(t.argument,n)}case`CallExpression`:{let t=e,n=oc(t.args);return`${B(t.callee)}(${n})`}case`MemberExpression`:{let t=e,n=nc(t.object,$s.ATOM),r=B(t.property);return!t.computed&&t.property.type!==`Identifier`&&t.property.type!==`IntegerLiteral`&&(r=`(${r})`),t.computed?`${n}[${r}]`:`${n}.${r}`}case`FilterExpression`:{let t=e,n=nc(t.operand,$s.FILTER);return t.filter.type===`CallExpression`?`${n} | ${B(t.filter)}`:`${n} | ${t.filter.value}`}case`SelectExpression`:{let t=e;return`${nc(t.lhs,$s.LOGICAL_OR)} if ${nc(t.test,$s.LOGICAL_OR)}`}case`TestExpression`:{let t=e;return`${nc(t.operand,$s.TEST)} is${t.negate?` not`:``} ${t.test.value}`}case`ArrayLiteral`:case`TupleLiteral`:{let t=oc(e.value),n=e.type===`ArrayLiteral`?`[]`:`()`;return`${n[0]}${t}${n[1]}`}case`ObjectLiteral`:return`{${Array.from(e.value.entries()).map(([e,t])=>`${B(e)}: ${B(t)}`).join(`, `)}}`;case`SliceExpression`:{let t=e;return`${t.start?B(t.start):``}:${t.stop?B(t.stop):``}${t.step?`:${B(t.step)}`:``}`}case`KeywordArgumentExpression`:{let t=e;return`${t.key.value}=${B(t.value)}`}case`Ternary`:{let t=e;return`${nc(t.trueExpr,$s.LOGICAL_OR)} if ${nc(t.condition,$s.LOGICAL_OR)} else ${nc(t.falseExpr,$s.CONDITIONAL)}`}default:throw Error(`Unknown expression type: ${e.type}`)}}var mc=class{parsed;constructor(e){let t=Ro(e,{lstrip_blocks:!0,trim_blocks:!0});this.parsed=_s(t)}render(e){let t=new Rs;if(zs(t),e)for(let[n,r]of Object.entries(e))t.set(n,r);return new Js(t).run(this.parsed).value}format(e){return rc(this.parsed,e?.indent||` `)}},hc={txt:`text/plain`,html:`text/html`,css:`text/css`,js:`text/javascript`,json:`application/json`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`},gc=class e{constructor(e){if(this.filePath=e,this.headers=new Headers,this.exists=Cr.existsSync(e),this.exists){this.status=200,this.statusText=`OK`;let t=Cr.statSync(e);this.headers.set(`content-length`,t.size.toString()),this.updateContentType();let n=Cr.createReadStream(e);this.body=new ReadableStream({start(e){n.on(`data`,t=>e.enqueue(t)),n.on(`end`,()=>e.close()),n.on(`error`,t=>e.error(t))},cancel(){n.destroy()}})}else this.status=404,this.statusText=`Not Found`,this.body=null}updateContentType(){let e=this.filePath.toString().split(`.`).pop().toLowerCase();this.headers.set(`content-type`,hc[e]??`application/octet-stream`)}clone(){let t=new e(this.filePath);return t.exists=this.exists,t.status=this.status,t.statusText=this.statusText,t.headers=new Headers(this.headers),t}async arrayBuffer(){return(await Cr.promises.readFile(this.filePath)).buffer}async blob(){let e=await Cr.promises.readFile(this.filePath);return new Blob([e],{type:this.headers.get(`content-type`)})}async text(){return await Cr.promises.readFile(this.filePath,`utf8`)}async json(){return JSON.parse(await this.text())}},_c=class{constructor(e){this._mt=/* @__PURE__ */ new Uint32Array(624),this._idx=625,this._gauss_next=null,this._random_fn=this.random.bind(this),this.seed(e)}seed(e){if(e==null){if(O.IS_CRYPTO_AVAILABLE){let t=/* @__PURE__ */ new Uint32Array(1);crypto.getRandomValues(t),e=t[0]}else e=Date.now()>>>0}let t=this._mt,n=(e,t)=>Math.imul(e,t)>>>0,r=[];for(let t=e||0;t>0;t=Math.floor(t/4294967296))r.push(t&4294967295);r.length||r.push(0),t[0]=19650218;for(let e=1;e<624;++e)t[e]=n(1812433253,t[e-1]^t[e-1]>>>30)+e>>>0;let i=1,a=0;for(let e=Math.max(624,r.length);e>0;--e,++i,++a)i>=624&&(t[0]=t[623],i=1),a>=r.length&&(a=0),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1664525))+r[a]+a>>>0;for(let e=623;e>0;--e,++i)i>=624&&(t[0]=t[623],i=1),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1566083941))-i>>>0;t[0]=2147483648,this._idx=624,this._gauss_next=null}_int32(){let e=this._mt;if(this._idx>=624){for(let t=0;t<624;++t){let n=e[t]&2147483648|e[(t+1)%624]&2147483647;e[t]=(e[(t+397)%624]^n>>>1^(n&1?2567483615:0))>>>0}this._idx=0}let t=e[this._idx++];return t^=t>>>11,t^=t<<7&2636928640,t^=t<<15&4022730752,t^=t>>>18,t>>>0}random(){return((this._int32()>>>5)*67108864+(this._int32()>>>6))/9007199254740992}gauss(e=0,t=1){let n=this._gauss_next;if(this._gauss_next=null,n===null){let e=this.random()*2*Math.PI,t=Math.sqrt(-2*Math.log(1-this.random()));n=Math.cos(e)*t,this._gauss_next=Math.sin(e)*t}return e+n*t}shuffle(e){for(let t=e.length-1;t>0;--t){let n=32-Math.clz32(t+1),r=this._int32()>>>32-n;for(;r>t;)r=this._int32()>>>32-n;let i=e[t];e[t]=e[r],e[r]=i}}choices(e,t){return e[vc(this._random_fn,t)]}};function vc(e,t){let n=0;for(let e=0;evc(bc.random,e),Sc=new _c,Cc=class{constructor(e){this.path=e}async match(e){let t=new gc(wr.join(this.path,e));if(t.exists)return t}async put(e,t,n=void 0){let r=wr.join(this.path,e),i=r+`.tmp.${O.IS_PROCESS_AVAILABLE?process.pid:Date.now()}.${Sc._int32().toString(36)}`;try{let e=t.headers.get(`Content-Length`),a=parseInt(e??`0`),o=0;await Cr.promises.mkdir(wr.dirname(r),{recursive:!0});let s=Cr.createWriteStream(i),c=t.body.getReader();for(;;){let{done:e,value:t}=await c.read();if(e)break;await new Promise((e,n)=>{s.write(t,t=>{if(t){n(t);return}e()})}),o+=t.length;let r=a?o/a*100:0;n?.({progress:r,loaded:o,total:a})}await new Promise((e,t)=>{s.close(n=>n?t(n):e())}),await Cr.promises.rename(i,r)}catch(e){try{await Cr.promises.unlink(i)}catch{}throw e}}async delete(e){let t=wr.join(this.path,e);try{return await Cr.promises.unlink(t),!0}catch{return!1}}},wc={400:`Bad request error occurred while trying to load file`,401:`Unauthorized access to file`,403:`Forbidden access to file`,404:`Could not locate file`,408:`Request timeout error occurred while trying to load file`,500:`Internal server error error occurred while trying to load file`,502:`Bad gateway error occurred while trying to load file`,503:`Service unavailable error occurred while trying to load file`,504:`Gateway timeout error occurred while trying to load file`},Tc=100,Ec=/^(\b[\w\-.]+\b\/)?\b[\w\-.]{1,96}\b$/;function Dc(...e){return e=e.map((t,n)=>(n&&(t=t.replace(/* @__PURE__ */ RegExp(`^/`),``)),n!==e.length-1&&(t=t.replace(/* @__PURE__ */ RegExp(`/$`),``)),t)),e.join(`/`)}function Oc(e,t=null,n=null){let r;try{r=new URL(e)}catch{return!1}return!(t&&!t.includes(r.protocol)||n&&!n.includes(r.hostname))}function kc(e){return!(!Ec.test(e)||e.includes(`..`)||e.includes(`--`)||e.endsWith(`.git`)||e.endsWith(`.ipynb`))}function Ac(e,t={},...n){return JSON.stringify([e,t.revision??`main`,t.cache_dir??null,t.local_files_only??!1,...n])}var jc=class extends Error{constructor(e,{status:t=null}={}){super(e),this.name=`ModelFileNotFoundError`,this.status=t}},Mc=/* @__PURE__ */ new Set([401,403,404]);function Nc(e,t,n){if(!n)return null;let r=`${wc[e]??`Error (${e}) occurred while trying to load file`}: "${t}".`;throw Mc.has(e)?new jc(r,{status:e}):Error(r)}async function Pc(e,t,n){let r=e.headers.get(`Content-Length`),i=r?parseInt(r,10):n??0;r===null&&!n&&A.warn(`Unable to determine content-length from response headers. Will expand buffer when needed.`);let a=new Uint8Array(i),o=0,s=e.body.getReader();async function c(){let{done:e,value:n}=await s.read();if(e)return;let r=o+n.length;if(r>i){i=r;let e=new Uint8Array(i);e.set(a),a=e}return a.set(n,o),o=r,t({progress:o/i*100,loaded:o,total:i}),c()}return await c(),a}function Fc(e){return Oc(e,[`blob:`])}function Ic(e,{allowUnresolved:t=!1}={}){let n;if(typeof location<`u`&&location.href)n=location.href;else if(import.meta.url)n=import.meta.url;else return e;try{return new URL(e,n).href}catch(n){if(!t)throw n;return e}}var Lc=`SHA-256`,Rc=`experimental_transformers-hash-cache`,zc=e=>({algorithm:Lc,value:e}),Bc=class{#e=null;_getHashCache=()=>(this.#e??=caches.open(Rc),this.#e);static isAvailable=()=>typeof navigator<`u`&&`crossOriginStorage`in navigator;match=async e=>{let t=await this._getFileHash(e);if(t)try{let e=await(await navigator.crossOriginStorage.requestFileHandle(zc(t))).getFile();return new Response(e,{headers:{"Content-Length":String(e.size)}})}catch{return}};put=async(e,t)=>{let n=await this._getFileHash(e);if(n){let e=await t.blob();await this._storeBlobInCOS(e,n)}else this._processAndStore(e,t.body)};_storeBlobInCOS=async(e,t)=>{let n=await(await navigator.crossOriginStorage.requestFileHandle(zc(t),{create:!0,origins:`*`})).createWritable();await n.write(e),await n.close()};_processAndStore=async(e,t)=>{try{let n=[];for await(let e of t)n.push(e);let r=new Blob(n),i=await this._getBlobHash(r);await this._storeBlobInCOS(r,i);try{await(await this._getHashCache()).put(e,new Response(i))}catch{}}catch{}};delete=async e=>{try{return await(await this._getHashCache()).delete(e)}catch{return!1}};_getFileHash=async e=>{try{let t=await this._getHashCache(),n=await t.match(e);if(n)return n.text();let r=await this._getLfsFileHash(e);return r?(await t.put(e,new Response(r)),r):null}catch{return null}};_getLfsFileHash=async e=>{if(!e.includes(`/resolve/`))return null;let t=e.replace(`/resolve/`,`/raw/`);try{let e=(await fetch(t).then(e=>e.text())).match(/^oid sha256:([0-9a-f]+)$/m);return e?e[1]:null}catch{return null}};_getBlobHash=async e=>{let t=await e.arrayBuffer(),n=await crypto.subtle.digest(Lc,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}};async function Vc(e=null){let t=null;if(k.useCustomCache){if(!k.customCache)throw Error("`env.useCustomCache=true`, but `env.customCache` is not defined.");if(!k.customCache.match||!k.customCache.put)throw Error("`env.customCache` must be an object which implements the `match` and `put` functions of the Web Cache API. For more information, see https://developer.mozilla.org/en-US/docs/Web/API/Cache");t=k.customCache}if(!t&&k.experimental_useCrossOriginStorage&&Bc.isAvailable()&&(t=new Bc),!t&&k.useBrowserCache){if(typeof caches>`u`)throw Error(`Browser cache is not available in this environment.`);try{t=await caches.open(k.cacheKey)}catch(e){A.warn(`An error occurred while opening the browser cache:`,e)}}if(!t&&k.useFSCache){if(!O.IS_FS_AVAILABLE)throw Error(`File System Cache is not available in this environment.`);t=new Cc(e??k.cacheDir)}return t}async function Hc(e,...t){for(let n of t)try{let t=await e.match(n);if(t)return t}catch{continue}}var Uc=new class{#e;#t;constructor(e){this.#e=e,this.#t=/* @__PURE__ */ new Map}get(e){if(!this.#t.has(e))return;let t=this.#t.get(e);return this.#t.delete(e),this.#t.set(e,t),t}put(e,t){this.#t.has(e)&&this.#t.delete(e),this.#t.set(e,t),this.#t.size>this.#e&&this.#t.delete(this.#t.keys().next().value)}delete(e){return this.#t.delete(e)}clear(){this.#t.clear()}}(100);function Wc(e,t){let n=Uc.get(e);if(n!==void 0)return n;let r=t().then(e=>e,t=>(Uc.delete(e),Promise.reject(t)));return Uc.put(e,r),r}async function Gc(e){if(!Oc(e,[`http:`,`https:`]))return null;let t=Yc(e);return t.set(`Range`,`bytes=0-0`),k.fetch(e,{method:`GET`,headers:t,cache:`no-store`})}function Kc(e,t,n={}){return Wc(Ac(e,n,t),()=>qc(e,t,n))}async function qc(e,t,n){let r=await Vc(n?.cache_dir),{localPath:i,remoteURL:a,proposedCacheKey:o,validModelId:s}=Xc(e,t,n,r),c=await Zc(r,i,o);if(c!==void 0&&typeof c!=`string`){let e=c.headers.get(`content-length`),t=c.headers.get(`content-type`);return{exists:!0,size:e?parseInt(e,10):void 0,contentType:t||void 0,fromCache:!0}}if(k.allowLocalModels&&!Oc(i,[`http:`,`https:`]))try{let e=await Jc(i);if(typeof e!=`string`&&e.status!==404){let t=e.headers.get(`content-length`),n=e.headers.get(`content-type`);return{exists:!0,size:t?parseInt(t,10):void 0,contentType:n||void 0,fromCache:!1}}}catch{}if(k.allowRemoteModels&&!n.local_files_only&&s){let e=await Gc(a);if(e&&e.status>=200&&e.status<300){let t,n=e.headers.get(`content-type`);if(e.status===206){let n=e.headers.get(`content-range`);if(n){let e=n.match(/bytes \d+-\d+\/(\d+)/);e&&(t=parseInt(e[1],10))}}else if(e.status===200)try{await e.body?.cancel()}catch{}if(t===void 0){let n=e.headers.get(`content-length`);t=n?parseInt(n,10):void 0}return{exists:!0,size:t,contentType:n||void 0,fromCache:!1}}e&&e.status!==404&&e.status!==416&&Nc(e.status,a,!0)}return{exists:!1,fromCache:!1}}async function Jc(e){return k.useFS&&!Oc(e,[`http:`,`https:`,`blob:`])?new gc(e instanceof URL?e.protocol===`file:`?e.pathname:e.toString():e):k.fetch(e,{headers:Yc(e)})}function Yc(e){let t=typeof process<`u`&&process?.release?.name===`node`,n=new Headers;if(t){let t=!!{}.TESTING_REMOTELY,r=k.version;if(n.set(`User-Agent`,`transformers.js/${r}; is_ci/${t};`),Oc(e,[`http:`,`https:`],[`huggingface.co`,`hf.co`])){let e={}.HF_TOKEN??{}.HF_ACCESS_TOKEN;e&&n.set(`Authorization`,`Bearer ${e}`)}}return n}function Xc(e,t,n={},r=null){let i=n.revision??`main`,a=Dc(e,t),o=kc(e),s=o?Dc(k.localModelPath,a):a,c=Dc(k.remoteHost,k.remotePathTemplate.replaceAll(`{model}`,e).replaceAll(`{revision}`,encodeURIComponent(i)),t);return{requestURL:a,localPath:s,remoteURL:c,proposedCacheKey:r instanceof Cc?i===`main`?a:Dc(e,i,t):c,validModelId:o}}async function Zc(e,t,n){if(e)return await Hc(e,t,n)}async function Qc(e,t,n,r,i,a,o={}){if(await n.match(r)===void 0&&!(typeof Cache<`u`&&n instanceof Cache&&!Oc(Ic(r,{allowUnresolved:!0}),[`http:`,`https:`]))){if(!a){let a=o.progress_callback?n=>ei(o.progress_callback,{status:`progress`,name:e,file:t,...n}):void 0;await n.put(r,i,a)}else if(typeof i!=`string`){let e=new Headers(i.headers);e.set(`content-length`,a.byteLength.toString()),await n.put(r,new Response(a,{headers:e})).catch(e=>{A.warn(`Unable to add response to browser cache: ${e}.`)})}}}async function $c(e,t,n=!0,r={},i=!1,a=null){let{requestURL:o,localPath:s,remoteURL:c,proposedCacheKey:l,validModelId:u}=Xc(e,t,r,a),d,f=!1,p;p=await Zc(a,s,l);let m=p!==void 0;if(m)d=l;else{if(k.allowLocalModels){if(!Oc(o,[`http:`,`https:`]))try{p=await Jc(s),d=s}catch(e){A.warn(`Unable to load from local path "${s}": "${e}"`)}else if(r.local_files_only)throw Error(`\`local_files_only=true\`, but attempted to load a remote file from: ${o}.`);else if(!k.allowRemoteModels)throw Error(`\`env.allowRemoteModels=false\`, but attempted to load a remote file from: ${o}.`)}if(p===void 0||typeof p!=`string`&&p.status===404){if(r.local_files_only||!k.allowRemoteModels){if(n)throw new jc(`\`local_files_only=true\` or \`env.allowRemoteModels=false\` and file was not found locally at "${s}".`);return null}if(!u)throw new jc(`Local file missing at "${s}" and download aborted due to invalid model ID "${e}".`);if(p=await Jc(c),p.status!==200)return Nc(p.status,c,n);d=l}f=a&&typeof Response<`u`&&p instanceof Response&&p.status===200}ei(r.progress_callback,{status:`download`,name:e,file:t});let h;if(!(O.IS_NODE_ENV&&i)){let n;if(typeof p!=`string`){if(!r.progress_callback)n=new Uint8Array(await p.arrayBuffer());else if(m&&typeof navigator<`u`&&/firefox/i.test(navigator.userAgent))n=new Uint8Array(await p.arrayBuffer()),ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n.length,total:n.length});else{let i,a=p.headers.get(`content-length`);if(a)i=parseInt(a,10);else try{let n=await Kc(e,t,r);n.size&&(i=n.size)}catch{}n=await Pc(p,n=>{ei(r.progress_callback,{status:`progress`,name:e,file:t,...n})},i)}}h=n}if(f&&d&&typeof p!=`string`&&await Qc(e,t,a,d,p,h,r),O.IS_NODE_ENV&&i&&r.progress_callback&&typeof p!=`string`){let n=parseInt(p.headers.get(`content-length`),10)||0;ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n,total:n})}if(ei(r.progress_callback,{status:`done`,name:e,file:t}),h){if(!O.IS_NODE_ENV&&i)throw Error(`Cannot return path in a browser environment.`);return h}if(p instanceof gc)return p.filePath;let g=await a?.match(d);if(g instanceof gc)return g.filePath;if(g instanceof Response)return new Uint8Array(await g.arrayBuffer());if(typeof g==`string`)return g;throw Error(`Unable to get model file path or buffer.`)}var el=/* @__PURE__ */ new Map;async function tl(e,t,n=!0,r={},i=!1){if(!k.allowLocalModels){if(r.local_files_only)throw Error("Invalid configuration detected: local models are disabled (`env.allowLocalModels=false`) but you have requested to only use local models (`local_files_only=true`).");if(!k.allowRemoteModels)throw Error("Invalid configuration detected: both local and remote models are disabled. Fix by setting `env.allowLocalModels` or `env.allowRemoteModels` to `true`.")}let a=Ac(e,r,t,n,i),{progress_callback:o}=r,s=o instanceof ti?o.loads:el,c=s.get(a);return c||(ei(o,{status:`initiate`,name:e,file:t}),c=Vc(r.cache_dir).then(a=>$c(e,t,n,r,i,a)),s===el&&(c=c.finally(()=>el.delete(a))),s.set(a,c)),await c}async function nl(e,t,n=!0,r={}){let i=await tl(e,t,n,r,!1);return i===null?null:new TextDecoder(`utf-8`).decode(i)}async function rl(e,t,n=!0,r={}){let i=await nl(e,t,n,r);return i===null?{}:JSON.parse(i)}function il(e,[t,n,r],[i,a],o=`bilinear`,s=!1){let c=a/r,l=i/n,u=new e.constructor(i*a*t),d=n*r,f=i*a;for(let o=0;o=0;--e)i[e]=a,r[e]=t[n[e]],a*=r[e];let a=n.map((e,t)=>i[n.indexOf(t)]),o=new e.constructor(e.length);for(let n=0;n=0;--e)r+=i%t[e]*a[e],i=Math.floor(i/t[e]);o[r]=e[n]}return[o,r]}function ol(e){let t=ll(e)[0],n=e.map(e=>Math.exp(e-t)),r=n.reduce((e,t)=>e+t,0);return n.map(e=>e/r)}function sl(e){let t=ll(e)[0],n=0;for(let r=0;re-t-r)}function cl(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;rt&&(t=e[r],n=r);return[t,n]}function ul(e){return e>0&&!(e&e-1)}var dl=class{constructor(e){if(this.size=e|0,this.size<=1||!ul(this.size))throw Error(`FFT size must be a power of two larger than 1`);this._csize=e<<1,this.table=new Float64Array(this.size*2);for(let e=0;ee;e<<=1)++t;this._width=t%2==0?t-1:t,this._bitrev=new Int32Array(1<>>t&3)<>>1);for(let t=0;t>>1]=e[t];return n}toComplexArray(e,t){let n=t||this.createComplexArray();for(let t=0;t>>1],n[t+1]=0;return n}transform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,1)}realTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._realTransform4(e,t,1)}inverseTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,-1);for(let t=0;t>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>2;for(o=0;o>>1,i>>>1)}else for(o=0,s=0;o>>1,i>>>1,n)}let l=this.table;for(i>>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>1,s=t>>>1,c=s>>>1;for(o=0;o>>1;for(let t=2;t>1;++t){let n=(t+1-e)**2/2,r=Math.sqrt(s**2+c**2)**n,o=n*Math.atan2(c,s),l=2*t;i[l]=r*Math.cos(o),i[l+1]=r*Math.sin(o),a[l]=i[l],a[l+1]=-i[l+1]}this._slicedChirpBuffer=i.subarray(t,n),this._f=new dl(r>>1),this._f.transform(this._chirpBuffer,a)}_transform(e,t,n){let r=this._buffer1,i=this._buffer2,a=this._outBuffer1,o=this._outBuffer2,s=this._chirpBuffer,c=this._slicedChirpBuffer,l=this._a;if(n)for(let e=0;e>1];r[e]=i*c[e],r[n]=i*c[n]}else for(let e=0;e=e.length&&(i=2*(e.length-1)-i),r[a++]=e[i]}r.sort(),n[t]=r[i]}return n}function hl(e,t){let n=10**t;return Math.round(e*n)/n}function gl(e){let t=Math.round(e);return Math.abs(e)%1==.5?t%2==0?t:t-1:t}function _l(e){let t=e.length,n=e[0].length,r=[t+1,n+1],i=Array.from({length:r[0]},()=>Array(r[1]).fill(1/0));i[0][0]=0;let a=Array.from({length:r[0]},()=>Array(r[1]).fill(-1));for(let t=1;t0||s>0;)switch(c.push(o-1),l.push(s-1),a[o][s]){case 0:--o,--s;break;case 1:--o;break;case 2:--s;break;default:throw Error(`Internal error in dynamic time warping. Unexpected trace[${o}, ${s}]. Please file a bug report.`)}return c.reverse(),l.reverse(),[c,l]}var vl=/* @__PURE__ */ (function(){let e=null;return function(t){if(!e){e=/* @__PURE__ */ new Float32Array(65536);let t=/* @__PURE__ */ new ArrayBuffer(4),n=new Uint32Array(t),r=new Float32Array(t);for(let t=0;t>10,s=t&1023;if(o===31)i=a|2139095040|s<<13;else if(o===0){if(s===0)i=a;else{let e=113;for(;!(s&1024);)s<<=1,--e;s&=-1025,i=a|e<<23|s<<13}}else i=a|o+112<<23|s<<13;n[0]=i,e[t]=r[0]}}let n=t.length,r=e,i=new Float32Array(n);for(let e=0;e[`webgpu`,`cuda`,`dml`,`webnn-gpu`].includes(e))}if(El.includes(e))return[Cl[e]??e];throw Error(`Unsupported device: "${e}". Should be one of: ${El.join(`, `)}.`)}var Ml=Promise.resolve(),Nl=null;async function Pl(){if(Nl)return Nl;if(!(k.useWasmCache&&typeof zl?.wasm?.wasmPaths==`object`&&zl?.wasm?.wasmPaths?.wasm&&zl?.wasm?.wasmPaths?.mjs)){if(O.IS_DENO_WEB_RUNTIME)throw Error(`env.useWasmCache=false is not supported in Deno's web runtime. Remove the useWasmCache override.`);return Nl=Promise.resolve(),Nl}return Nl=(async()=>{let e=zl.wasm.wasmPaths,t=!1;await Promise.all([e.wasm&&!Fc(e.wasm)?(async()=>{try{let n=await xl(Ic(e.wasm));n&&(zl.wasm.wasmBinary=n,t=!0)}catch(e){A.warn(`Failed to pre-load WASM binary:`,e)}})():Promise.resolve(),e.mjs&&!Fc(e.mjs)?(async()=>{try{let t=await Sl(Ic(e.mjs));t&&(zl.wasm.wasmPaths.mjs=t)}catch(e){A.warn(`Failed to pre-load WASM factory:`,e)}})():Promise.resolve()]),t||(zl.wasm.wasmPaths.mjs=e.mjs)})(),Nl}async function Fl(e,t,n){await Pl();let r=wl(k.logLevel??Xr.WARNING),i=()=>Al.create(e,{logSeverityLevel:r,...t}),a=await(O.IS_WEB_ENV?Ml=Ml.then(i):i());return a.config=n,a}var Il=Promise.resolve();async function Ll(e,t){let n=()=>e.run(t);return O.IS_WEB_ENV?Il=Il.then(n):n()}function Rl(e){return e instanceof Ol.Tensor}var zl=Ol?.env;function Bl(){return zl?.wasm?.proxy}if(zl){let e=function(e){zl.logLevel=Tl[wl(e)]};if(zl.wasm){if(!(typeof ServiceWorkerGlobalScope<`u`&&self instanceof ServiceWorkerGlobalScope)&&zl.versions?.web&&!zl.wasm.wasmPaths){let e=`https://cdn.jsdelivr.net/npm/onnxruntime-web@${zl.versions.web}/dist/`,t=`.asyncify`;O.IS_SAFARI_BELOW_26&&!O.IS_WEBGPU_AVAILABLE&&(t=``),zl.wasm.wasmPaths={mjs:`${e}ort-wasm-simd-threaded${t}.mjs`,wasm:`${e}ort-wasm-simd-threaded${t}.wasm`}}zl.wasm.proxy=!1}zl.webgpu&&(zl.webgpu.powerPreference=`high-performance`),e(k.logLevel??Xr.WARNING),k.backends.onnx={...zl,setLogLevel:e}}var Vl=async(e,t,n)=>{let r=await Fl(new Uint8Array(e),t);return(async e=>{let t=Bl(),i=Object.fromEntries(Object.entries(e).map(([e,n])=>[e,(t?n.clone():n).ort_tensor])),a=await Ll(r,i);return Array.isArray(n)?n.map(e=>new V(a[e])):new V(a[n])})},Hl=class{static session_options={};static get nearest_interpolate_4d(){return this._nearest_interpolate_4d||=Vl([8,10,18,0,58,129,1,10,41,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,18,10,4,109,111,100,101,34,7,110,101,97,114,101,115,116,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,21],this.session_options,`y`),this._nearest_interpolate_4d}static get bilinear_interpolate_4d(){return this._bilinear_interpolate_4d||=Vl([8,9,18,0,58,128,1,10,40,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,17,10,4,109,111,100,101,34,6,108,105,110,101,97,114,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bilinear_interpolate_4d}static get bicubic_interpolate_4d(){return this._bicubic_interpolate_4d||=Vl([8,9,18,0,58,127,10,39,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,16,10,4,109,111,100,101,34,5,99,117,98,105,99,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bicubic_interpolate_4d}static get matmul(){return this._matmul||=Vl([8,9,18,0,58,55,10,17,10,1,97,10,1,98,18,1,99,34,6,77,97,116,77,117,108,18,1,114,90,9,10,1,97,18,4,10,2,8,1,90,9,10,1,98,18,4,10,2,8,1,98,9,10,1,99,18,4,10,2,8,1,66,2,16,20],this.session_options,`c`),this._matmul}static get stft(){return this._stft||=Vl([8,7,18,0,58,148,1,10,38,10,1,115,10,1,106,10,1,119,10,1,108,18,1,111,34,4,83,84,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,115,90,26,10,1,115,18,21,10,19,8,1,18,15,10,3,18,1,98,10,3,18,1,115,10,3,18,1,99,90,11,10,1,106,18,6,10,4,8,7,18,0,90,16,10,1,119,18,11,10,9,8,1,18,5,10,3,18,1,119,90,11,10,1,108,18,6,10,4,8,7,18,0,98,31,10,1,111,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,102,10,3,18,1,100,10,3,18,1,99,66,2,16,17],this.session_options,`o`),this._stft}static get rfft(){return this._rfft||=Vl([8,9,58,93,10,33,10,1,120,10,0,10,1,97,18,1,121,34,3,68,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,100,90,19,10,1,120,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,1,90,11,10,1,97,18,6,10,4,8,7,18,0,98,19,10,1,121,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,2,66,2,16,20],this.session_options,`y`),this._rfft}static get top_k(){return this._top_k||=Vl([8,10,18,0,58,73,10,18,10,1,120,10,1,107,18,1,118,18,1,105,34,4,84,111,112,75,18,1,116,90,9,10,1,120,18,4,10,2,8,1,90,15,10,1,107,18,10,10,8,8,7,18,4,10,2,8,1,98,9,10,1,118,18,4,10,2,8,1,98,9,10,1,105,18,4,10,2,8,7,66,2,16,21],this.session_options,[`v`,`i`]),this._top_k}static get slice(){return this._slice||=Vl([8,7,18,0,58,96,10,25,10,1,120,10,1,115,10,1,101,10,1,97,10,1,116,18,1,121,34,5,83,108,105,99,101,18,1,114,90,9,10,1,120,18,4,10,2,8,1,90,9,10,1,115,18,4,10,2,8,7,90,9,10,1,101,18,4,10,2,8,7,90,9,10,1,97,18,4,10,2,8,7,90,9,10,1,116,18,4,10,2,8,7,98,9,10,1,121,18,4,10,2,8,1,66,2,16,13],this.session_options,`y`),this._slice}},Ul=Object.freeze({auto:`auto`,gpu:`gpu`,cpu:`cpu`,wasm:`wasm`,webgpu:`webgpu`,cuda:`cuda`,dml:`dml`,coreml:`coreml`,webnn:`webnn`,"webnn-npu":`webnn-npu`,"webnn-gpu":`webnn-gpu`,"webnn-cpu":`webnn-cpu`}),Wl=O.IS_NODE_ENV?`cpu`:`wasm`;function Gl(e,t,{warn:n}={}){return e?typeof e==`string`?e:e.hasOwnProperty(t)?e[t]:(n&&n(`device not specified for "${t}". Using the default device (${Wl}).`),Wl):Wl}var Kl=/* @__PURE__ */ (function(){let e;return async function(){if(e===void 0){if(!O.IS_WEBGPU_AVAILABLE)e=!1;else try{e=(await navigator.gpu.requestAdapter()).features.has(`shader-f16`)}catch{e=!1}}return e}})(),ql=Object.freeze({auto:`auto`,fp32:`fp32`,fp16:`fp16`,q8:`q8`,int8:`int8`,uint8:`uint8`,q4:`q4`,bnb4:`bnb4`,q4f16:`q4f16`,q2:`q2`,q2f16:`q2f16`,q1:`q1`,q1f16:`q1f16`}),Jl=ql.fp32,Yl=Object.freeze({[Ul.wasm]:ql.q8}),Xl=Object.freeze({[ql.fp32]:``,[ql.fp16]:`_fp16`,[ql.int8]:`_int8`,[ql.uint8]:`_uint8`,[ql.q8]:`_quantized`,[ql.q4]:`_q4`,[ql.q2]:`_q2`,[ql.q1]:`_q1`,[ql.q4f16]:`_q4f16`,[ql.q2f16]:`_q2f16`,[ql.q1f16]:`_q1f16`,[ql.bnb4]:`_bnb4`});function Zl(e,t,n,{configDtype:r=null,warn:i}={}){let a,o=!1;e&&typeof e!=`string`?e.hasOwnProperty(t)?a=e[t]:(a=null,o=!0):a=e;let s;if(a===ql.auto){if(r){let e=typeof r==`string`?r:r?.[t];if(e&&e!==ql.auto&&ql.hasOwnProperty(e))return e}s=Yl[n]??Jl}else s=a&&ql.hasOwnProperty(a)?a:Yl[n]??Jl;return o&&i&&i(`dtype not specified for "${t}". Using the default dtype (${s}) for this device (${n}).`),s}var Ql=Object.freeze({float32:Float32Array,float16:typeof Float16Array<`u`?Float16Array:Uint16Array,float64:Float64Array,string:Array,int8:Int8Array,uint8:Uint8Array,int16:Int16Array,uint16:Uint16Array,int32:Int32Array,uint32:Uint32Array,int64:BigInt64Array,uint64:BigUint64Array,bool:Uint8Array,uint4:Uint8Array,int4:Int8Array}),V=class e{get dims(){return this.ort_tensor.dims}set dims(e){this.ort_tensor.dims=e}get type(){return this.ort_tensor.type}get data(){return this.ort_tensor.data}get size(){return this.ort_tensor.size}get location(){return this.ort_tensor.location}ort_tensor;constructor(...e){return this.ort_tensor=Rl(e[0])?e[0]:new br(e[0],e[1],e[2]),new Proxy(this,{get:(e,t)=>{if(typeof t==`string`){let n=Number(t);if(Number.isInteger(n))return e._getitem(n)}return e[t]},set:(e,t,n)=>e[t]=n})}dispose(){this.ort_tensor.dispose()}*[Symbol.iterator](){let[e,...t]=this.dims;if(t.length>0){let n=t.reduce((e,t)=>e*t);for(let r=0;r0){let e=r.reduce((e,t)=>e*t);return this._subarray(t,e,r)}return new e(this.type,[this.data[t]],r)}_subarray(t,n,r){let i=t*n,a=(t+1)*n,o=`subarray`in this.data?this.data.subarray(i,a):this.data.slice(i,a);return new e(this.type,o,r)}item(){let e=this.data;if(e.length!==1)throw Error(`a Tensor with ${e.length} elements cannot be converted to Scalar`);return e[0]}tolist(){return $l(this.data,this.dims)}sigmoid(){return this.clone().sigmoid_()}sigmoid_(){let e=this.data;for(let t=0;t0||r>0&&n<0?r+n:r}return this}clone(){return new e(this.type,this.data.slice(),this.dims.slice())}slice(...t){let n=[],r=[];for(let e=0;ea)throw Error(`Invalid slice: ${i}`);let o=[Math.max(t,0),Math.min(a,this.dims[e])];r.push(o),n.push(o[1]-o[0])}else throw Error(`Invalid slice: ${i}`)}let i=r.map(([e,t])=>t-e),a=i.reduce((e,t)=>e*t),o=this.data,s=new o.constructor(a),c=this.stride(),l=!0;for(let e=1;e=0;--n){let e=i[n];t+=(a%e+r[n][0])*c[n],a=Math.floor(a/e)}s[e]=o[t]}return new e(this.type,s,n)}permute(...e){return eu(this,e)}transpose(...e){return this.permute(...e)}sum(e=null,t=!1){return this.norm(1,e,t)}norm(t=`fro`,n=null,r=!1){if(t===`fro`)t=2;else if(typeof t==`string`)throw Error(`Unsupported norm: ${t}`);let i=this.data,a=i instanceof BigInt64Array||i instanceof BigUint64Array;if(a&&t!==1)throw Error(`Expected a floating point tensor as input. Got ${this.type}`);let o,s;if(a?(o=(e,t)=>e+t,s=0n):(o=(e,n)=>e+n**t,s=0),n===null){let n=i.reduce(o,s);return t!==1&&(n**=1/t),new e(this.type,[n],[])}let[c,l,u]=fu(o,this,n,r);if(t!==1)for(let e=0;e=0;--r){let e=this.dims[r];if(r!==t){let t=i%e;n+=t*a,a*=this.dims[r]}i=Math.floor(i/e)}r[e]/=i[n]}return this}normalize(e=2,t=1){return this.clone().normalize_(e,t)}stride(){return hu(this.dims)}squeeze(t=null){return new e(this.type,this.data,cu(this.dims,t))}squeeze_(e=null){return this.dims=cu(this.dims,e),this}unsqueeze(t){return new e(this.type,this.data,lu(this.dims,t))}unsqueeze_(e){return this.dims=lu(this.dims,e),this}flatten_(e=0,t=-1){t=(t+this.dims.length)%this.dims.length;let n=this.dims.slice(0,e),r=this.dims.slice(e,t+1),i=this.dims.slice(t+1);return this.dims=[...n,r.reduce((e,t)=>e*t,1),...i],this}flatten(e=0,t=-1){return this.clone().flatten_(e,t)}view(...t){let n=-1;for(let e=0;er===n?e:e*t,1);t[n]=r.length/e}return new e(this.type,r,t)}neg_(){let e=this.data;for(let t=0;tt);return new e(`bool`,n,this.dims)}lt(t){let n=new Uint8Array(this.data.length),r=this.data;for(let e=0;eMath.min(e,t),this,t,n,1/0);return new e(r,i,a)}max(t=null,n=!1){if(t===null){let t=ll(this.data)[0];return new e(this.type,[t],[])}let[r,i,a]=fu((e,t)=>Math.max(e,t),this,t,n,-1/0);return new e(r,i,a)}argmin(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=cl(this.data)[1];return new e(`int64`,[BigInt(r)],[])}argmax(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=ll(this.data)[1];return new e(`int64`,[BigInt(r)],[])}repeat(...t){if(t.lengthe===1)){if(t.length===this.dims.length)return this.clone();let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims);return new e(this.type,this.data.slice(),r)}let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims),i=r.map((e,n)=>e*t[n]),a=i.reduce((e,t)=>e*t,1),o=this.data,s=new o.constructor(a),c=hu(r),l=hu(i);for(let e=0;eBigInt(Math.floor(e)):BigInt;else if(this.type===`float16`&&t==`float32`&&this.data instanceof Uint16Array)return new e(t,vl(this.data),this.dims);return new e(t,Ql[t].from(this.data,n),this.dims)}};function $l(e,t){let n=e.length;if(n!==(t.length===0?1:t.reduce((e,t)=>e*t)))throw Error(`cannot reshape array of size ${n} into shape (${t})`);let r=e;for(let e=t.length-1;e>=0;e--)r=r.reduce((n,r)=>{let i=n[n.length-1];return i.lengthnew V(`int64`,e,[e.length]);async function ou(e,t,n,r,i){return await(await Hl.slice)({x:e,s:au(t),e:au(n),a:au(r),t:au(i??Array(r.length).fill(1))})}function su(e,t){let n=e.data,r=t.data,i=[e.dims[0],e.dims[2]],a=new n.constructor(i[0]*i[1]),[o,s,c]=e.dims,l=0;for(let e=0;ee!==1):typeof t==`number`?e[t]===1&&e.splice(t,1):Array.isArray(t)&&(e=e.filter((e,n)=>e!==1||!t.includes(n))),e}function lu(e,t){return t=uu(t,e.length+1),e=e.slice(),e.splice(t,0,1),e}function uu(e,t,n=null,r=!0){if(e<-t||e>=t){if(r)throw Error(`IndexError: index ${e} is out of bounds for dimension${n===null?``:` `+n} with size ${t}`);return e<-t?0:t}return e<0&&(e=(e%t+t)%t),e}function H(e,t=0){t=uu(t,e[0].dims.length);let n=e[0].dims.slice();n[t]=e.reduce((e,n)=>e+n.dims[t],0);let r=n.reduce((e,t)=>e*t,1),i=new e[0].data.constructor(r),a=e[0].type;if(t===0){let t=0;for(let n of e){let e=n.data;i.set(e,t),t+=e.length}}else{let r=0;for(let a=0;a=0;--i){let e=s[i],l=o%e;i===t&&(l+=r),a+=l*c,c*=n[i],o=Math.floor(o/e)}i[a]=o[e]}r+=s[t]}}return new V(a,i,n)}function du(e,t=0){return H(e.map(e=>e.unsqueeze(t)),t)}function fu(e,t,n,r=!1,i=null){let a=t.data,o=t.dims;n=uu(n,o.length);let s=o.slice();s[n]=1;let c=new a.constructor(a.length/o[n]);i!==null&&c.fill(i);for(let t=0;t=0;--e){let t=o[e];if(e!==n){let n=i%t;r+=n*a,a*=s[e]}i=Math.floor(i/t)}c[r]=e(c[r],a[t],t,r)}return r||s.splice(n,1),[t.type,c,s]}function pu(e,t=null,n=1,r=!1){let i=e.data,a=e.dims;if(t===null){let t=i.reduce((e,t)=>e+t,0)/i.length,r=Math.sqrt(i.reduce((e,n)=>e+(n-t)**2,0)/(i.length-n)),a=new V(e.type,[t],[]);return[new V(e.type,[r],[]),a]}t=uu(t,a.length);let o=mu(e,t,r),s=o.data,[c,l,u]=fu((e,t,n,r)=>e+(t-s[r])**2,e,t,r);for(let e=0;ee+t,0);return new V(e.type,[t/i.length],[])}t=uu(t,r.length);let[a,o,s]=fu((e,t)=>e+t,e,t,n);if(r[t]!==1)for(let e=0;e=0;--n)t[n]=r,r*=e[n];return t}function gu(e,t,n,r){return new V(n,new r(e.reduce((e,t)=>e*t,1)).fill(t),e)}function _u(e,t){let n,r;if(typeof t==`number`)n=`float32`,r=Float32Array;else if(typeof t==`bigint`)n=`int64`,r=BigInt64Array;else if(typeof t==`boolean`)n=`bool`,r=Uint8Array;else throw Error(`Unsupported data type: ${typeof t}`);return gu(e,t,n,r)}function vu(e,t){return _u(e.dims,t)}function yu(e){return gu(e,1n,`int64`,BigInt64Array)}function bu(e){return yu(e.dims)}function xu(e){return gu(e,0n,`int64`,BigInt64Array)}function Su(e){return xu(e.dims)}function Cu(e){let t=e.reduce((e,t)=>e*t,1);return new V(`float32`,Float32Array.from({length:t},()=>bc.gauss()),e)}function wu(e,t){if(e.dims.length!==2)throw Error(`The tensor must have 2 dimensions`);if(e.dims.at(-1)%8!=0)throw Error(`The last dimension of the tensor must be a multiple of 8`);if(![`binary`,`ubinary`].includes(t))throw Error(`The precision must be either 'binary' or 'ubinary'`);let n=t===`binary`,r=n?`int8`:`uint8`,i=n?Int8Array:Uint8Array,a=e.data,o=new i(a.length/8);for(let e=0;e0),r=Math.floor(e/8),i=e%8;o[r]|=t<<7-i,n&&i===0&&(o[r]-=128)}return new V(r,o,[e.dims[0],e.dims[1]/8])}async function Tu(e){if(!e)throw Error(`modelId is required for get_tokenizer_files`);return(await Kc(e,`tokenizer_config.json`,{})).exists?[`tokenizer.json`,`tokenizer_config.json`]:[]}async function Eu(e,t){let n=await Tu(e);return await Promise.all(n.map(n=>rl(e,n,!0,t)))}function Du(e){let t=e.dims;switch(t.length){case 1:return e.tolist();case 2:if(t[0]!==1)throw Error("Unable to decode tensor with `batch size !== 1`. Use `tokenizer.batch_decode(...)` for batched inputs.");return e.tolist()[0];default:throw Error(`Expected tensor to have 1-2 dimensions, got ${t.length}.`)}}var Ou=[`bos_token`,`eos_token`,`unk_token`,`sep_token`,`pad_token`,`cls_token`,`mask_token`];function ku(e,t,n,r){for(let i of Object.keys(e)){let a=t-e[i].length,o=n(i),s=Array(a).fill(o);e[i]=r===`right`?ai(e[i],s):ai(s,e[i])}}function Au(e,t){for(let n of Object.keys(e))e[n].length=t}function ju(e,...t){for(let n of t){if(!Object.hasOwn(e,n))continue;let t=e[n];if(t){if(typeof t==`object`){if(t.__type===`AddedToken`)return t.content;throw Error(`Unknown token: ${t}`)}return t}}return null}function Mu(e){let t=[];for(let n of e.get_added_tokens_decoder().values())n.special&&t.push(n);return t}var U=class extends $r{return_token_type_ids=!1;padding_side=`right`;constructor(e,t){if(super(),this._tokenizerJSON=e,this._tokenizerConfig=t,this._tokenizer=new Do(e,t),this.config=t,this.padding_side=t.padding_side??this.padding_side,this.mask_token=ju(t,`mask_token`),this.mask_token_id=this._tokenizer.token_to_id(this.mask_token),this.pad_token=ju(t,`pad_token`,`eos_token`),this.pad_token_id=this._tokenizer.token_to_id(this.pad_token),this.sep_token=ju(t,`sep_token`),this.sep_token_id=this._tokenizer.token_to_id(this.sep_token),this.unk_token=ju(t,`unk_token`),this.unk_token_id=this._tokenizer.token_to_id(this.unk_token),this.bos_token=ju(t,`bos_token`),this.bos_token_id=this._tokenizer.token_to_id(this.bos_token),this.eos_token=ju(t,`eos_token`),this.eos_token_id=this._tokenizer.token_to_id(this.eos_token),this.chat_template=t.chat_template??null,Array.isArray(this.chat_template)){let e=/* @__PURE__ */ Object.create(null);for(let{name:t,template:n}of this.chat_template){if(typeof t!=`string`||typeof n!=`string`)throw Error(`Chat template must be a list of objects with "name" and "template" properties`);e[t]=n}this.chat_template=e}this._compiled_template_cache=/* @__PURE__ */ new Map;let n=Mu(this._tokenizer);this.all_special_ids=n.map(e=>e.id),this.all_special_tokens=n.map(e=>e.content)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let o=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a});return new this(...o)}get_vocab(){return this._tokenizer.get_vocab()}get model_max_length(){return this._tokenizerConfig.model_max_length??1/0}get add_eos_token(){return this._tokenizerConfig.add_eos_token}get add_bos_token(){return this._tokenizerConfig.add_bos_token}convert_tokens_to_ids(e){return typeof e==`string`?this._tokenizer.token_to_id(e):e.map(e=>this._tokenizer.token_to_id(e))}_call(e,t={}){let{text_pair:n=null,add_special_tokens:r=!0,padding:i=!1,return_token_type_ids:a=null}=t,{truncation:o=null,max_length:s=null}=t,c=t.return_tensor??!0,l=Array.isArray(e),u;if(l){if(e.length===0)throw Error(`text array must be non-empty`);if(n!==null){if(!Array.isArray(n))throw Error(`text_pair must also be an array`);if(e.length!==n.length)throw Error(`text and text_pair must have the same length`);u=e.map((e,t)=>this._encode_plus(e,{text_pair:n[t],add_special_tokens:r,return_token_type_ids:a}))}else u=e.map(e=>this._encode_plus(e,{add_special_tokens:r,return_token_type_ids:a}))}else{if(e==null)throw Error(`text may not be null or undefined`);if(Array.isArray(n))throw Error("When specifying `text_pair`, since `text` is a string, `text_pair` must also be a string (i.e., not an array).");u=[this._encode_plus(e,{text_pair:n,add_special_tokens:r,return_token_type_ids:a})]}if(s===null?s=this.model_max_length:o===null&&(i===!0?(A.warn("`max_length` is ignored when `padding: true` and there is no truncation strategy. To pad to max length, use `padding: 'max_length'`."),s=this.model_max_length):i===!1&&(A.warn("Truncation was not explicitly activated but `max_length` is provided a specific value, please use `truncation: true` to explicitly truncate examples to max length."),o=!0)),i===!0&&(s=Math.min(ll(u.map(e=>e.input_ids.length))[0],s??1/0)),s=Math.min(s,this.model_max_length??1/0),i||o)for(let e=0;es?o&&Au(u[e],s):i&&ku(u[e],s,e=>e===`input_ids`?this.pad_token_id:0,this.padding_side);let d={};if(c){if(!(i&&o)&&u.some(e=>{for(let t of Object.keys(e))if(e[t].length!==u[0][t]?.length)return!0;return!1}))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=true' and 'truncation=true' to have batched tensors with the same length.`);let e=[u.length,u[0].input_ids.length];for(let t of Object.keys(u[0]))d[t]=new V(`int64`,BigInt64Array.from(u.flatMap(e=>e[t]).map(BigInt)),e)}else{for(let e of Object.keys(u[0]))d[e]=u.map(t=>t[e]);if(!l)for(let e of Object.keys(d))d[e]=d[e][0]}return d}_encode_text(e){return e===null?null:this._tokenizer.encode(e).tokens}_encode_plus(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{ids:i,attention_mask:a,token_type_ids:o}=this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r??this.return_token_type_ids});return{input_ids:i,attention_mask:a,...o?{token_type_ids:o}:{}}}tokenize(e,{pair:t=null,add_special_tokens:n=!1}={}){return this._tokenizer.tokenize(e,{text_pair:t,add_special_tokens:n})}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){return this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r}).ids}batch_decode(e,t={}){return e instanceof V&&(e=e.tolist()),e.map(e=>this.decode(e,t))}decode(e,t={}){if(e instanceof V&&(e=Du(e)),!Array.isArray(e)||e.length===0||!ni(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);return this.decode_single(e,t)}decode_single(e,{skip_special_tokens:t=!1,clean_up_tokenization_spaces:n=null}){return this._tokenizer.decode(e,{skip_special_tokens:t,clean_up_tokenization_spaces:n})}get_chat_template({chat_template:e=null,tools:t=null}={}){if(this.chat_template&&typeof this.chat_template==`object`){let n=this.chat_template;if(e!==null&&Object.hasOwn(n,e))e=n[e];else if(e===null){if(t!==null&&`tool_use`in n)e=n.tool_use;else if(`default`in n)e=n.default;else throw Error(`This model has multiple chat templates with no default specified! Please either pass a chat template or the name of the template you wish to use to the 'chat_template' argument. Available template names are ${Object.keys(n).sort()}.`)}}else if(e===null){if(this.chat_template)e=this.chat_template;else throw Error(`Cannot use apply_chat_template() because tokenizer.chat_template is not set and no template argument was passed! For information about writing templates and setting the tokenizer.chat_template attribute, please see the documentation at https://huggingface.co/docs/transformers/main/en/chat_templating`)}return e}apply_chat_template(e,t={}){let{tools:n=null,documents:r=null,chat_template:i=null,add_generation_prompt:a=!1,tokenize:o=!0,padding:s=!1,truncation:c=!1,max_length:l=null,return_tensor:u=!0,return_dict:d=!0,tokenizer_kwargs:f={},...p}=t;if(i=this.get_chat_template({chat_template:i,tools:n}),typeof i!=`string`)throw Error(`chat_template must be a string, but got ${typeof i}`);let m=this._compiled_template_cache.get(i);m===void 0&&(m=new mc(i),this._compiled_template_cache.set(i,m));let h=/* @__PURE__ */ Object.create(null);for(let e of Ou){let t=ju(this.config,e);t&&(h[e]=t)}let g=m.render({messages:e,add_generation_prompt:a,tools:n,documents:r,...h,...p});if(o){let e=this._call(g,{add_special_tokens:!1,padding:s,truncation:c,max_length:l,return_tensor:u,...f});return d?e:e.input_ids}return g}};function Nu(e,t,n,r){if(!(`language_codes`in e)||!Array.isArray(e.language_codes))throw Error("Tokenizer must have `language_codes` attribute set and it should be an array of language ids.");if(!(`languageRegex`in e)||!(e.languageRegex instanceof RegExp))throw Error("Tokenizer must have `languageRegex` attribute set and it should be a regular expression.");if(!(`lang_to_token`in e)||typeof e.lang_to_token!=`function`)throw Error("Tokenizer must have `lang_to_token` attribute set and it should be a function.");let i=r.src_lang,a=r.tgt_lang;if(!e.language_codes.includes(a))throw Error(`Target language code "${a}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);if(i!==void 0){if(!e.language_codes.includes(i))throw Error(`Source language code "${i}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);let t=e._tokenizer.post_processor?.config;if(t&&`single`in t){for(let n of t.single)if(`SpecialToken`in n&&e.languageRegex.test(n.SpecialToken.id)){n.SpecialToken.id=e.lang_to_token(i);break}}}return r.forced_bos_token_id=e._tokenizer.token_to_id(e.lang_to_token(a)),e._call(t,n)}var Pu={};Sr(Pu,{AlbertTokenizer:()=>Fu,AutoTokenizer:()=>W,BartTokenizer:()=>Iu,BertTokenizer:()=>Lu,BlenderbotSmallTokenizer:()=>Ru,BlenderbotTokenizer:()=>zu,BloomTokenizer:()=>Bu,CLIPTokenizer:()=>Hu,CamembertTokenizer:()=>Vu,CodeGenTokenizer:()=>Wu,CodeLlamaTokenizer:()=>Uu,CohereAsrTokenizer:()=>Ku,CohereTokenizer:()=>Gu,ConvBertTokenizer:()=>qu,DebertaTokenizer:()=>Yu,DebertaV2Tokenizer:()=>Ju,DistilBertTokenizer:()=>Xu,ElectraTokenizer:()=>Zu,EsmTokenizer:()=>Qu,FalconTokenizer:()=>$u,GPT2Tokenizer:()=>nd,GPTNeoXTokenizer:()=>td,GemmaTokenizer:()=>ed,HerbertTokenizer:()=>rd,LlamaTokenizer:()=>id,M2M100Tokenizer:()=>ad,MBart50Tokenizer:()=>cd,MBartTokenizer:()=>sd,MPNetTokenizer:()=>dd,MarianTokenizer:()=>od,MgpstrTokenizer:()=>ld,MobileBertTokenizer:()=>ud,NllbTokenizer:()=>fd,NougatTokenizer:()=>pd,PreTrainedTokenizer:()=>U,Qwen2Tokenizer:()=>md,RoFormerTokenizer:()=>gd,RobertaTokenizer:()=>hd,SiglipTokenizer:()=>_d,SpeechT5Tokenizer:()=>vd,SqueezeBertTokenizer:()=>yd,T5Tokenizer:()=>bd,TokenizersBackend:()=>U,VitsTokenizer:()=>Sd,Wav2Vec2CTCTokenizer:()=>Cd,WhisperTokenizer:()=>Ad,XLMRobertaTokenizer:()=>jd,XLMTokenizer:()=>Md});var Fu=class extends U{return_token_type_ids=!0},Iu=class extends U{},Lu=class extends U{return_token_type_ids=!0},Ru=class extends U{},zu=class extends U{},Bu=class extends U{},Vu=class extends U{},Hu=class extends U{},Uu=class extends U{},Wu=class extends U{},Gu=class extends U{},Ku=class extends U{},qu=class extends U{return_token_type_ids=!0},Ju=class extends U{return_token_type_ids=!0},Yu=class extends U{return_token_type_ids=!0},Xu=class extends U{},Zu=class extends U{return_token_type_ids=!0},Qu=class extends U{},$u=class extends U{},ed=class extends U{},td=class extends U{},nd=class extends U{},rd=class extends U{return_token_type_ids=!0},id=class extends U{padding_side=`left`},ad=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^__[a-z]{2,3}__$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e.slice(2,-2)),this.lang_to_token=e=>`__${e}__`}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},od=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^(>>\w+<<)\s*/g,this.supported_language_codes=Array.from(this.get_vocab().keys()).filter(e=>this.languageRegex.test(e)),A.warn('WARNING: `MarianTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}_encode_text(e){if(e===null)return null;let[t,...n]=e.trim().split(this.languageRegex);if(n.length===0)return super._encode_text(t);if(n.length===2){let[e,t]=n;return this.supported_language_codes.includes(e)||A.warn(`Unsupported language code "${e}" detected, which may lead to unexpected behavior. Should be one of: ${JSON.stringify(this.supported_language_codes)}`),ai([e],super._encode_text(t))}}},sd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{2}_[A-Z]{2}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},cd=class extends sd{},ld=class extends U{},ud=class extends U{return_token_type_ids=!0},dd=class extends U{},fd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{3}_[A-Z][a-z]{3}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},pd=class extends U{},md=class extends U{},hd=class extends U{},gd=class extends U{return_token_type_ids=!0},_d=class extends U{},vd=class extends U{},yd=class extends U{return_token_type_ids=!0},bd=class extends U{},xd=class extends mo{decode_chain(e){let t=``;for(let n=1;n[t,e]),[`burmese`,`my`],[`valencian`,`ca`],[`flemish`,`nl`],[`haitian`,`ht`],[`letzeburgesch`,`lb`],[`pushto`,`ps`],[`panjabi`,`pa`],[`moldavian`,`ro`],[`moldovan`,`ro`],[`sinhalese`,`si`],[`castilian`,`es`]]);function Dd(e){e=e.toLowerCase();let t=Ed.get(e);if(t===void 0){let n=e.match(/^<\|([a-z]{2})\|>$/);if(n&&(e=n[1]),Td.has(e))t=e;else{let t=e.length===2?Td.keys():Td.values();throw Error(`Language "${e}" is not supported. Must be one of: ${JSON.stringify(Array.from(t))}`)}}return t}var Od=/* @__PURE__ */ RegExp(`^[\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E]+$`,`gu`),kd=.1,Ad=class extends U{get timestamp_begin(){return this._tokenizer.token_to_id(`<|notimestamps|>`)+1}_decode_asr(e,{return_timestamps:t=!1,return_language:n=!1,time_precision:r=null,force_full_sequences:i=!0}={}){if(r===null)throw Error(`Must specify time_precision`);let a=null,o=t===`word`;function s(){return{language:a,timestamp:[null,null],text:``}}let c=[],l=s(),u=0,d=this.timestamp_begin,f=d+1500,p=[],m=[],h=!1,g=null,_=new Set(this.all_special_ids);for(let n of e){let e=n.tokens,i=o?n.token_timestamps:null,v=null,y=d;if(`stride`in n){let[t,i,a]=n.stride;if(u-=i,g=t-a,i&&(y=i/r+d),a)for(let t=e.length-1;t>=0;--t){let n=Number(e[t]);if(n>=d){if(v!==null&&(n-d)*r=d&&g<=f){let e=hl((g-d)*r+u,2);if(v!==null&&g>=v)h=!0;else if(h||p.length>0&&g0&&l.timestamp[1]!==null))for(let e of l.words)e.timestamp[1]>l.timestamp[1]&&l.timestamp[1]>=e.timestamp[0]&&(e.timestamp[1]=l.timestamp[1]);c.push(l),p=[],b=[],m=[],x=[],l=s()}}else if(b.push(g),o){let e=hl(i[n]+u,2),t;if(n+10?(p.push(b),o&&m.push(x)):p.every(e=>e.length===0)&&(l=s(),p=[],b=[],m=[],x=[])}if(p.length>0){if(i&&t)throw Error(`Whisper did not predict an ending timestamp, which can happen if audio is cut off in the middle of a word. Also make sure WhisperTimeStampLogitsProcessor was used during generation.`);let[e,n]=this.findLongestCommonSequence(p,m),r=this.decode(e);l.text=r,o&&(l.words=this.collateWordTimestamps(e,n,a)),c.push(l)}let v=/* @__PURE__ */ Object.create(null),y=c.map(e=>e.text).join(``);if(t||n){for(let e=0;e0,o=a?[]:null,s=a?t[0]:null;for(let c=1;ce===g[n]&&s[i+n][0]-kd<=t[c][m+n][0]).length:p.filter((e,t)=>e===g[t]).length;let v=e/1e4,y=_/e+v;_>1&&y>u&&(u=y,d=[i,o,m,h])}let[p,m,h,g]=d,_=Math.floor((m+p)/2),v=Math.floor((g+h)/2);if(a&&u===0&&r>0){let e=s[r-1][0],n=t[c].findIndex(t=>t[0]>=e);v=n===-1?l.length:n}i.push(...n.slice(0,_)),n=l.slice(v),r=n.length,a&&(o.push(...s.slice(0,_)),s=t[c].slice(v))}return i.push(...n),a?(o.push(...s),[i,o]):[i,[]]}collateWordTimestamps(e,t,n){let[r,i,a]=this.combineTokensIntoWords(e,n),o=[];for(let e=0;e=r){let e=((t-r)*n).toFixed(2);i.push(`<|${e}|>`),i.push([])}else i[i.length-1].push(t);return i=i.map(e=>typeof e==`string`?e:super.decode(e,t)),i.join(``)}splitTokensOnUnicode(e){let t=this.decode(e,{decode_with_timestamps:!0}),n=[],r=[],i=[],a=[],o=[],s=0;for(let c=0;c=this._tokenizer.token_to_id(`<|endoftext|>`),d=s.startsWith(` `),f=s.trim(),p=Od.test(f);if(u||d||p||i.length===0)i.push(s),a.push(c),o.push(l);else{let e=i.length-1;i[e]+=s,a[e].push(...c),o[e].push(...l)}}return[i,a,o]}mergePunctuations(e,t,n,r,i){let a=structuredClone(e),o=structuredClone(t),s=structuredClone(n),c=a.length-2,l=a.length-1;for(;c>=0;)a[c].startsWith(` `)&&r.includes(a[c].trim())?(a[l]=a[c]+a[l],o[l]=ai(o[c],o[l]),s[l]=ai(s[c],s[l]),a[c]=``,o[c]=[],s[c]=[]):l=c,--c;for(c=0,l=1;le),o.filter(e=>e.length>0),s.filter(e=>e.length>0)]}},jd=class extends U{},Md=class extends U{return_token_type_ids=!0;constructor(e,t){super(e,t),A.warn('WARNING: `XLMTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}},W=class{static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let[o,s]=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a}),c=s.tokenizer_class?.replace(/Fast$/,``)??`PreTrainedTokenizer`,l=Pu[c];return l||=(A.warn(`Unknown tokenizer class "${c}", attempting to construct from base class.`),U),new l(o,s)}},Nd=`https://github.com/huggingface/transformers.js/issues/new/choose`,Pd=`preprocessor_config.json`,Fd=`preprocessor_config.json`,Id=`processor_config.json`,Ld=`chat_template.jinja`,G=class extends $r{static classes=[`image_processor_class`,`tokenizer_class`,`feature_extractor_class`];static uses_processor_config=!1;static uses_chat_template_file=!1;constructor(e,t,n){super(),this.config=e,this.components=t,this.chat_template=n}get image_processor(){return this.components.image_processor}get tokenizer(){return this.components.tokenizer}get feature_extractor(){return this.components.feature_extractor}apply_chat_template(e,t={}){if(!this.tokenizer)throw Error(`Unable to apply chat template without a tokenizer.`);return this.tokenizer.apply_chat_template(e,{tokenize:!1,chat_template:this.chat_template??void 0,...t})}batch_decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.batch_decode(...e)}decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.decode(...e)}async _call(e,...t){for(let n of[this.image_processor,this.feature_extractor,this.tokenizer])if(n)return n(e,...t);throw Error(`No image processor, feature extractor, or tokenizer found.`)}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([this.uses_processor_config?rl(e,Id,!0,t):{},Promise.all(this.classes.filter(e=>e in this).map(async n=>{let r=await this[n].from_pretrained(e,t);return[n.replace(/_class$/,``),r]})).then(Object.fromEntries),this.uses_chat_template_file?nl(e,Ld,!0,t):null]);return new this(n,r,i)}};Sr({},{ChatterboxProcessor:()=>Mf,CohereAsrProcessor:()=>Pf,Florence2Processor:()=>Sm,Gemma3Processor:()=>Cm,Gemma3nProcessor:()=>wm,Gemma4Processor:()=>Tm,Glm46VProcessor:()=>Dm,GraniteSpeechProcessor:()=>Om,GroundingDinoProcessor:()=>Am,Idefics3Processor:()=>Pm,JinaCLIPProcessor:()=>Im,Lfm2VlProcessor:()=>Lm,LlavaProcessor:()=>Rm,MgpstrProcessor:()=>Bm,MoonshineProcessor:()=>Vm,OwlViTProcessor:()=>Hm,PaliGemmaProcessor:()=>Gm,Phi3VProcessor:()=>Jm,PixtralProcessor:()=>Ym,Processor:()=>G,PyAnnoteProcessor:()=>Xm,Qwen2VLProcessor:()=>Em,Qwen2_5_VLProcessor:()=>Zm,Qwen3VLProcessor:()=>Qm,Sam2Processor:()=>eh,Sam2VideoProcessor:()=>th,SamProcessor:()=>$m,SmolVLMProcessor:()=>Pm,SpeechT5Processor:()=>nh,UltravoxProcessor:()=>rh,VLChatProcessor:()=>Fm,VoxtralProcessor:()=>ch,VoxtralRealtimeProcessor:()=>mh,Wav2Vec2Processor:()=>hh,Wav2Vec2ProcessorWithLM:()=>gh,WhisperProcessor:()=>_h});var Rd=class extends $r{constructor(e){super(),this.config=e}static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t);return new this(n)}};function zd(e,t){if(!(e instanceof Float32Array||e instanceof Float64Array))throw Error(`${t} expects input to be a Float32Array or a Float64Array, but got ${e?.constructor?.name??typeof e} instead. If using the feature extractor directly, remember to use \`load_audio(url, sampling_rate)\` to obtain the raw audio data of the file/url.`)}var Bd={};Sr(Bd,{ASTFeatureExtractor:()=>df,ChatterboxFeatureExtractor:()=>pf,ClapFeatureExtractor:()=>mf,CohereAsrFeatureExtractor:()=>_f,DacFeatureExtractor:()=>vf,EncodecFeatureExtractor:()=>ff,FeatureExtractor:()=>Rd,Gemma3nAudioFeatureExtractor:()=>yf,Gemma4AudioFeatureExtractor:()=>bf,GraniteSpeechFeatureExtractor:()=>xf,MoonshineFeatureExtractor:()=>Sf,ParakeetFeatureExtractor:()=>gf,PyAnnoteFeatureExtractor:()=>Cf,SeamlessM4TFeatureExtractor:()=>wf,SnacFeatureExtractor:()=>Tf,SpeechT5FeatureExtractor:()=>Ef,VoxtralRealtimeFeatureExtractor:()=>kf,Wav2Vec2FeatureExtractor:()=>Df,WeSpeakerFeatureExtractor:()=>Of,WhisperFeatureExtractor:()=>Af});var Vd={fromWeb:()=>{}};async function Hd(e,t){if(O.IS_BROWSER_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save a file from a Web Worker.`);let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e,r.click(),r.remove(),URL.revokeObjectURL(n)}else if(O.IS_FS_AVAILABLE){let n=t.stream();Vd.fromWeb(n),Cr.createWriteStream(e),await void 0}else throw Error(`Unable to save because filesystem is disabled in this environment.`)}async function Ud(e,t){if(typeof AudioContext>`u`)throw Error("Unable to load audio from path/URL since `AudioContext` is not available in your environment. Instead, audio data should be passed directly to the pipeline/processor. For more information and some example code, see https://huggingface.co/docs/transformers.js/guides/node-audio-processing.");let n=await(await Jc(e)).arrayBuffer(),r=new AudioContext({sampleRate:t});t===void 0&&A.warn(`No sampling rate provided, using default of ${r.sampleRate}Hz.`);let i=await r.decodeAudioData(n),a;if(i.numberOfChannels===2){let e=Math.sqrt(2),t=i.getChannelData(0),n=i.getChannelData(1);a=new Float32Array(t.length);for(let r=0;r2595*Math.log10(1+e/700),kaldi:e=>1127*Math.log(1+e/700),slaney:(e,t=1e3,n=15,r=27/Math.log(6.4))=>e>=t?n+Math.log(e/t)*r:3*e/200};function Yd(e,t=`htk`){let n=Jd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}var Xd={htk:e=>700*(10**(e/2595)-1),kaldi:e=>700*(Math.exp(e/1127)-1),slaney:(e,t=1e3,n=15,r=Math.log(6.4)/27)=>e>=n?t*Math.exp(r*(e-n)):200*e/3};function Zd(e,t=`htk`){let n=Xd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}function Qd(e,t){let n=Float64Array.from({length:t.length-1},(e,n)=>t[n+1]-t[n]),r=Array.from({length:e.length},()=>Array(t.length));for(let n=0;nArray(e.length));for(let t=0;te+r*n)}function ef(e,t,n,r,i,a=null,o=`htk`,s=!1){if(a!==null&&a!==`slaney`)throw Error(`norm must be one of null or "slaney"`);if(e<2)throw Error(`Require num_frequency_bins: ${e} >= 2`);if(n>r)throw Error(`Require min_frequency: ${n} <= max_frequency: ${r}`);let c=$d(Yd(n,o),Yd(r,o),t+2),l=Zd(c,o),u;if(s){let t=i/((e-1)*2);u=Yd(Float64Array.from({length:e},(e,n)=>n*t),o),l=c}else u=$d(0,Math.floor(i/2),e);let d=Qd(u,l);if(a!==null&&a===`slaney`)for(let n=0;ni)throw Error(`frame_length (${n}) may not be larger than fft_length (${i})`);if(w!==n)throw Error(`Length of the window (${w}) must equal frame_length (${n})`);if(r<=0)throw Error(`hop_length must be greater than zero`);if(a===null&&d!==null)throw Error("You have provided `mel_filters` but `power` is `None`. Mel spectrogram computation is not yet supported for complex-valued spectrogram. Specify `power` to fix this issue.");if(!u)throw Error("`preemphasis_htk_flavor=false` is not currently supported.");if(o){let t=Math.floor(n/2);switch(s){case`reflect`:e=tf(e,t,t);break;case`constant`:{let n=new e.constructor(e.length+2*t);n.set(e,t),e=n;break}case`semicausal`:{let n=new e.constructor(e.length+t);n.set(e,t),e=n;break}default:throw Error(`pad_mode="${s}" not implemented yet.`)}}let te=Math.floor(1+Math.floor((e.length-n)/r));y!==null&&tete?x&&(ie=b):ie=re=b);let ae=new pl(i),oe=new Float64Array(i),se=new Float64Array(ae.outputBufferSize),ce=new Float32Array(ne*ie);for(let i=0;i=1;--e)oe[e]-=l*oe[e-1];oe[0]*=1-l}for(let e=0;ee**.85);break;default:throw Error(`Unknown window type ${t}.`)}if(n&&(o=o.subarray(0,e)),r===null||e===r)return o;if(e>r)throw Error(`Length of the window (${e}) may not be larger than frame_length (${r})`);let s=new Float64Array(r),c=i?Math.floor((r-e)/2):0;return s.set(o,c),s}function cf(e,t){let n=e.reduce((e,t)=>e+t.length,0),r=/* @__PURE__ */ new ArrayBuffer(44),i=new DataView(r);return lf(i,0,`RIFF`),i.setUint32(4,36+n*4,!0),lf(i,8,`WAVE`),lf(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,3,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*4,!0),i.setUint16(32,4,!0),i.setUint16(34,32,!0),lf(i,36,`data`),i.setUint32(40,n*4,!0),new Blob([r,...e.map(e=>e.buffer instanceof ArrayBuffer?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e.slice())],{type:`audio/wav`})}function lf(e,t,n){for(let r=0;re+t.length,0),t=new Float32Array(e),n=0;for(let e of this.audio)t.set(e,n),n+=e.length;return t}return this.audio}toBlob(){let e=this.audio;return e instanceof Float32Array&&(e=[e]),cf(e,this.sampling_rate)}async save(e){return Hd(e,this.toBlob())}},df=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hann`,{periodic:!1}),this.mean=this.config.mean,this.std=this.config.std}async _extract_fbank_features(e,t){return of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e){zd(e,`ASTFeatureExtractor`);let t=await this._extract_fbank_features(e,this.config.max_length);if(this.config.do_normalize){let e=this.std*2,n=t.data;for(let t=0;t0){if(n===`rand_trunc`){let n=Math.floor(bc.random()*(a+1));e=e.subarray(n,n+t),i=await this._extract_fbank_features(e,this.mel_filters_slaney,this.config.nb_max_samples)}else throw Error(`Truncation strategy "${n}" not implemented`)}else{if(a<0){let n=new Float64Array(t);if(n.set(e),r===`repeat`)for(let r=e.length;r=1;--n)e[n]-=t*e[n-1];return await of(e,this.window,this.window.length,this.config.hop_length,{fft_length:this.config.n_fft,power:2,mel_filters:this.config.mel_filters,log_mel:`log`,mel_floor:-1/0,pad_mode:`constant`,center:!0,transpose:!0,mel_offset:2**-24})}async _call(e){zd(e,`ParakeetFeatureExtractor`);let t=await this._extract_fbank_features(e),n=Math.floor((e.length+Math.floor(this.config.n_fft/2)*2-this.config.n_fft)/this.config.hop_length),r=t.data;r.fill(0,n*t.dims[1]);let[i,a]=t.dims,o=new Float64Array(a),s=new Float64Array(a);for(let e=0;e1?n-1:1;for(let e=0;e=l){s.push(e.slice(c,l));break}let t=Math.max(c,c+a-o),n=Math.min(c+a,l),i;i=n<=t?c+a:this._find_split_point_energy(e,t,n,r),i=Math.max(c+1,Math.min(i,l)),s.push(e.slice(c,i)),c=i}return s}_find_split_point_energy(e,t,n,r){let i=n-t;if(i<=r)return Math.floor((t+n)/2);let a=1/0,o=t,s=i-r;for(let n=0;n<=s;n+=r){let i=0;for(let a=0;at&&(e=e.slice(0,t)),r&&e.length%i!==0){let t=i-e.length%i,n=new Float64Array(e.length+t);n.set(e),this.config.padding_value!==0&&n.fill(this.config.padding_value,e.length),e=n}let a=await this._extract_fbank_features(e,this.config.max_length),o=_u([1,a.dims[0]],!0);return{input_features:a.unsqueeze_(0),input_features_mask:o}}},bf=class extends yf{async _extract_fbank_features(e,t){let{frame_length:n,hop_length:r,fft_length:i}=this.config,a=Math.floor(n/2),o=Math.floor((e.length+a-(n+1))/r)+1;return of(e,this.window,n,r,{fft_length:i,center:!0,pad_mode:`semicausal`,onesided:!0,preemphasis:this.config.preemphasis,preemphasis_htk_flavor:this.config.preemphasis_htk_flavor,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:this.config.mel_floor,mel_floor_mode:`add`,remove_dc_offset:!1,transpose:!0,max_num_frames:o})}async _call(e,t={}){zd(e,`Gemma4AudioFeatureExtractor`);let n=e.length,r=await super._call(e,t),{input_features:i}=r,[,a,o]=i.dims,{frame_length:s,hop_length:c}=this.config,l=Math.floor(s/2),u=s+1,d=new Uint8Array(n+l+(t.pad_to_multiple_of??128));d.fill(1,l,l+n);let f=new Uint8Array(a);for(let e=0;e({id:e,start:t*n,end:r*n,confidence:i/(r-t)})))}return r}},wf=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`povey`,{periodic:!1})}async _extract_fbank_features(e,t){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e,{padding:t=!0,pad_to_multiple_of:n=2,do_normalize_per_mel_bins:r=!0,return_attention_mask:i=!0}={}){zd(e,`SeamlessM4TFeatureExtractor`);let a=await this._extract_fbank_features(e,this.config.max_length);if(r){let[e,t]=a.dims,n=a.data;for(let r=0;r0){let n=new Float32Array(t*(e+s));n.set(r),n.fill(this.config.padding_value,r.length);let c=e+s;a=new V(a.type,n,[c,t]),i&&(o=new V(`int64`,new BigInt64Array(c),[1,c]),o.data.fill(1n,0,e))}}let[s,c]=a.dims,l=this.config.stride;if(s%l!==0)throw Error(`The number of frames (${s}) must be a multiple of the stride (${l}).`);let u=a.view(1,Math.floor(s/l),c*l),d={input_features:u};if(i){let e=u.dims[1],t=new BigInt64Array(e);if(o){let e=o.data;for(let n=1,r=0;ne+t,0)/e.length,n=e.reduce((e,n)=>e+(n-t)**2,0)/e.length;return e.map(e=>(e-t)/Math.sqrt(n+1e-7))}async _call(e){zd(e,`Wav2Vec2FeatureExtractor`),e instanceof Float64Array&&(e=new Float32Array(e));let t=e;this.config.do_normalize&&(t=this._zero_mean_unit_var_norm(t));let n=[1,t.length];return{input_values:new V(`float32`,t,n),attention_mask:new V(`int64`,new BigInt64Array(t.length).fill(1n),n)}}},Of=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hamming`,{periodic:!1}),this.min_num_frames=this.config.min_num_frames}async _extract_fbank_features(e){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,transpose:!0,min_num_frames:this.min_num_frames})}async _call(e){zd(e,`WeSpeakerFeatureExtractor`);let t=(await this._extract_fbank_features(e)).unsqueeze_(0);if(this.config.fbank_centering_span===null){let e=t.mean(1).data,n=t.data,[r,i,a]=t.dims;for(let t=0;tr?(e.length>this.config.n_samples&&A.warn("Attempting to extract features for audio longer than 30 seconds. If using a pipeline to extract transcript from a long audio clip, remember to specify `chunk_length_s` and/or `stride_length_s`."),n=e.slice(0,r)):(n=new Float32Array(r),n.set(e)),{input_features:(await this._extract_fbank_features(n)).unsqueeze_(0)}}},jf=class{static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t),r=n.feature_extractor_type,i=Bd[r];if(!i)throw Error(`Unknown feature_extractor_type: '${r}'. Please report this at ${Nd}.`);return new i(n)}},Mf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;async _call(e,t=null){let n=this.tokenizer(e),r=t?await this.feature_extractor(t):{};return{...n,...r}}},Nf=/* @__PURE__ */ new Set([`ja`,`zh`]),Pf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;get_decoder_prompt_ids(e=`en`){let t=[`▁`,`<|startofcontext|>`,`<|startoftranscript|>`,`<|emo:undefined|>`,`<|${e}|>`,`<|${e}|>`,`<|pnc|>`,`<|noitn|>`,`<|notimestamp|>`,`<|nodiarize|>`];return this.tokenizer.convert_tokens_to_ids(t)}static join_chunks(e,t=`en`){let n=e.filter(e=>e&&e.trim());if(n.length===0)return``;let r=Nf.has(t)?``:` `;return[n[0].trimEnd(),...n.slice(1).map(e=>e.trim())].join(r)}async _call(e){return await this.feature_extractor(e)}},Ff={},If,Lf,Rf;if(O.IS_WEB_ENV)If=(e,t)=>{if(!self.OffscreenCanvas)throw Error(`OffscreenCanvas not supported by this environment.`);return new self.OffscreenCanvas(e,t)},Rf=self.createImageBitmap,Lf=self.ImageData;else if(Ff)Rf=async e=>{let t=(await e.metadata()).channels,{data:n,info:r}=await e.rotate().raw().toBuffer({resolveWithObject:!0}),i=new Vf(new Uint8ClampedArray(n),r.width,r.height,r.channels);return t!==void 0&&t!==r.channels&&i.convert(t),i};else throw Error(`Unable to load image processing library.`);var zf={0:`nearest`,1:`lanczos`,2:`bilinear`,3:`bicubic`,4:`box`,5:`hamming`},Bf=/* @__PURE__ */ new Map([[`png`,`image/png`],[`jpg`,`image/jpeg`],[`jpeg`,`image/jpeg`],[`gif`,`image/gif`]]),Vf=class e{constructor(e,t,n,r){this.data=e,this.width=t,this.height=n,this.channels=r}get size(){return[this.width,this.height]}static async read(t){if(t instanceof e)return t;if(typeof t==`string`||t instanceof URL)return await this.fromURL(t);if(t instanceof Blob)return await this.fromBlob(t);if(typeof HTMLCanvasElement<`u`&&t instanceof HTMLCanvasElement||typeof OffscreenCanvas<`u`&&t instanceof OffscreenCanvas)return this.fromCanvas(t);throw Error(`Unsupported input type: ${typeof t}`)}static fromCanvas(t){if(!O.IS_WEB_ENV)throw Error(`fromCanvas() is only supported in browser environments.`);let n=t.getContext(`2d`).getImageData(0,0,t.width,t.height).data;return new e(n,t.width,t.height,4)}static async fromURL(e){let t=await Jc(e);if(t.status!==200)throw Error(`Unable to read image from "${e}" (${t.status} ${t.statusText})`);let n=await t.blob();return this.fromBlob(n)}static async fromBlob(e){if(O.IS_WEB_ENV){let t=await Rf(e),n=If(t.width,t.height).getContext(`2d`);return n.drawImage(t,0,0),new this(n.getImageData(0,0,t.width,t.height).data,t.width,t.height,4)}{let t=Ff(await e.arrayBuffer());return await Rf(t)}}static fromTensor(t,n=`CHW`){if(t.dims.length!==3)throw Error(`Tensor should have 3 dimensions, but has ${t.dims.length} dimensions.`);if(n===`CHW`)t=t.permute(1,2,0);else if(n!==`HWC`)throw Error(`Unsupported channel format: ${n}`);if(!(t.data instanceof Uint8ClampedArray||t.data instanceof Uint8Array))throw Error(`Unsupported tensor type: ${t.type}`);switch(t.dims[2]){case 1:case 2:case 3:case 4:return new e(t.data,t.dims[1],t.dims[0],t.dims[2]);default:throw Error(`Unsupported number of channels: ${t.dims[2]}`)}}grayscale(){if(this.channels===1)return this;let e=new Uint8ClampedArray(this.width*this.height*1);switch(this.channels){case 3:case 4:for(let t=0,n=0;t=0?c=r:u=-r,i>=0?l=i:d=-i,s.drawImage(o,c,l,t,n,u,d,t,n),new e(s.getImageData(0,0,t,n).data,t,n,4).convert(a)}{let e=this.toSharp();if(r>=0&&i>=0)e=e.extract({left:Math.floor(r),top:Math.floor(i),width:t,height:n});else if(r<=0&&i<=0){let a=Math.floor(-i),o=Math.floor(-r);e=e.extend({top:a,left:o,right:t-this.width-o,bottom:n-this.height-a})}else{let a=[0,0],o=0;i<0?(a[0]=Math.floor(-i),a[1]=n-this.height-a[0]):o=Math.floor(i);let s=[0,0],c=0;r<0?(s[0]=Math.floor(-r),s[1]=t-this.width-s[0]):c=Math.floor(r),e=e.extend({top:a[0],bottom:a[1],left:s[0],right:s[1]}).extract({left:c,top:o,width:t,height:n})}return await Rf(e)}}async toBlob(e=`image/png`,t=1){if(!O.IS_WEB_ENV)throw Error(`toBlob() is only supported in browser environments.`);return await this.toCanvas().convertToBlob({type:e,quality:t})}toTensor(e=`CHW`){let t=new V(`uint8`,new Uint8Array(this.data),[this.height,this.width,this.channels]);if(e!==`HWC`){if(e===`CHW`)t=t.permute(2,0,1);else throw Error(`Unsupported channel format: ${e}`)}return t}toCanvas(){if(!O.IS_WEB_ENV)throw Error(`toCanvas() is only supported in browser environments.`);let e=this.clone().rgba(),t=If(e.width,e.height),n=new Lf(e.data,e.width,e.height);return t.getContext(`2d`).putImageData(n,0,0),t}split(){let{data:t,width:n,height:r,channels:i}=this,a=t.constructor,o=t.length/i,s=Array.from({length:i},()=>new a(o));for(let e=0;enew e(t,n,r,1))}_update(e,t,n,r=null){return this.data=e,this.width=t,this.height=n,r!==null&&(this.channels=r),this}clone(){return new e(this.data.slice(),this.width,this.height,this.channels)}convert(e){if(this.channels===e)return this;switch(e){case 1:this.grayscale();break;case 3:this.rgb();break;case 4:this.rgba();break;default:throw Error(`Conversion failed due to unsupported number of channels: ${this.channels}`)}return this}async save(e){if(O.IS_WEB_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save an image from a Web Worker.`);let t=e.split(`.`).pop().toLowerCase(),n=Bf.get(t)??`image/png`;return Hd(e,await this.toBlob(n))}if(O.IS_FS_AVAILABLE)await this.toSharp().toFile(e);else throw Error(`Unable to save the image because filesystem is disabled in this environment.`)}toSharp(){if(O.IS_WEB_ENV)throw Error(`toSharp() is only supported in server-side environments.`);return Ff(this.data,{raw:{width:this.width,height:this.height,channels:this.channels}})}};Vf.read.bind(Vf);function Hf(e,t,n=0,r=null){let i=e/t,a=gl(i)*t;return r!==null&&a>r&&(a=Math.floor(i)*t),at&&i.push(e)}else{let e=ll(n.data)[1];if(e===c-1||(a=ol(n.data),a[e]e*o[(t+1)%2])),u.boxes.push(n),u.classes.push(t),u.scores.push(a[t])}}l.push(u)}return l}function Kf(e,t=null){let n=e.logits,r=n.dims[0];if(t!==null&&t.length!==r)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let i=[];for(let e=0;el[n]&&(l[n]=t[n],u[n]=e)}let d=Array(a.dims[0]);for(let e=0;ee!==void 0);i.push({segmentation:c,labels:f})}return i}function qf(e,t,n,r){let i=[],a=[],o=[];for(let s=0;sn&&(i.push(l),a.push(d),o.push(u))}return[i,a,o]}function Jf(e,t,n,r=.5,i=.8){let a=[],o=0,s=0,c=t[n].data;for(let t=0;t=r&&++s;let l=o>0&&s>0;return l&&=o/s>i,[l,a]}function Yf(e,t,n,r,i,a=null,o=null){let[s,c]=o??e[0].dims,l=new V(`int32`,new Int32Array(s*c),[s,c]),u=[];if(o!==null)for(let t=0;tf[e]&&(d[e]=n,f[e]=i[e])}let p=0,m=l.data;for(let a=0;a200)throw Error(`absolute aspect ratio must be smaller than 200, got ${Math.max(e,t)/Math.min(e,t)}`);let o=Math.round(e/n)*n,s=Math.round(t/n)*n;if(a*o*s>i){let r=Math.sqrt(a*e*t/i);o=Math.max(n,Math.floor(e/r/n)*n),s=Math.max(n,Math.floor(t/r/n)*n)}else if(a*o*si?c=Math.floor(i*s/r):i>r&&(s=Math.floor(r*c/i)),await e.resize(c,s,{resample:n}))}async crop_margin(e,t=200){let n=e.clone().grayscale(),r=cl(n.data)[0],i=ll(n.data)[0]-r;if(i===0)return e;let a=t/255,o=n.width,s=n.height,c=0,l=0,u=n.data;for(let e=0;ethis.preprocess(e)));return{pixel_values:du(n.map(e=>e.pixel_values),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}static async from_pretrained(e,t={}){let n=await rl(e,Fd,!0,t);return new this(n)}},$f={};Sr($f,{BeitFeatureExtractor:()=>ep,BitImageProcessor:()=>tp,CHMv2ImageProcessor:()=>rp,CLIPFeatureExtractor:()=>ap,CLIPImageProcessor:()=>ip,ChineseCLIPFeatureExtractor:()=>np,ConvNextFeatureExtractor:()=>sp,ConvNextImageProcessor:()=>op,DINOv3ViTImageProcessor:()=>fp,DPTFeatureExtractor:()=>gp,DPTImageProcessor:()=>hp,DeiTFeatureExtractor:()=>lp,DeiTImageProcessor:()=>cp,DetrFeatureExtractor:()=>dp,DetrImageProcessor:()=>up,DonutFeatureExtractor:()=>mp,DonutImageProcessor:()=>pp,EfficientNetImageProcessor:()=>_p,GLPNFeatureExtractor:()=>wp,Gemma3ImageProcessor:()=>vp,Gemma4ImageProcessor:()=>xp,Glm46VImageProcessor:()=>Cp,GroundingDinoImageProcessor:()=>Tp,Idefics3ImageProcessor:()=>Ep,ImageFeatureExtractor:()=>K,ImageProcessor:()=>K,JinaCLIPImageProcessor:()=>Op,Lfm2VlImageProcessor:()=>Pp,LlavaOnevisionImageProcessor:()=>Fp,Mask2FormerImageProcessor:()=>Rp,MaskFormerFeatureExtractor:()=>Lp,MaskFormerImageProcessor:()=>Ip,MobileNetV1FeatureExtractor:()=>Bp,MobileNetV1ImageProcessor:()=>zp,MobileNetV2FeatureExtractor:()=>Hp,MobileNetV2ImageProcessor:()=>Vp,MobileNetV3FeatureExtractor:()=>Wp,MobileNetV3ImageProcessor:()=>Up,MobileNetV4FeatureExtractor:()=>Kp,MobileNetV4ImageProcessor:()=>Gp,MobileViTFeatureExtractor:()=>Jp,MobileViTImageProcessor:()=>qp,NougatImageProcessor:()=>Yp,OwlViTFeatureExtractor:()=>Zp,OwlViTImageProcessor:()=>Xp,Owlv2ImageProcessor:()=>Qp,Phi3VImageProcessor:()=>im,PixtralImageProcessor:()=>am,PvtImageProcessor:()=>om,Qwen2VLImageProcessor:()=>Sp,RTDetrImageProcessor:()=>sm,Sam2ImageProcessor:()=>cm,Sam3ImageProcessor:()=>cm,SamImageProcessor:()=>cm,SapiensFeatureExtractor:()=>um,SapiensImageProcessor:()=>lm,SegformerFeatureExtractor:()=>fm,SegformerImageProcessor:()=>dm,SiglipImageProcessor:()=>pm,SmolVLMImageProcessor:()=>Ep,Swin2SRImageProcessor:()=>mm,VLMImageProcessor:()=>Dp,ViTFeatureExtractor:()=>gm,ViTImageProcessor:()=>hm,VitMatteImageProcessor:()=>_m,VitPoseImageProcessor:()=>vm,YolosFeatureExtractor:()=>bm,YolosImageProcessor:()=>ym});var ep=class extends K{},tp=class extends K{},np=class extends K{},rp=class extends K{},ip=class extends K{},ap=class extends ip{},op=class extends K{constructor(e){super(e),this.crop_pct=this.config.crop_pct??224/256}async resize(e){let t=this.size?.shortest_edge;if(t===void 0)throw Error(`Size dictionary must contain 'shortest_edge' key.`);if(t<384){let n=Math.floor(t/this.crop_pct),[r,i]=this.get_resize_output_image_size(e,{shortest_edge:n});e=await e.resize(r,i,{resample:this.resample}),e=await e.center_crop(t,t)}else e=await e.resize(t,t,{resample:this.resample});return e}},sp=class extends op{},cp=class extends K{},lp=class extends cp{},up=class extends K{async _call(e){let t=await super._call(e),n=_u([t.pixel_values.dims[0],64,64],1n);return{...t,pixel_mask:n}}post_process_object_detection(...e){return Gf(...e)}post_process_panoptic_segmentation(...e){return Zf(...e)}post_process_instance_segmentation(...e){return Qf(...e)}},dp=class extends up{},fp=class extends K{},pp=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t,s=this.image_mean;Array.isArray(this.image_mean)||(s=Array(o).fill(s));let c=this.image_std;Array.isArray(c)||(c=Array(o).fill(s));let l=s.map((e,t)=>-e/c[t]);return super.pad_image(e,t,n,{center:!0,constant_values:l,...r})}},mp=class extends pp{},hp=class extends K{},gp=class extends hp{},_p=class extends K{constructor(e){super(e),this.include_top=this.config.include_top??!0,this.include_top&&(this.image_std=this.image_std.map(e=>e*e))}},vp=class extends K{};function yp(e,t,n,r,i){let a=r*n**2,o=Math.sqrt(a/(e*t)),s=i*n,c=Math.floor(o*e/s)*s,l=Math.floor(o*t/s)*s;if(c===0&&l===0)throw Error(`Attempting to resize to a 0 x 0 image. Resized height should be divisible by \`pooling_kernel_size * patch_size\`=${s}.`);let u=Math.floor(r/i**2)*s;return c===0?(c=s,l=Math.min(Math.floor(t/e)*s,u)):l===0&&(l=s,c=Math.min(Math.floor(e/t)*s,u)),[c,l]}function bp(e,t,n,r,i,a,o){let s=Math.floor(t/i),c=Math.floor(n/i),l=s*c,u=i*i*r,d=new Float32Array(a*u),f=0;for(let t=0;ta),0));let l=a.dims[0]/o,u=a.dims[1],d=Math.floor(a.dims[2]/c),f=Math.floor(a.dims[3]/c);return{pixel_values:a.view(l,o,u,Math.floor(d/s),s,c,Math.floor(f/s),s,c).permute(0,3,6,4,7,2,1,5,8).view(l*d*f,u*o*c*c),image_grid_thw:new V(`int64`,[l,d,f],[1,3]),original_sizes:r,reshaped_input_sizes:i}}},Cp=class extends Sp{get_resize_output_image_size(e,t){let n=this.patch_size*this.merge_size,r=this.config.temporal_patch_size??2;return Xf(e.height,e.width,n,this.min_pixels,this.max_pixels,r)}},wp=class extends K{},Tp=class extends K{async _call(e){let t=await super._call(e),n=t.pixel_values.dims,r=yu([n[0],n[2],n[3]]);return{...t,pixel_mask:r}}},Ep=class extends K{constructor(e){super(e),this.do_image_splitting=e.do_image_splitting??!0,this.max_image_size=e.max_image_size}get_resize_for_vision_encoder(e,t){let[n,r]=e.dims.slice(-2),i=r/n;return r>=n?(r=Math.ceil(r/t)*t,n=Math.floor(r/i),n=Math.ceil(n/t)*t):(n=Math.ceil(n/t)*t,r=Math.floor(n*i),r=Math.ceil(r/t)*t),{height:n,width:r}}async _call(e,{do_image_splitting:t=null,return_row_col_info:n=!1}={}){let r;if(!Array.isArray(e))r=[[e]];else{if(e.length===0||!e[0])throw Error(`No images provided.`);r=Array.isArray(e[0])?e:[e]}let i=[],a=[],o=[],s=[],c=[];for(let e of r){let n=await Promise.all(e.map(e=>this.preprocess(e)));s.push(...n.map(e=>e.original_size)),c.push(...n.map(e=>e.reshaped_input_size)),n.forEach(e=>e.pixel_values.unsqueeze_(0));let{longest_edge:r}=this.max_image_size,l;if(t??this.do_image_splitting){let e=Array(n.length),t=Array(n.length);l=await Promise.all(n.map(async(n,i)=>{let a=this.get_resize_for_vision_encoder(n.pixel_values,r),o=await nu(n.pixel_values,{size:[a.height,a.width]}),{frames:s,num_splits_h:c,num_splits_w:l}=await this.split_image(o,this.max_image_size);return e[i]=c,t[i]=l,H(s,0)})),a.push(e),o.push(t)}else{let e=[r,r];l=await Promise.all(n.map(t=>nu(t.pixel_values,{size:e}))),a.push(Array(n.length).fill(0)),o.push(Array(n.length).fill(0))}i.push(H(l,0))}let l=i.length,[u,d,f,p]=i[0].dims,m,h;if(l===1)m=i[0].unsqueeze_(0),h=_u([l,u,f,p],!0);else{let e=Math.max(...i.map(e=>e.dims.at(0)));h=_u([l,e,f,p],!0);let t=h.data,n=e*f*p;for(let r=0;rn||o>r){s=Math.ceil(a/n),c=Math.ceil(o/r);let t=Math.ceil(a/s),l=Math.ceil(o/c);for(let n=0;ne*this.rescale_factor)}pad_image(e,t,n,r){return super.pad_image(e,t,n,{constant_values:this.constant_values,center:!0,...r})}},Op=class extends K{constructor(e){let{resize_mode:t,fill_color:n,interpolation:r,size:i,...a}=e,o=t===`squash`?{width:i,height:i}:t===`shortest`?{shortest_edge:i}:{longest_edge:i},s=r===`bicubic`?3:2;super({...a,size:o,resample:s,do_center_crop:!0,crop_size:i,do_normalize:!0})}};function kp(e,t){return Math.round(e/t)*t}function Ap(e,t,n,r,i){let a=1/0,o=[1,1],s=n*r;for(let n of t){let t=Math.abs(e-n[0]/n[1]);t.5*i*i*n[0]*n[1]&&(o=n)}return o}function jp(e,t){let n=[],r=/* @__PURE__ */ new Set;for(let i=e;i<=t;++i)for(let a=1;a<=i;++a)for(let o=1;o<=i;++o){let i=a*o;if(i>=e&&i<=t){let e=a<<16|o;r.has(e)||(r.add(e),n.push([a,o]))}}return n.sort((e,t)=>e[0]*e[1]-t[0]*t[1])}function Mp(e,t){let[n,r,i,a]=e.dims,o=Math.floor(i/t),s=Math.floor(a/t),c=t*t*r,l=e.data,u=new Float32Array(n*o*s*c),d=i*a;for(let e=0;ethis.max_image_tokens*(this.encoder_patch_size*this.downsample_factor)**2*this.max_pixels_tolerance}_get_grid_layout(e,t){let n=jp(this.min_tiles,this.max_tiles),[r,i]=Ap(t/e,n,t,e,this.tile_size);return{grid_width:r,grid_height:i,target_width:this.tile_size*r,target_height:this.tile_size*i}}async _call(e,{return_row_col_info:t=null}={}){let n;n=Array.isArray(e)?Array.isArray(e[0])?e:[e]:[[e]];let r=[],i=[],a=[],o=[],s=[],c=[];for(let e of n){let t=await Promise.all(e.map(e=>this.preprocess(e,{do_pad:!1})));for(let{pixel_values:e}of t){let[,t,n]=e.dims,l=e.unsqueeze_(0),u=this.encoder_patch_size*this.downsample_factor,d=u**2,[f,p]=Xf(Math.max(u,t),Math.max(u,n),u,this.min_image_tokens*d,this.max_image_tokens*d).map(e=>Math.max(u,e)),m,h=1,g=1,_=this._is_image_too_large(t,n),v=this.do_image_splitting&&(this.min_tiles!==1||this.max_tiles!==1);if(_&&v){let{grid_width:e,grid_height:r,target_width:i,target_height:a}=this._get_grid_layout(t,n);h=r,g=e;let o=await nu(l,{size:[a,i]});m=[];for(let t=0;t(e-this.image_mean[t])/this.image_std[t]);return super.pad_image(e,t,{width:s,height:o},{center:!0,constant_values:c,...r})}async _call(e,{num_crops:t=null}={}){if(this._num_crops=t??=this.config.num_crops,t<4||rm(t)%1!=0)throw Error(`num_crops must be a square number >= 4`);Array.isArray(e)||(e=[e]);let n=e.length,r=await Promise.all(e.map(e=>this.preprocess(e))),i=r.map(e=>e.original_size),a=r.map(e=>e.reshaped_input_size),o=[];for(let{pixel_values:e}of r){e.unsqueeze_(0);let[n,r]=e.dims.slice(-2),i=await nu(e,{size:[$p,$p],mode:`bicubic`});if(t>0){let a=[],s=rm(t),c=nm(r/s),l=nm(n/s);for(let t=0;te.map(e=>$p*tm(e/$p)));return{pixel_values:s,original_sizes:i,reshaped_input_sizes:a,image_sizes:new V(`int64`,c.flat(),[n,2]),num_img_tokens:c.map(([e,t])=>this.calc_num_image_tokens_from_image_size(t,e))}}},am=class extends K{get_resize_output_image_size(e,t){let{longest_edge:n}=t;if(n===void 0)throw Error(`size must contain 'longest_edge'`);let[r,i]=e.size,a=Math.max(r,i)/n,o=r,s=i;a>1&&(o=Math.floor(r/a),s=Math.floor(i/a));let{patch_size:c,spatial_merge_size:l}=this.config;if(!l)throw Error(`config must contain 'spatial_merge_size'`);let u=c*l,d=Math.floor((o-1)/u)+1,f=Math.floor((s-1)/u)+1;return[d*u,f*u]}},om=class extends K{},sm=class extends K{post_process_object_detection(...e){return Gf(...e)}},cm=class extends K{reshape_input_points(e,t,n,r=!1){e=structuredClone(e);let i=ii(e);if(i.length===3)r||(i=[1,...i]),e=[e];else if(i.length!==4)throw Error("The input_points must be a 4D tensor of shape `batch_size`, `point_batch_size`, `nb_points_per_image`, `2`.");for(let r=0;re!==t.dims[n]))throw Error(`The first ${n.length} dimensions of 'input_points' and 'input_labels' must be the same.`);return new V(`int64`,e.flat(1/0).map(BigInt),n)}async _call(e,{input_points:t=null,input_labels:n=null,input_boxes:r=null}={}){let i=await super._call(e);if(t&&(i.input_points=this.reshape_input_points(t,i.original_sizes,i.reshaped_input_sizes)),n){if(!i.input_points)throw Error("`input_points` must be provided if `input_labels` are provided.");i.input_labels=this.add_input_labels(n,i.input_points)}return r&&(i.input_boxes=this.reshape_input_points(r,i.original_sizes,i.reshaped_input_sizes,!0)),i}async post_process_masks(e,t,n,{mask_threshold:r=0,binarize:i=!0,pad_size:a=null}={}){let o=[];a=a??this.pad_size??this.size;let s=[a.height,a.width];for(let a=0;ar&&(t[n]=1);u=new V(`bool`,t,u.dims)}o.push(u)}return o}generate_crop_boxes(e,t,{crop_n_layers:n=0,overlap_ratio:r=512/1500,points_per_crop:i=32,crop_n_points_downscale_factor:a=1}={}){}},lm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},um=class extends lm{},dm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},fm=class extends dm{},pm=class extends K{},mm=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t;return super.pad_image(e,t,{width:a+(n-a%n)%n,height:i+(n-i%n)%n},{mode:`symmetric`,center:!1,constant_values:-1,...r})}},hm=class extends K{},gm=class extends hm{},_m=class extends K{async _call(e,t){Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let n=await Promise.all(e.map(e=>this.preprocess(e))),r=await Promise.all(t.map(e=>this.preprocess(e,{do_normalize:!1,do_convert_rgb:!1,do_convert_grayscale:!0})));return{pixel_values:du(n.map((e,t)=>H([e.pixel_values,r[t].pixel_values],0)),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}},vm=class extends K{post_process_pose_estimation(e,t,{threshold:n=null}={}){let r=e.tolist(),[i,a,o,s]=e.dims,c=[];for(let e=0;e/gm,bboxes:/([^<]+)?/gm},this.size_per_bin=1e3}construct_prompts(e){typeof e==`string`&&(e=[e]);let t=[];for(let n of e)if(this.task_prompts_without_inputs.has(n))t.push(this.task_prompts_without_inputs.get(n));else{for(let[e,r]of this.task_prompts_with_input)if(n.includes(e)){t.push(r.replaceAll(`{input}`,n).replaceAll(e,``));break}t.length!==e.length&&t.push(n)}return t}post_process_generation(e,t,n){let r=this.tasks_answer_post_processing_type.get(t)??`pure_text`;e=e.replaceAll(``,``).replaceAll(``,``);let i;switch(r){case`pure_text`:i=e;break;case`description_with_bboxes`:case`bboxes`:case`phrase_grounding`:case`ocr`:let a=r===`ocr`?`quad_boxes`:`bboxes`,o=e.matchAll(this.regexes[a]),s=[],c=[];for(let[e,t,...r]of o)s.push(t?t.trim():s.at(-1)??``),c.push(r.map((e,t)=>(Number(e)+.5)/this.size_per_bin*n[t%2]));i={labels:s,[a]:c};break;default:throw Error(`Task "${t}" (of type "${r}") not yet implemented.`)}return{[t]:i}}async _call(e,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=await this.image_processor(e,n),i=t?this.tokenizer(this.construct_prompts(t),n):{};return{...r,...i}}},Cm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.image_seq_length=this.config.image_seq_length;let{boi_token:r,image_token:i,eoi_token:a}=this.tokenizer.config;this.boi_token=r,this.image_token=i,this.eoi_token=a;let o=i.repeat(this.image_seq_length);this.full_image_sequence=` - -${r}${o}${a} - -`}async _call(e,t=null,n={}){typeof e==`string`&&(e=[e]);let r;return t&&(r=await this.image_processor(t,n),e=e.map(e=>e.replaceAll(this.boi_token,this.full_image_sequence))),{...this.tokenizer(e,n),...r}}},wm=class extends G{static image_processor_class=xm;static feature_extractor_class=jf;static tokenizer_class=W;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_seq_length=this.config.audio_seq_length,this.image_seq_length=this.config.image_seq_length;let{audio_token_id:r,boa_token:i,audio_token:a,eoa_token:o,image_token_id:s,boi_token:c,image_token:l,eoi_token:u}=this.tokenizer.config;this.audio_token_id=r,this.boa_token=i,this.audio_token=a;let d=a.repeat(this.audio_seq_length);this.full_audio_sequence=` - -${i}${d}${o} - -`,this.image_token_id=s,this.boi_token=c,this.image_token=l;let f=l.repeat(this.image_seq_length);this.full_image_sequence=` - -${c}${f}${u} - -`}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;n&&(i=await this.feature_extractor(n,r),e=e.map(e=>e.replaceAll(this.audio_token,this.full_audio_sequence)));let a;return t&&(a=await this.image_processor(t,r),e=e.map(e=>e.replaceAll(this.image_token,this.full_image_sequence))),{...this.tokenizer(e,r),...a,...i}}},Tm=class extends G{static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_ms_per_token=this.config.audio_ms_per_token??40,this.audio_seq_length=this.config.audio_seq_length??750,this.image_seq_length=this.config.image_seq_length??280;let{audio_token:r,boa_token:i,eoa_token:a,image_token:o,boi_token:s,eoi_token:c}=this.tokenizer.config;this.audio_token=r,this.boa_token=i,this.eoa_token=a,this.image_token=o,this.boi_token=s,this.eoi_token=c}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([rl(e,Id,!0,t),W.from_pretrained(e,t),nl(e,Ld,!1,t)]),a={tokenizer:r};return n.image_processor&&(a.image_processor=new xp(n.image_processor)),n.feature_extractor&&(a.feature_extractor=new bf(n.feature_extractor)),new this(n,a,i)}_compute_audio_num_tokens(e,t){let n=Math.round(t*20/1e3),r=Math.round(t*10/1e3),i=Math.floor(n/2),a=Math.floor((e+i-n-1)/r)+1;if(a<=0)return 0;for(let e=0;e<2;++e)a=Math.floor((a-1)/2)+1;return Math.min(a,this.audio_seq_length)}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;if(t){i=await this.image_processor(t,r);let n=i.num_soft_tokens_per_image,a=0;e=e.map(e=>e.replaceAll(this.image_token,()=>` - -${this.boi_token}${this.image_token.repeat(n[a++])}${this.eoi_token} - -`))}let a;if(n){let t=Array.isArray(n)?n:[n];a=await this.feature_extractor(t[0],r);let i=this.feature_extractor.config.sampling_rate??16e3,o=0;e=e.map(e=>e.replaceAll(this.audio_token,()=>` - -${this.boa_token}${this.audio_token.repeat(this._compute_audio_num_tokens(t[o++].length,i))}${this.eoa_token} - -`))}return{...this.tokenizer(e,r),...i,...a}}},Em=class extends G{static image_processor_class=xm;static tokenizer_class=W;static image_token=`<|image_pad|>`;async _call(e,t=null,...n){Array.isArray(e)||(e=[e]);let r,i;if(t&&(r=await this.image_processor(t),i=r.image_grid_thw),i){let t=this.image_processor.config.merge_size**2,n=0,r=this.constructor.image_token,a=i.tolist();e=e.map(e=>{for(;e.includes(r);){let i=Number(a[n++].reduce((e,t)=>e*t,1n));e=e.replace(r,`<|placeholder|>`.repeat(Math.floor(i/t)))}return e.replaceAll(`<|placeholder|>`,r)})}return{...this.tokenizer(e),...r}}},Dm=class extends Em{static image_token=`<|image|>`},Om=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;_get_num_audio_features(e){let{hop_length:t}=this.feature_extractor.config.melspec_kwargs,{projector_window_size:n,projector_downsample_rate:r}=this.feature_extractor.config,i=Math.floor(n/r),a=Math.floor(e/t)+1,o=Math.floor(a/2);return Math.ceil(o/n)*i}async _call(e,t=null,n={}){if(Array.isArray(e))throw Error(`Batched inputs are not supported yet.`);let r={};if(t){let{input_features:n}=await this.feature_extractor(t);r.input_features=n;let i=this._get_num_audio_features(t.length);r.input_features_mask=new V(`bool`,new Uint8Array(i).fill(1),[1,i]);let a=this.config.audio_token??`<|audio|>`;if(!e.includes(a))throw Error(`The input text does not contain the audio token ${a}.`);e=e.replaceAll(a,a.repeat(i))}return{...this.tokenizer(e,{add_special_tokens:!1,...n}),...r}}};function km(e,t){let n=e.dims.at(-1)-1,r=e.tolist();r.fill(!1,0,1),r.fill(!1,n);let i=t.tolist();return r.map((e,t)=>e?t:null).filter(e=>e!==null).map(e=>i[e])}var Am=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t,n={}){let r=e?await this.image_processor(e,n):{};return{...t?this.tokenizer(t,n):{},...r}}post_process_grounded_object_detection(e,t,{box_threshold:n=.25,text_threshold:r=.25,target_sizes:i=null}={}){let{logits:a,pred_boxes:o}=e,s=a.dims[0];if(i!==null&&i.length!==s)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let c=a.dims.at(1),l=a.sigmoid(),u=l.max(-1).tolist(),d=o.tolist().map(e=>e.map(e=>Wf(e))),f=[];for(let e=0;ee.map((e,t)=>e*a[(t+1)%2])));let o=u[e],s=[],p=[],m=[];for(let i=0;i`+i.repeat(e);o+=` -`}return o+=` -${r}${a}`+i.repeat(e)+`${r}`,o}function Mm(e,t,n,r){return`${t}${r}`+n.repeat(e)+`${t}`}function Nm(e,t,n,r,i,a){return e===0&&t===0?Mm(n,r,i,a):jm(n,e,t,r,i,a)}var Pm=class extends G{static image_processor_class=xm;static tokenizer_class=W;static uses_processor_config=!0;fake_image_token=``;image_token=``;global_img_token=``;async _call(e,t=null,n={}){n.return_row_col_info??=!0;let r;t&&(r=await this.image_processor(t,n)),Array.isArray(e)||(e=[e]);let i=r.rows??[Array(e.length).fill(0)],a=r.cols??[Array(e.length).fill(0)],o=this.config.image_seq_len,s=[],c=[];for(let t=0;tNm(e,l[t],o,this.fake_image_token,this.image_token,this.global_img_token)),d=n.split(this.image_token);if(d.length===0)throw Error(`The image token should be present in the text.`);let f=d[0];for(let e=0;ee.images).flatMap(e=>e.images).map(e=>Vf.read(e)));let r=this.tokenizer,i=r.apply_chat_template(e,{tokenize:!1,add_generation_prompt:!0,chat_template:n}),a=e=>r.encode(e,{add_special_tokens:!1}),o=i.split(this.image_tag),s=o.length-1;if(t.length!==s)throw Error(`Number of images provided (${t.length}) does not match number of "${this.image_tag}" image tags (${s})`);let[c,l,u]=r.convert_tokens_to_ids([this.image_tag,this.image_start_tag,this.image_end_tag]),d=a(o[0]),f=Array(d.length).fill(!1);for(let e=1;e0){let e=await this.image_processor(t);return e.pixel_values.unsqueeze_(0),{...m,...e}}return m}},Im=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e=null,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=e?this.tokenizer(e,n):{},i=t?await this.image_processor(t,n):{};return{...r,...i}}},Lm=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t=null,n={}){let{image_rows:r,image_cols:i,image_sizes:a,...o}=await this.image_processor(e,{...n,return_row_col_info:!0});if(t){let e=this.config.image_token??``,{tile_size:n=512,downsample_factor:o=2,encoder_patch_size:s=16,use_thumbnail:c=!0}=this.image_processor.config,l=e=>Math.ceil(Math.floor(e/s)/o),u=l(n)**2,d=this.config.image_start_token??`<|image_start|>`,f=this.config.image_end_token??`<|image_end|>`,p=this.config.image_thumbnail??`<|img_thumbnail|>`;Array.isArray(t)||(t=[t]);let m=0;t=t.map(t=>{let n=t.split(e);return n[0]+n.slice(1).map(t=>{let n=m++,[o,s]=a[n],h=r[n],g=i[n],_=l(o)*l(s),v=d;if(h>1||g>1){let t=e.repeat(u);for(let e=0;e`+t;c&&(v+=p+e.repeat(_))}else v+=e.repeat(_);return v+f+t}).join(``)})}return{...o,...t?this.tokenizer(t,n):{}}}},Rm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,patch_size:a,num_additional_image_tokens:o}=this.config,s=Math.floor(e/a)*Math.floor(n/a)+o;t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;e0?i.reduce((e,t)=>e*t,1):0;c.push(n),s.push(a)}return[i(c),s]}char_decode(e){return this.char_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}bpe_decode(e){return this.bpe_tokenizer.batch_decode(e)}wp_decode(e){return this.wp_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}batch_decode([e,t,n]){let[r,i]=this._decode_helper(e,`char`),[a,o]=this._decode_helper(t,`bpe`),[s,c]=this._decode_helper(n,`wp`),l=[],u=[];for(let e=0;e`;function Wm(e,t,n,r,i){return`${r.repeat(n*i)}${t}${e} -`}var Gm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!1;async _call(e,t=null,n={}){t||=(A.warn(`You are using PaliGemma without a text prefix. It will perform as a picture-captioning model.`),``),Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let r=this.tokenizer.bos_token,i=this.image_processor.config.image_seq_length,a;t.some(e=>e.includes(Um))?a=t.map(e=>{let t=e.replaceAll(Um,Um.repeat(i)),n=t.lastIndexOf(Um),a=n===-1?0:n+Um.length;return t.slice(0,a)+r+t.slice(a)+` -`}):(A.warn("You are passing both `text` and `images` to `PaliGemmaProcessor`. The processor expects special image tokens in the text, as many tokens as there are images per each text. It is recommended to add `` tokens in the very beginning of your text. For this call, we will infer how many images each text has and add special tokens."),a=t.map(t=>Wm(t,r,i,Um,e.length)));let o=this.tokenizer(a,n);return{...await this.image_processor(e,n),...o}}},Km=`<|image|>`,qm=/<\|image_\d+\|>/g,Jm=class extends G{static image_processor_class=xm;static tokenizer_class=W;async _call(e,t=null,{padding:n=!0,truncation:r=!0,num_crops:i=null}={}){Array.isArray(e)||(e=[e]);let a,o;if(t){o=await this.image_processor(t,{num_crops:i});let{num_img_tokens:s}=o,c=e.map((e,t)=>e.split(qm).join(Km.repeat(s[t])));a=this.tokenizer(c,{padding:n,truncation:r});let l=this.tokenizer._tokenizer.token_to_id(Km);a.input_ids.map_(e=>e==l?-e:e)}else a=this.tokenizer(e);return{...a,...o}}},Ym=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,image_break_token:a,image_end_token:o,patch_size:s,spatial_merge_size:c}=this.config,l=s*c,u=Math.floor(e/l),d=Math.floor(n/l);t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;esh(e,o)),c=s.map(e=>e.length),l=s.flat(),u=(await Promise.all(l.map(e=>this.feature_extractor(e,n)))).map(e=>e.input_features);r.audio_values=u.length>1?H(u,0):u[0];let d=i[0];for(let e=0;e0){if(l>Tc)throw Error(`The number of external data chunks (${l}) exceeds the maximum allowed value (${Tc}).`);let t=Th(o,l);for(let n of t){let t=`${r.subfolder??``}/${n}`;c.push(new Promise(async(i,a)=>{let o=await tl(e,t,!0,r,s);i(o instanceof Uint8Array?{path:n,data:o}:n)}))}}else a.externalData!==void 0&&(c=a.externalData.map(async t=>{if(typeof t.data==`string`){let n=await tl(e,t.data,!0,r);return{...t,data:n}}return t}));return Promise.all(c)}async function Oh(e,t,n,r=!1,i=void 0){let a=n.config?.[`transformers.js_config`]??{},o=Gl(n.device??a.device,t,{warn:e=>A.info(e)}),s=jl(o),c=a.device_config??{};c.hasOwnProperty(o)&&(a={...a,...c[o]});let l=Zl(n.dtype??a.dtype,t,o,{configDtype:a.dtype,warn:e=>A.info(e)});if(!Xl.hasOwnProperty(l))throw Error(`Invalid dtype: ${l}. Should be one of: ${Object.keys(ql).join(`, `)}`);if(o===`webgpu`&&!O.IS_NODE_ENV&&l===ql.fp16&&!await Kl())throw Error(`The device (${o}) does not support fp16.`);let u=Xl[l],d={...n.session_options};d.executionProviders??=s;let f=a.free_dimension_overrides;f?d.freeDimensionOverrides??=f:o.startsWith(`webnn`)&&!d.freeDimensionOverrides&&A.warn(`WebNN does not currently support dynamic shapes and requires 'free_dimension_overrides' to be set in config.json, preferably as a field within config["transformers.js_config"]["device_config"]["${o}"]. When 'free_dimension_overrides' is not set, you may experience significant performance degradation.`);let p=Eh(e,t,n,u),m=await Dh(e,t,u,n,n.use_external_data_format??a.use_external_data_format,d);if(m.length>0&&(!O.IS_NODE_ENV||m.some(e=>typeof e!=`string`))&&(d.externalData=m),r&&o===`webgpu`){let e=bh(n.config,{prefix:`present`,session_name:i});if(e.size>0&&!Bl()){let t={};for(let n of e)t[n]=`gpu-buffer`;d.preferredOutputLocation=t}}return{buffer_or_path:await p,session_options:d,session_config:{dtype:l,device:o}}}async function kh(e,t,n,r=void 0){return Object.fromEntries(await Promise.all(Object.keys(t).map(async i=>{let a=r?.[i]??!1,{buffer_or_path:o,session_options:s,session_config:c}=await Oh(e,t[i],n,a,i);return[i,await Fl(o,s,c)]})))}function Ah(e){for(let t in e)Rl(e[t])?e[t]=new V(e[t]):typeof e[t]==`object`&&Ah(e[t]);return e}async function q(e,t){let n=jh(e,t);try{return Ah(await Ll(e,Object.fromEntries(Object.entries(n).map(([e,t])=>{let n=t.ort_tensor;return O.IS_NODE_ENV&&typeof Float16Array<`u`&&n.cpuData instanceof Float16Array&&(n.cpuData=new Uint16Array(n.cpuData.buffer)),[e,n]}))))}catch(e){let t=Object.fromEntries(Object.entries(n).map(([e,t])=>{let n={type:t.type,dims:t.dims,location:t.location};return n.location!==`gpu-buffer`&&(n.data=t.data),[e,n]}));throw A.error(`An error occurred during model execution: "${e}".`),A.error(`Inputs given to model:`,t),e}}function jh(e,t){let n=/* @__PURE__ */ Object.create(null),r=[];for(let i of e.inputNames){let e=t[i];if(!(e instanceof V)){r.push(i);continue}n[i]=Bl()?e.clone():e}if(r.length>0)throw Error(`An error occurred during model execution: "Missing the following inputs: ${r.join(`, `)}.`);let i=Object.keys(t).length,a=e.inputNames.length;if(i>a){let n=Object.keys(t).filter(t=>!e.inputNames.includes(t));A.warn(`WARNING: Too many inputs were provided (${i} > ${a}). The following inputs will be ignored: "${n.join(`, `)}".`)}return n}var Mh=class{},Nh=class extends Mh{constructor({last_hidden_state:e,hidden_states:t=null,attentions:n=null}){super(),this.last_hidden_state=e,this.hidden_states=t,this.attentions=n}},J=class extends Mh{constructor({logits:e,...t}){super(),this.logits=e;let n=Object.values(t);n.length>0&&(this.attentions=n)}},Ph=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Fh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Ih=class extends Mh{constructor({start_logits:e,end_logits:t}){super(),this.start_logits=e,this.end_logits=t}},Lh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Rh=class extends Mh{constructor({logits:e,past_key_values:t}){super(),this.logits=e,this.past_key_values=t}},zh=class extends Mh{constructor({logits:e,past_key_values:t,encoder_outputs:n,decoder_attentions:r=null,cross_attentions:i=null}){super(),this.logits=e,this.past_key_values=t,this.encoder_outputs=n,this.decoder_attentions=r,this.cross_attentions=i}},Bh=class extends Mh{constructor({alphas:e}){super(),this.alphas=e}},Vh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Hh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Uh=class extends $r{constructor(){super(),this.processors=[]}push(e){this.processors.push(e)}extend(e){this.processors.push(...e)}_call(e,t){let n=t;for(let t of this.processors)n=t(e,n);return n}[Symbol.iterator](){return this.processors.values()}},Wh=class extends Vh{constructor(e){super(),this.bos_token_id=e}_call(e,t){for(let n=0;n=1&&i[i.length-1]>=this.timestamp_begin,o=i.length<2||i[i.length-2]>=this.timestamp_begin;if(a&&(o?r.subarray(this.timestamp_begin).fill(-1/0):r.subarray(0,this.eos_token_id).fill(-1/0)),e[n].length===this.begin_index&&this.max_initial_timestamp_index!==null){let e=this.timestamp_begin+this.max_initial_timestamp_index;r.subarray(e+1).fill(-1/0)}let s=sl(r);Math.log(s.subarray(this.timestamp_begin).map(Math.exp).reduce((e,t)=>e+t))>ll(s.subarray(0,this.timestamp_begin))[0]&&r.subarray(0,this.timestamp_begin).fill(-1/0)}return t}},Yh=class extends Vh{constructor(e){super(),this.no_repeat_ngram_size=e}getNgrams(e){let t=e.length,n=[];for(let r=0;r1 to use the classifier-free guidance processor, got guidance scale ${e}.`);this.guidance_scale=e}_call(e,t){if(t.dims[0]!==2*e.length)throw Error(`Logits should have twice the batch size of the input ids, the first half of batches corresponding to the conditional inputs, and the second half of batches corresponding to the unconditional inputs. Got batch size ${t.dims[0]} for the logits and ${e.length} for the input ids.`);let n=e.length,r=t.slice([0,n],null),i=t.slice([n,t.dims[0]],null);for(let e=0;ee.length>=this.max_length)}},og=class extends rg{constructor(e){super(),Array.isArray(e)||(e=[e]),this.eos_token_id=e}_call(e,t){return e.map(e=>{let t=e.at(-1);return this.eos_token_id.some(e=>t==e)})}},sg=class extends $r{constructor(e){super(),this.generation_config=e}async _call(e){return this.sample(e)}async sample(e){throw Error(`sample should be implemented in subclasses.`)}getLogits(e,t){let n=e.dims.at(-1),r=e.data;if(t===-1)r=r.slice(-n);else{let e=t*n;r=r.slice(e,e+n)}return r}randomSelect(e){return xc(e)}static getSampler(e){if(e.do_sample)return new lg(e);if(e.num_beams>1)return new ug(e);if(e.num_return_sequences>1)throw Error(`num_return_sequences has to be 1 when doing greedy search, but is ${e.num_return_sequences}.`);return new cg(e)}},cg=class extends sg{async sample(e){let t=ll(e.data)[1];return[[BigInt(t),0]]}},lg=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},()=>{let e=this.randomSelect(i);return[r.data[e],Math.log(i[e])]})}},ug=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},(e,t)=>[r.data[t],Math.log(i[t])])}},dg=class{constructor(e){if(e)for(let t in e){if(t in this)throw TypeError(`Key "${t}" conflicts with an existing property on DynamicCache`);let n=e[t];if(!(n instanceof V))throw TypeError(`Expected a Tensor for key "${t}", got ${typeof n}`);this[t]=n}}get_seq_length(){let e=this;if(Object.keys(e).length===0)return 0;for(let t in e)if(t.startsWith(`past_key_values.`))return e[t].dims.at(-2);throw Error(`Unable to determine sequence length from the cache.`)}update(e){for(let t in e){let n=this[t],r=e[t];n&&n!==r&&n.location===`gpu-buffer`&&n.dispose(),this[t]=r}}async dispose(){let e=[];for(let t of Object.values(this))t.location===`gpu-buffer`&&e.push(t.dispose());await Promise.all(e)}},Y={EncoderOnly:0,EncoderDecoder:1,Seq2Seq:2,Vision2Seq:3,DecoderOnly:4,DecoderOnlyWithoutHead:5,MaskGeneration:6,ImageTextToText:7,Musicgen:8,MultiModality:9,Phi3V:10,AudioTextToText:11,AutoEncoder:12,ImageAudioTextToText:13,Supertonic:14,Chatterbox:15,VoxtralRealtime:16},fg={[Y.DecoderOnly]:{sessions:(e,t)=>({model:t.model_file_name??`model`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.DecoderOnlyWithoutHead]:{sessions:(e,t)=>({model:t.model_file_name??`model`})},[Y.Seq2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Vision2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Musicgen]:{sessions:()=>({model:`text_encoder`,decoder_model_merged:`decoder_model_merged`,encodec_decode:`encodec_decode`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.EncoderDecoder]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0}},[Y.MaskGeneration]:{sessions:()=>({model:`vision_encoder`,prompt_encoder_mask_decoder:`prompt_encoder_mask_decoder`})},[Y.ImageTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageTextToText].text_only_sessions};return n||(r.vision_encoder=`vision_encoder`),e.is_encoder_decoder&&(r.model=`encoder_model`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.AudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.ImageAudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageAudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`,r.vision_encoder=`vision_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Phi3V]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`model`,vision_encoder:`vision_encoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.MultiModality]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`language_model`,lm_head:`lm_head`,gen_head:`gen_head`,gen_img_embeds:`gen_img_embeds`,image_decode:`image_decode`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AutoEncoder]:{sessions:()=>({encoder_model:`encoder_model`,decoder_model:`decoder_model`})},[Y.Supertonic]:{sessions:()=>({text_encoder:`text_encoder`,latent_denoiser:`latent_denoiser`,voice_decoder:`voice_decoder`})},[Y.Chatterbox]:{sessions:()=>({embed_tokens:`embed_tokens`,speech_encoder:`speech_encoder`,model:`language_model`,conditional_decoder:`conditional_decoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.VoxtralRealtime]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.VoxtralRealtime].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0,audio_encoder:!0},optional_configs:{generation_config:`generation_config.json`}},default:{sessions:(e,t)=>({model:t.model_file_name??`model`})}};function pg(e,t,n={}){let r=fg[e]??fg.default;return{sessions:r.sessions(t,n,n.textOnly??!1),cache_sessions:r.cache_sessions,optional_configs:r.optional_configs}}function mg(e,{warn:t=!0}={}){let n=e.architectures||[];for(let e of n){let t=Cg.get(e);if(t!==void 0)return t}if(e.model_type){let t=Cg.get(e.model_type);if(t!==void 0)return t;for(let t of Object.values(_g))if(t.has(e.model_type)){let n=Cg.get(t.get(e.model_type));if(n!==void 0)return n}}if(t){let t=n.length>0?n.join(`, `):`(none)`;A.warn(`[resolve_model_type] Architecture(s) not found in MODEL_TYPE_MAPPING: [${t}] for model type '${e.model_type}'. Falling back to EncoderOnly (single model.onnx file). If you encounter issues, please report at: ${Nd}`)}return Y.EncoderOnly}function hg(e,{config:t=null,cache_dir:n=null,local_files_only:r=!1,revision:i=`main`}={}){return t===null?Wc(Ac(e,{cache_dir:n,local_files_only:r,revision:i}),()=>Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})):Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})}async function gg(e,{config:t=null,dtype:n=null,device:r=null,model_file_name:i=null}={}){t=await hg(e,{config:t});let a=[`config.json`],o=t[`transformers.js_config`]??{},s=o.use_external_data_format,c=`onnx`,l=r??o.device,u=n??o.dtype,d=mg(t),f=(e,t=null)=>{t??=e;let n=Gl(l,e),r=Xl[Zl(u,e,n)]??``,i=`${t}${r}.onnx`,o=`${c}/${i}`;a.push(o);let d=wh(s,i,e);for(let e of Th(i,d)){let t=`${c}/${e}`;a.push(t)}},{sessions:p,optional_configs:m}=pg(d,t,{model_file_name:i});for(let[e,t]of Object.entries(p))f(e,t);if(m)for(let e of Object.values(m))a.push(e);return a}var _g=null;function vg(e){_g=e}function yg(e){if(e instanceof V)return e;if(e.length===0)throw Error(`items must be non-empty`);if(Array.isArray(e[0])){if(e.some(t=>t.length!==e[0].length))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' and/or 'truncation=True' to have batched tensors with the same length.`);return new V(`int64`,BigInt64Array.from(e.flat().map(e=>BigInt(e))),[e.length,e[0].length])}return new V(`int64`,BigInt64Array.from(e.map(e=>BigInt(e))),[1,e.length])}function bg(e){return new V(`bool`,[e],[1])}var xg={[Y.DecoderOnly]:{can_generate:!0,forward:Pg,prepare_inputs:Bg},[Y.DecoderOnlyWithoutHead]:{can_generate:!1,forward:Pg,prepare_inputs:Bg},[Y.Seq2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Vision2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Musicgen]:{can_generate:!0,forward:Eg},[Y.EncoderDecoder]:{can_generate:!1,forward:Eg},[Y.ImageTextToText]:{can_generate:!0,forward:Lg,prepare_inputs:Hg},[Y.AudioTextToText]:{can_generate:!0,forward:Ig,prepare_inputs:Hg},[Y.ImageAudioTextToText]:{can_generate:!0,prepare_inputs:Hg},[Y.Phi3V]:{can_generate:!0,prepare_inputs:Hg},[Y.MultiModality]:{can_generate:!0},[Y.AutoEncoder]:{can_generate:!1,forward:Og},[Y.Chatterbox]:{can_generate:!0,forward:Dg},[Y.VoxtralRealtime]:{can_generate:!0,prepare_inputs:Bg},default:{can_generate:!1,forward:Dg}};function Sg(e,t){let n=Cg.get(e),r=!1,i=t?.architectures?.[0];if(i&&i!==e&&e?.endsWith(`ForCausalLM`)&&i.endsWith(`ForConditionalGeneration`)){let e=Cg.get(i);e!==void 0&&(n=e,r=!0)}let a=xg[n]??xg.default,o=fg[n]??fg.default;return{typeConfig:{...a,...o},textOnly:r,modelType:n}}var Cg=/* @__PURE__ */ new Map,wg=/* @__PURE__ */ new Map,Tg=/* @__PURE__ */ new Map,X=class extends $r{main_input_name=`input_ids`;forward_params=[`input_ids`,`attention_mask`];_return_dict_in_generate_keys=null;constructor(e,t,n){super(),this.config=e,this.sessions=t,this.configs=n;let{typeConfig:r}=Sg(Tg.get(this.constructor),e);this.can_generate=r.can_generate,this._forward=r.forward,this._prepare_inputs_for_generation=r.prepare_inputs,this.can_generate&&this.forward_params.push(`past_key_values`),this.custom_config=this.config[`transformers.js_config`]??{}}async dispose(){let e=[];for(let t of Object.values(this.sessions))e.push(t.release?.());return await Promise.all(e)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d},p=Tg.get(this);n=f.config=await Ch.from_pretrained(e,f);let{typeConfig:m,textOnly:h,modelType:g}=Sg(p,n);if(g===void 0){let e=p??n?.model_type;e!==`custom`&&A.warn(`Model type for '${e}' not found, assuming encoder-only architecture. Please report this at ${Nd}.`)}if(t&&!(t instanceof ti)){let r={};try{let t=await gg(e,{config:n,dtype:l,device:c,model_file_name:o});(await Promise.all(t.map(t=>Kc(e,t,f)))).forEach((e,n)=>{if(e.exists){let i=t[n]===`config.json`;r[t[n]]={loaded:i?e.size??0:0,total:e.size??0}}})}catch(e){A.warn(`Unable to fetch model file metadata for total progress tracking: ${e}`)}Object.keys(r).length>0&&(f.progress_callback=new ti(t,r))}let _=[kh(e,m.sessions(n,f,h),f,m.cache_sessions)];m.optional_configs&&_.push(Kg(e,m.optional_configs,f));let v=await Promise.all(_);return new this(n,...v)}async _call(e){return await this.forward(e)}async forward(e){return await this._forward(this,e)}get generation_config(){return this.configs?.generation_config??null}_get_logits_processor(e,t,n=null){let r=new Uh;if(e.repetition_penalty!==null&&e.repetition_penalty!==1&&r.push(new Xh(e.repetition_penalty)),e.no_repeat_ngram_size!==null&&e.no_repeat_ngram_size>0&&r.push(new Yh(e.no_repeat_ngram_size)),e.bad_words_ids!==null&&r.push(new $h(e.bad_words_ids,e.eos_token_id)),e.min_length!==null&&e.eos_token_id!==null&&e.min_length>0&&r.push(new Zh(e.min_length,e.eos_token_id)),e.min_new_tokens!==null&&e.eos_token_id!==null&&e.min_new_tokens>0&&r.push(new Qh(t,e.min_new_tokens,e.eos_token_id)),e.forced_bos_token_id!==null&&r.push(new Wh(e.forced_bos_token_id)),e.forced_eos_token_id!==null&&r.push(new Gh(e.max_length,e.forced_eos_token_id)),e.suppress_tokens!==null&&r.push(new Kh(e.suppress_tokens)),e.begin_suppress_tokens!==null){let n=t>1||e.forced_bos_token_id===null?t:t+1;r.push(new qh(e.begin_suppress_tokens,n))}return e.guidance_scale!==null&&e.guidance_scale>1&&r.push(new eg(e.guidance_scale)),e.temperature===0&&e.do_sample&&(A.warn("`do_sample` changed to false because `temperature: 0` implies greedy sampling (always selecting the most likely token), which is incompatible with `do_sample: true`."),e.do_sample=!1),e.do_sample&&e.temperature!==null&&e.temperature!==1&&r.push(new tg(e.temperature)),n!==null&&r.extend(n),r}_prepare_generation_config(e,t,n=ng){let r={...this.config};for(let e of[`decoder`,`generator`,`text_config`])e in r&&Object.assign(r,r[e]);let i=new n(r);return Object.assign(i,this.generation_config??{}),e&&Object.assign(i,e),t&&Object.assign(i,ci(t,Object.getOwnPropertyNames(i))),i}_get_stopping_criteria(e,t=null){let n=new ig;return e.max_length!==null&&n.push(new ag(e.max_length,this.config.max_position_embeddings??null)),e.eos_token_id!==null&&n.push(new og(e.eos_token_id)),t&&n.extend(t),n}_validate_model_class(){if(!this.can_generate){let e=[_g.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES,_g.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES].filter(Boolean),t=Tg.get(this.constructor),n=/* @__PURE__ */ new Set,r=this.config.model_type;for(let t of e){let e=t?.get(r);e&&n.add(e)}let i=`The current model class (${t}) is not compatible with \`.generate()\`, as it doesn't have a language model head.`;throw n.size>0&&(i+=` Please use the following class instead: ${[...n].join(`, `)}`),Error(i)}}prepare_inputs_for_generation(...e){if(!this._prepare_inputs_for_generation)throw Error(`prepare_inputs_for_generation is not implemented for this model.`);return this._prepare_inputs_for_generation(this,...e)}_update_model_kwargs_for_generation({generated_input_ids:e,outputs:t,model_inputs:n,is_encoder_decoder:r}){return n.past_key_values=kg(t,n.past_key_values),n.input_ids=new V(`int64`,e.flat(),[e.length,1]),r?`decoder_attention_mask`in n&&(n.decoder_attention_mask=H([n.decoder_attention_mask,yu([n.decoder_attention_mask.dims[0],1])],1)):n.attention_mask=H([n.attention_mask,yu([n.attention_mask.dims[0],1])],1),n.position_ids=null,n}_prepare_model_inputs({inputs:e,bos_token_id:t,model_kwargs:n}){let r=ci(n,this.forward_params),i=this.main_input_name;if(i in r){if(e)throw Error("`inputs`: {inputs}` were passed alongside {input_name} which is not allowed. Make sure to either pass {inputs} or {input_name}=...")}else r[i]=e;return{inputs_tensor:r[i],model_inputs:r,model_input_name:i}}async _prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:e,model_inputs:t,model_input_name:n,generation_config:r}){if(this.sessions.model.inputNames.includes(`inputs_embeds`)&&!t.inputs_embeds&&`_prepare_inputs_embeds`in this){let{input_ids:e,pixel_values:n,attention_mask:r,...i}=t,a=await this._prepare_inputs_embeds(t);t={...i,...ci(a,[`inputs_embeds`,`attention_mask`])}}let{last_hidden_state:i}=await Dg(this,t);if(r.guidance_scale!==null&&r.guidance_scale>1)i=H([i,vu(i,0)],0),`attention_mask`in t&&(t.attention_mask=H([t.attention_mask,Su(t.attention_mask)],0));else if(t.decoder_input_ids){let e=yg(t.decoder_input_ids).dims[0];if(e!==i.dims[0]){if(i.dims[0]!==1)throw Error(`The encoder outputs have a different batch size (${i.dims[0]}) than the decoder inputs (${e}).`);i=H(Array.from({length:e},()=>i),0)}}return t.encoder_outputs=i,t}_prepare_decoder_input_ids_for_generation({batch_size:e,model_input_name:t,model_kwargs:n,decoder_start_token_id:r,bos_token_id:i,generation_config:a}){let{decoder_input_ids:o,...s}=n;if(!(o instanceof V)){if(o)Array.isArray(o[0])||(o=Array.from({length:e},()=>o));else if(r??=i,this.config.model_type===`musicgen`)o=Array.from({length:e*this.config.decoder.num_codebooks},()=>[r]);else if(Array.isArray(r)){if(r.length!==e)throw Error(`\`decoder_start_token_id\` expected to have length ${e} but got ${r.length}`);o=r}else o=Array.from({length:e},()=>[r]);o=yg(o)}return s.decoder_attention_mask=bu(o),{input_ids:o,model_inputs:s}}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,streamer:i=null,...a}){this._validate_model_class(),t=this._prepare_generation_config(t,a);let{inputs_tensor:o,model_inputs:s,model_input_name:c}=this._prepare_model_inputs({inputs:e,model_kwargs:a}),l=this.config.is_encoder_decoder;l&&(`encoder_outputs`in s||(s=await this._prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:o,model_inputs:s,model_input_name:c,generation_config:t})));let u;l?{input_ids:u,model_inputs:s}=this._prepare_decoder_input_ids_for_generation({batch_size:s[c].dims.at(0),model_input_name:c,model_kwargs:s,decoder_start_token_id:t.decoder_start_token_id,bos_token_id:t.bos_token_id,generation_config:t}):u=s[c];let d=u.dims.at(-1);t.max_new_tokens!==null&&(t.max_length=d+t.max_new_tokens);let f=this._get_logits_processor(t,d,n),p=this._get_stopping_criteria(t,r),m=s[c].dims.at(0),h=sg.getSampler(t),g=Array(m).fill(0),_=u.tolist();i&&i.put(_);let v,y={},b={};for(;;){if(s=this.prepare_inputs_for_generation(_,s,t),v=await this.forward(s),t.return_dict_in_generate){if(t.output_attentions){let e=Ag(v);for(let t in e)t in y||(y[t]=[]),y[t].push(e[t])}else this._return_dict_in_generate_keys&&Object.assign(b,ci(v,this._return_dict_in_generate_keys))}let e=f(_,v.logits.slice(null,-1,null).to(`float32`)),n=[];for(let t=0;te))break;s=this._update_model_kwargs_for_generation({generated_input_ids:n,outputs:v,model_inputs:s,is_encoder_decoder:l})}i&&i.end();let x=new V(`int64`,_.flat(),[_.length,_[0].length]),S=kg(v,s.past_key_values),C=new Set(Object.values(S));for(let e of Object.values(v))e.location===`gpu-buffer`&&!C.has(e)&&e.dispose();return`past_key_values`in a||t.return_dict_in_generate||await S.dispose(),t.return_dict_in_generate?{sequences:x,past_key_values:S,...y,...b}:x}async _encode_input(e,t,n){if(!Object.hasOwn(this.sessions,e))throw Error(`Model does not have a ${e} session.`);let r=this.sessions[e];return(await q(r,ci(t,r.inputNames)))[n]}async encode_image(e){return this._encode_input(`vision_encoder`,e,`image_features`)}async encode_text(e){return this._encode_input(`embed_tokens`,e,`inputs_embeds`)}async encode_audio(e){return this._encode_input(`audio_encoder`,e,`audio_features`)}};async function Eg(e,t){let{encoder_outputs:n,input_ids:r,decoder_input_ids:i,decoder_attention_mask:a,...o}=t;return n||=(await Dg(e,ci(t,e.sessions.model.inputNames))).last_hidden_state,o.input_ids=i,o.encoder_hidden_states=n,e.sessions.decoder_model_merged.inputNames.includes(`encoder_attention_mask`)&&(o.encoder_attention_mask=t.attention_mask),a&&!o.attention_mask&&(o.attention_mask=a),await Pg(e,o,!0)}async function Dg(e,t){let n=e.sessions.model,r=ci(t,n.inputNames);if(n.inputNames.includes(`inputs_embeds`)&&!r.inputs_embeds){if(!t.input_ids)throw Error("Both `input_ids` and `inputs_embeds` are missing in the model inputs.");r.inputs_embeds=await e.encode_text({input_ids:t.input_ids})}if(n.inputNames.includes(`token_type_ids`)&&!r.token_type_ids){if(!r.input_ids)throw Error("Both `input_ids` and `token_type_ids` are missing in the model inputs.");r.token_type_ids=Su(r.input_ids)}if(n.inputNames.includes(`pixel_mask`)&&!r.pixel_mask){if(!r.pixel_values)throw Error("Both `pixel_values` and `pixel_mask` are missing in the model inputs.");let e=r.pixel_values.dims;r.pixel_mask=yu([e[0],e[2],e[3]])}return await q(n,r)}async function Og(e,t){let n=await e.encode(t);return await e.decode(n)}function kg(e,t){let n=/* @__PURE__ */ Object.create(null);for(let r in e)if(r.startsWith(`present`)){let i=r.replace(`present_ssm`,`past_ssm`).replace(`present_conv`,`past_conv`).replace(`present_recurrent`,`past_recurrent`).replace(`present_compressor`,`past_compressor`).replace(`present_indexer`,`past_indexer`).replace(`present`,`past_key_values`);n[i]=r.includes(`encoder`)&&t?t[i]:e[r]}return t?(t.update(n),t):new dg(n)}function Ag(e){let t={};for(let n of[`cross_attentions`,`encoder_attentions`,`decoder_attentions`])for(let r in e)r.startsWith(n)&&(n in t||(t[n]=[]),t[n].push(e[r]));return t}function jg(e,t){return e.map(e=>typeof e==`number`?e:t[e]??0)}function Mg(e,t,n){if(n&&Object.keys(n).length>0)return Object.assign(t,n),n;let r=e.sessions.decoder_model_merged??e.sessions.model,i=(t[e.main_input_name]??t.attention_mask)?.dims?.[0]??1,a=bh(e.config),o=e.config?.normalized_config?.num_heads,s={batch_size:i};typeof o==`number`&&(s[`batch_size x num_heads`]=i*o);let c=/* @__PURE__ */ Object.create(null);for(let e of r.inputMetadata){if(!a.has(e.name))continue;let n=jg(e.shape,s),r=n.reduce((e,t)=>e*t,1),i=Ql[e.type],o=new V(e.type,new i(r),n);t[e.name]=o,c[e.name]=o}return n?(n.update(c),n):new dg(c)}function Ng(e,t,n){t.num_logits_to_keep||(e.sessions.decoder_model_merged??e.sessions.model)?.inputNames.includes(`num_logits_to_keep`)&&(t.num_logits_to_keep=new V(`int64`,[n],[]))}async function Pg(e,t,n=!1){let r=e.sessions[n?`decoder_model_merged`:`model`],{past_key_values:i,...a}=t;return r.inputNames.includes(`use_cache_branch`)&&(a.use_cache_branch=bg(i!=null&&Object.keys(i).length>0)),r.inputNames.includes(`position_ids`)&&a.attention_mask&&!a.position_ids&&(a.position_ids=zg(a,i,+!![`paligemma`,`gemma3_text`,`gemma3`].includes(e.config.model_type))),Ng(e,a,0n),Mg(e,a,i),await q(r,ci(a,r.inputNames))}async function Fg(e,{encode_function:t,merge_function:n,modality_input_names:r,modality_output_name:i,input_ids:a=null,attention_mask:o=null,position_ids:s=null,inputs_embeds:c=null,past_key_values:l=null,generation_config:u=null,logits_processor:d=null,num_logits_to_keep:f=null,...p}){if(!c){c=await e.encode_text({input_ids:a,...p});let s=ci(p,r);if(Object.keys(s).length>0){if(a.dims[1]!==1){let e=await t({...s,...p});({inputs_embeds:c,attention_mask:o}=n({[i]:e,inputs_embeds:c,input_ids:a,attention_mask:o}))}else if(l&&a.dims[1]===1){let e=a.dims[1],t=l.get_seq_length();o=H([yu([a.dims[0],t]),o.slice(null,[o.dims[1]-e,o.dims[1]])],1)}}}if(!s&&[`qwen2_vl`,`qwen2_vl_text`,`qwen2_5_vl`,`qwen2_5_vl_text`,`qwen3_vl`,`qwen3_vl_text`,`qwen3_vl_moe`,`qwen3_vl_moe_text`,`qwen3_5`,`qwen3_5_text`,`qwen3_5_moe`,`qwen3_5_moe_text`,`glm_ocr`,`glm_ocr_text`].includes(e.config.model_type)){let{image_grid_thw:t,video_grid_thw:n}=p;[s]=e.get_rope_index(a,t,n,o)}return await Pg(e,{inputs_embeds:c,past_key_values:l,attention_mask:o,position_ids:s,generation_config:u,logits_processor:d,num_logits_to_keep:f},!0)}async function Ig(e,t){return await Fg(e,{...t,modality_input_names:[`audio_values`,`input_features`],modality_output_name:`audio_features`,encode_function:e.encode_audio.bind(e),merge_function:e._merge_input_ids_with_audio_features.bind(e)})}async function Lg(e,t){return await Fg(e,{...t,modality_input_names:[`pixel_values`],modality_output_name:`image_features`,encode_function:e.encode_image.bind(e),merge_function:e._merge_input_ids_with_image_features.bind(e)})}function Rg(e,t=0){let[n,r]=e.dims,i=e.data,a=new BigInt64Array(i.length);for(let e=0;ee.dims[1]||i[e.at(-1)])),Ng(e,n,1n),{...n,decoder_input_ids:yg(t)}}function Hg(e,...t){return e.config.is_encoder_decoder?Vg(e,...t):Bg(e,...t)}function Ug({modality_token_id:e,inputs_embeds:t,modality_features:n,input_ids:r,attention_mask:i}){let a=r.tolist().map(t=>t.reduce((t,n,r)=>(n==e&&t.push(r),t),[])),o=a.reduce((e,t)=>e+t.length,0),s=n.dims[0];if(o!==s)throw Error(`Number of tokens and features do not match: tokens: ${o}, features ${s}`);let c=0;for(let e=0;e[r,await rl(e,t[r],!1,n)])))}var qg={};Sr(qg,{ASTForAudioClassification:()=>u_,ASTModel:()=>l_,ASTPreTrainedModel:()=>c_,AfmoeForCausalLM:()=>i_,AfmoeModel:()=>r_,AfmoePreTrainedModel:()=>n_,AlbertForMaskedLM:()=>Qg,AlbertForQuestionAnswering:()=>Zg,AlbertForSequenceClassification:()=>Xg,AlbertModel:()=>Yg,AlbertPreTrainedModel:()=>Jg,ApertusForCausalLM:()=>t_,ApertusModel:()=>e_,ApertusPreTrainedModel:()=>$g,ArceeForCausalLM:()=>s_,ArceeModel:()=>o_,ArceePreTrainedModel:()=>a_,BartForConditionalGeneration:()=>p_,BartForSequenceClassification:()=>m_,BartModel:()=>f_,BartPretrainedModel:()=>d_,BaseModelOutput:()=>Nh,BeitForImageClassification:()=>__,BeitModel:()=>g_,BeitPreTrainedModel:()=>h_,BertForMaskedLM:()=>b_,BertForQuestionAnswering:()=>C_,BertForSequenceClassification:()=>x_,BertForTokenClassification:()=>S_,BertModel:()=>y_,BertPreTrainedModel:()=>v_,BlenderbotForConditionalGeneration:()=>E_,BlenderbotModel:()=>T_,BlenderbotPreTrainedModel:()=>w_,BlenderbotSmallForConditionalGeneration:()=>k_,BlenderbotSmallModel:()=>O_,BlenderbotSmallPreTrainedModel:()=>D_,BloomForCausalLM:()=>M_,BloomModel:()=>j_,BloomPreTrainedModel:()=>A_,CHMv2ForDepthEstimation:()=>K_,CHMv2PreTrainedModel:()=>G_,CLIPModel:()=>Q_,CLIPPreTrainedModel:()=>Z_,CLIPSegForImageSegmentation:()=>av,CLIPSegModel:()=>iv,CLIPSegPreTrainedModel:()=>rv,CLIPTextModel:()=>$_,CLIPTextModelWithProjection:()=>ev,CLIPVisionModel:()=>tv,CLIPVisionModelWithProjection:()=>nv,CamembertForMaskedLM:()=>F_,CamembertForQuestionAnswering:()=>R_,CamembertForSequenceClassification:()=>I_,CamembertForTokenClassification:()=>L_,CamembertModel:()=>P_,CamembertPreTrainedModel:()=>N_,CausalLMOutput:()=>Lh,CausalLMOutputWithPast:()=>Rh,ChatterboxModel:()=>H_,ChatterboxPreTrainedModel:()=>V_,ChineseCLIPModel:()=>W_,ChineseCLIPPreTrainedModel:()=>U_,ClapAudioModelWithProjection:()=>X_,ClapModel:()=>J_,ClapPreTrainedModel:()=>q_,ClapTextModelWithProjection:()=>Y_,CodeGenForCausalLM:()=>cv,CodeGenModel:()=>sv,CodeGenPreTrainedModel:()=>ov,Cohere2ForCausalLM:()=>mv,Cohere2Model:()=>pv,Cohere2PreTrainedModel:()=>fv,CohereAsrForConditionalGeneration:()=>_v,CohereAsrModel:()=>gv,CohereAsrPreTrainedModel:()=>hv,CohereForCausalLM:()=>dv,CohereModel:()=>uv,CoherePreTrainedModel:()=>lv,ConvBertForMaskedLM:()=>bv,ConvBertForQuestionAnswering:()=>Cv,ConvBertForSequenceClassification:()=>xv,ConvBertForTokenClassification:()=>Sv,ConvBertModel:()=>yv,ConvBertPreTrainedModel:()=>vv,ConvNextForImageClassification:()=>Ev,ConvNextModel:()=>Tv,ConvNextPreTrainedModel:()=>wv,ConvNextV2ForImageClassification:()=>kv,ConvNextV2Model:()=>Ov,ConvNextV2PreTrainedModel:()=>Dv,DFineForObjectDetection:()=>Iv,DFineModel:()=>Fv,DFinePreTrainedModel:()=>Pv,DINOv3ConvNextModel:()=>ky,DINOv3ConvNextPreTrainedModel:()=>Oy,DINOv3ViTModel:()=>jy,DINOv3ViTPreTrainedModel:()=>Ay,DPTForDepthEstimation:()=>Hy,DPTModel:()=>Vy,DPTPreTrainedModel:()=>By,DacDecoderModel:()=>Hv,DacDecoderOutput:()=>Rv,DacEncoderModel:()=>Vv,DacEncoderOutput:()=>Lv,DacModel:()=>Bv,DacPreTrainedModel:()=>zv,DebertaForMaskedLM:()=>Gv,DebertaForQuestionAnswering:()=>Jv,DebertaForSequenceClassification:()=>Kv,DebertaForTokenClassification:()=>qv,DebertaModel:()=>Wv,DebertaPreTrainedModel:()=>Uv,DebertaV2ForMaskedLM:()=>ry,DebertaV2ForQuestionAnswering:()=>oy,DebertaV2ForSequenceClassification:()=>iy,DebertaV2ForTokenClassification:()=>ay,DebertaV2Model:()=>ny,DebertaV2PreTrainedModel:()=>ty,DecisionTransformerModel:()=>cy,DecisionTransformerPreTrainedModel:()=>sy,DeepseekV3ForCausalLM:()=>Zv,DeepseekV3Model:()=>Xv,DeepseekV3PreTrainedModel:()=>Yv,DeepseekV4ForCausalLM:()=>ey,DeepseekV4Model:()=>$v,DeepseekV4PreTrainedModel:()=>Qv,DeiTForImageClassification:()=>dy,DeiTModel:()=>uy,DeiTPreTrainedModel:()=>ly,DepthAnythingForDepthEstimation:()=>py,DepthAnythingPreTrainedModel:()=>fy,DepthProForDepthEstimation:()=>hy,DepthProPreTrainedModel:()=>my,DetrForObjectDetection:()=>vy,DetrForSegmentation:()=>yy,DetrModel:()=>_y,DetrObjectDetectionOutput:()=>by,DetrPreTrainedModel:()=>gy,DetrSegmentationOutput:()=>xy,Dinov2ForImageClassification:()=>wy,Dinov2Model:()=>Cy,Dinov2PreTrainedModel:()=>Sy,Dinov2WithRegistersForImageClassification:()=>Dy,Dinov2WithRegistersModel:()=>Ey,Dinov2WithRegistersPreTrainedModel:()=>Ty,DistilBertForMaskedLM:()=>Ly,DistilBertForQuestionAnswering:()=>Iy,DistilBertForSequenceClassification:()=>Py,DistilBertForTokenClassification:()=>Fy,DistilBertModel:()=>Ny,DistilBertPreTrainedModel:()=>My,DonutSwinModel:()=>zy,DonutSwinPreTrainedModel:()=>Ry,EdgeTamModel:()=>kE,EfficientNetForImageClassification:()=>Gy,EfficientNetModel:()=>Wy,EfficientNetPreTrainedModel:()=>Uy,ElectraForMaskedLM:()=>Jy,ElectraForQuestionAnswering:()=>Zy,ElectraForSequenceClassification:()=>Yy,ElectraForTokenClassification:()=>Xy,ElectraModel:()=>qy,ElectraPreTrainedModel:()=>Ky,Ernie4_5ForCausalLM:()=>eb,Ernie4_5Model:()=>$y,Ernie4_5PretrainedModel:()=>Qy,EsmForMaskedLM:()=>rb,EsmForSequenceClassification:()=>ib,EsmForTokenClassification:()=>ab,EsmModel:()=>nb,EsmPreTrainedModel:()=>tb,EuroBertForMaskedLM:()=>cb,EuroBertForSequenceClassification:()=>lb,EuroBertForTokenClassification:()=>ub,EuroBertModel:()=>sb,EuroBertPreTrainedModel:()=>ob,ExaoneForCausalLM:()=>pb,ExaoneModel:()=>fb,ExaonePreTrainedModel:()=>db,FalconForCausalLM:()=>gb,FalconH1ForCausalLM:()=>yb,FalconH1Model:()=>vb,FalconH1PreTrainedModel:()=>_b,FalconModel:()=>hb,FalconPreTrainedModel:()=>mb,FastViTForImageClassification:()=>Sb,FastViTModel:()=>xb,FastViTPreTrainedModel:()=>bb,Florence2ForConditionalGeneration:()=>wb,Florence2PreTrainedModel:()=>Cb,GLPNForDepthEstimation:()=>ix,GLPNModel:()=>rx,GLPNPreTrainedModel:()=>nx,GPT2LMHeadModel:()=>yx,GPT2Model:()=>vx,GPT2PreTrainedModel:()=>_x,GPTBigCodeForCausalLM:()=>sx,GPTBigCodeModel:()=>ox,GPTBigCodePreTrainedModel:()=>ax,GPTJForCausalLM:()=>Sx,GPTJModel:()=>xx,GPTJPreTrainedModel:()=>bx,GPTNeoForCausalLM:()=>ux,GPTNeoModel:()=>lx,GPTNeoPreTrainedModel:()=>cx,GPTNeoXForCausalLM:()=>px,GPTNeoXModel:()=>fx,GPTNeoXPreTrainedModel:()=>dx,Gemma2ForCausalLM:()=>Ab,Gemma2Model:()=>kb,Gemma2PreTrainedModel:()=>Ob,Gemma3ForCausalLM:()=>Rb,Gemma3ForConditionalGeneration:()=>Lb,Gemma3Model:()=>Ib,Gemma3PreTrainedModel:()=>Fb,Gemma3nForCausalLM:()=>Vb,Gemma3nForConditionalGeneration:()=>Bb,Gemma3nPreTrainedModel:()=>zb,Gemma4ForCausalLM:()=>Ub,Gemma4ForConditionalGeneration:()=>Hb,GemmaForCausalLM:()=>Db,GemmaModel:()=>Eb,GemmaPreTrainedModel:()=>Tb,GlmForCausalLM:()=>Kb,GlmModel:()=>Gb,GlmMoeDsaForCausalLM:()=>Yb,GlmMoeDsaModel:()=>Jb,GlmMoeDsaPreTrainedModel:()=>qb,GlmOcrForConditionalGeneration:()=>tx,GlmPreTrainedModel:()=>Wb,GptOssForCausalLM:()=>gx,GptOssModel:()=>hx,GptOssPreTrainedModel:()=>mx,GraniteForCausalLM:()=>Tx,GraniteModel:()=>wx,GraniteMoeHybridForCausalLM:()=>Ox,GraniteMoeHybridModel:()=>Dx,GraniteMoeHybridPreTrainedModel:()=>Ex,GranitePreTrainedModel:()=>Cx,GraniteSpeechForConditionalGeneration:()=>jx,GroundingDinoForObjectDetection:()=>Nx,GroundingDinoPreTrainedModel:()=>Mx,GroupViTModel:()=>Fx,GroupViTPreTrainedModel:()=>Px,HeliumForCausalLM:()=>Rx,HeliumModel:()=>Lx,HeliumPreTrainedModel:()=>Ix,HieraForImageClassification:()=>Vx,HieraModel:()=>Bx,HieraPreTrainedModel:()=>zx,HrmTextForCausalLM:()=>Wx,HrmTextModel:()=>Ux,HrmTextPreTrainedModel:()=>Hx,HubertForCTC:()=>Qx,HubertForSequenceClassification:()=>$x,HubertModel:()=>Zx,HubertPreTrainedModel:()=>Xx,HunYuanDenseV1ForCausalLM:()=>nS,HunYuanDenseV1Model:()=>tS,HunYuanDenseV1PreTrainedModel:()=>eS,IJepaForImageClassification:()=>oS,IJepaModel:()=>aS,IJepaPreTrainedModel:()=>iS,Idefics3ForConditionalGeneration:()=>rS,ImageMattingOutput:()=>Bh,JAISLMHeadModel:()=>lS,JAISModel:()=>cS,JAISPreTrainedModel:()=>sS,JinaCLIPModel:()=>dS,JinaCLIPPreTrainedModel:()=>uS,JinaCLIPTextModel:()=>fS,JinaCLIPVisionModel:()=>pS,Lfm2ForCausalLM:()=>gS,Lfm2Model:()=>hS,Lfm2MoeForCausalLM:()=>bS,Lfm2MoeModel:()=>yS,Lfm2MoePreTrainedModel:()=>vS,Lfm2PreTrainedModel:()=>mS,Lfm2VlForConditionalGeneration:()=>xS,LightOnOcrForConditionalGeneration:()=>_S,LiteWhisperForConditionalGeneration:()=>RO,Llama4ForCausalLM:()=>ES,Llama4PreTrainedModel:()=>TS,LlamaForCausalLM:()=>wS,LlamaModel:()=>CS,LlamaPreTrainedModel:()=>SS,LlavaForConditionalGeneration:()=>Mb,LlavaOnevisionForConditionalGeneration:()=>Mb,LlavaPreTrainedModel:()=>jb,LlavaQwen2ForCausalLM:()=>Pb,LongT5ForConditionalGeneration:()=>kS,LongT5Model:()=>OS,LongT5PreTrainedModel:()=>DS,M2M100ForConditionalGeneration:()=>MS,M2M100Model:()=>jS,M2M100PreTrainedModel:()=>AS,MBartForCausalLM:()=>US,MBartForConditionalGeneration:()=>VS,MBartForSequenceClassification:()=>HS,MBartModel:()=>BS,MBartPreTrainedModel:()=>zS,MPNetForMaskedLM:()=>aw,MPNetForQuestionAnswering:()=>cw,MPNetForSequenceClassification:()=>ow,MPNetForTokenClassification:()=>sw,MPNetModel:()=>iw,MPNetPreTrainedModel:()=>rw,MT5ForConditionalGeneration:()=>mw,MT5Model:()=>pw,MT5PreTrainedModel:()=>fw,MarianMTModel:()=>FS,MarianModel:()=>PS,MarianPreTrainedModel:()=>NS,MaskFormerForInstanceSegmentation:()=>RS,MaskFormerModel:()=>LS,MaskFormerPreTrainedModel:()=>IS,MaskedLMOutput:()=>Fh,Metric3DForDepthEstimation:()=>GS,Metric3DPreTrainedModel:()=>WS,Metric3Dv2ForDepthEstimation:()=>qS,Metric3Dv2PreTrainedModel:()=>KS,MgpstrForSceneTextRecognition:()=>XS,MgpstrModelOutput:()=>JS,MgpstrPreTrainedModel:()=>YS,MimiDecoderModel:()=>nC,MimiDecoderOutput:()=>QS,MimiEncoderModel:()=>tC,MimiEncoderOutput:()=>ZS,MimiModel:()=>eC,MimiPreTrainedModel:()=>$S,Ministral3ForCausalLM:()=>cC,Ministral3Model:()=>sC,Ministral3PreTrainedModel:()=>oC,MinistralForCausalLM:()=>aC,MinistralModel:()=>iC,MinistralPreTrainedModel:()=>rC,Mistral3ForConditionalGeneration:()=>fC,Mistral4ForCausalLM:()=>hC,Mistral4Model:()=>mC,Mistral4PreTrainedModel:()=>pC,MistralForCausalLM:()=>dC,MistralModel:()=>uC,MistralPreTrainedModel:()=>lC,MobileBertForMaskedLM:()=>vC,MobileBertForQuestionAnswering:()=>bC,MobileBertForSequenceClassification:()=>yC,MobileBertModel:()=>_C,MobileBertPreTrainedModel:()=>gC,MobileLLMForCausalLM:()=>CC,MobileLLMModel:()=>SC,MobileLLMPreTrainedModel:()=>xC,MobileNetV1ForImageClassification:()=>EC,MobileNetV1ForSemanticSegmentation:()=>DC,MobileNetV1Model:()=>TC,MobileNetV1PreTrainedModel:()=>wC,MobileNetV2ForImageClassification:()=>AC,MobileNetV2ForSemanticSegmentation:()=>jC,MobileNetV2Model:()=>kC,MobileNetV2PreTrainedModel:()=>OC,MobileNetV3ForImageClassification:()=>PC,MobileNetV3ForSemanticSegmentation:()=>FC,MobileNetV3Model:()=>NC,MobileNetV3PreTrainedModel:()=>MC,MobileNetV4ForImageClassification:()=>RC,MobileNetV4ForSemanticSegmentation:()=>zC,MobileNetV4Model:()=>LC,MobileNetV4PreTrainedModel:()=>IC,MobileViTForImageClassification:()=>HC,MobileViTModel:()=>VC,MobileViTPreTrainedModel:()=>BC,MobileViTV2ForImageClassification:()=>GC,MobileViTV2Model:()=>WC,MobileViTV2PreTrainedModel:()=>UC,ModelOutput:()=>Mh,ModernBertDecoderForCausalLM:()=>$C,ModernBertDecoderModel:()=>QC,ModernBertDecoderPreTrainedModel:()=>ZC,ModernBertForMaskedLM:()=>JC,ModernBertForSequenceClassification:()=>YC,ModernBertForTokenClassification:()=>XC,ModernBertModel:()=>qC,ModernBertPreTrainedModel:()=>KC,Moondream1ForConditionalGeneration:()=>Nb,MoonshineForConditionalGeneration:()=>nw,MoonshineModel:()=>tw,MoonshinePreTrainedModel:()=>ew,MptForCausalLM:()=>dw,MptModel:()=>uw,MptPreTrainedModel:()=>lw,MultiModalityCausalLM:()=>gw,MultiModalityPreTrainedModel:()=>hw,MusicgenForCausalLM:()=>yw,MusicgenForConditionalGeneration:()=>bw,MusicgenModel:()=>vw,MusicgenPreTrainedModel:()=>_w,NanoChatForCausalLM:()=>Cw,NanoChatModel:()=>Sw,NanoChatPreTrainedModel:()=>xw,NemotronHForCausalLM:()=>Ew,NemotronHModel:()=>Tw,NemotronHPreTrainedModel:()=>ww,NeoBertForMaskedLM:()=>kw,NeoBertForQuestionAnswering:()=>Mw,NeoBertForSequenceClassification:()=>Aw,NeoBertForTokenClassification:()=>jw,NeoBertModel:()=>Ow,NeoBertPreTrainedModel:()=>Dw,NomicBertModel:()=>Pw,NomicBertPreTrainedModel:()=>Nw,OPTForCausalLM:()=>tT,OPTModel:()=>eT,OPTPreTrainedModel:()=>$w,Olmo2ForCausalLM:()=>Bw,Olmo2Model:()=>zw,Olmo2PreTrainedModel:()=>Rw,Olmo3ForCausalLM:()=>Uw,Olmo3Model:()=>Hw,Olmo3PreTrainedModel:()=>Vw,OlmoForCausalLM:()=>Lw,OlmoHybridForCausalLM:()=>Kw,OlmoHybridModel:()=>Gw,OlmoHybridPreTrainedModel:()=>Ww,OlmoModel:()=>Iw,OlmoPreTrainedModel:()=>Fw,OpenAIPrivacyFilterForTokenClassification:()=>Yw,OpenAIPrivacyFilterModel:()=>Jw,OpenAIPrivacyFilterPreTrainedModel:()=>qw,OpenELMForCausalLM:()=>Qw,OpenELMModel:()=>Zw,OpenELMPreTrainedModel:()=>Xw,OwlViTForObjectDetection:()=>sT,OwlViTModel:()=>oT,OwlViTPreTrainedModel:()=>aT,Owlv2ForObjectDetection:()=>iT,Owlv2Model:()=>rT,Owlv2PreTrainedModel:()=>nT,PaliGemmaForConditionalGeneration:()=>cT,ParakeetForCTC:()=>uT,ParakeetPreTrainedModel:()=>lT,PatchTSMixerForPrediction:()=>pT,PatchTSMixerModel:()=>fT,PatchTSMixerPreTrainedModel:()=>dT,PatchTSTForPrediction:()=>gT,PatchTSTModel:()=>hT,PatchTSTPreTrainedModel:()=>mT,Phi3ForCausalLM:()=>ST,Phi3Model:()=>xT,Phi3PreTrainedModel:()=>bT,Phi3VForCausalLM:()=>wT,Phi3VPreTrainedModel:()=>CT,PhiForCausalLM:()=>yT,PhiModel:()=>vT,PhiPreTrainedModel:()=>_T,PreTrainedModel:()=>X,PvtForImageClassification:()=>DT,PvtModel:()=>ET,PvtPreTrainedModel:()=>TT,PyAnnoteForAudioFrameClassification:()=>AT,PyAnnoteModel:()=>kT,PyAnnotePreTrainedModel:()=>OT,QuestionAnsweringModelOutput:()=>Ih,Qwen2ForCausalLM:()=>NT,Qwen2Model:()=>MT,Qwen2MoeForCausalLM:()=>IT,Qwen2MoeModel:()=>FT,Qwen2MoePreTrainedModel:()=>PT,Qwen2PreTrainedModel:()=>jT,Qwen2VLForCausalLM:()=>Qb,Qwen2VLForConditionalGeneration:()=>Zb,Qwen2VLPreTrainedModel:()=>Xb,Qwen2_5_VLForCausalLM:()=>ex,Qwen2_5_VLForConditionalGeneration:()=>$b,Qwen3ForCausalLM:()=>zT,Qwen3Model:()=>RT,Qwen3MoeForCausalLM:()=>HT,Qwen3MoeModel:()=>VT,Qwen3MoePreTrainedModel:()=>BT,Qwen3NextForCausalLM:()=>GT,Qwen3NextModel:()=>WT,Qwen3NextPreTrainedModel:()=>UT,Qwen3PreTrainedModel:()=>LT,Qwen3VLForCausalLM:()=>qT,Qwen3VLForConditionalGeneration:()=>KT,Qwen3VLMoeForCausalLM:()=>YT,Qwen3VLMoeForConditionalGeneration:()=>JT,Qwen3_5ForCausalLM:()=>ZT,Qwen3_5ForConditionalGeneration:()=>XT,Qwen3_5MoeForCausalLM:()=>$T,Qwen3_5MoeForConditionalGeneration:()=>QT,RFDetrForObjectDetection:()=>aE,RFDetrModel:()=>iE,RFDetrObjectDetectionOutput:()=>oE,RFDetrPreTrainedModel:()=>rE,RTDetrForObjectDetection:()=>Mv,RTDetrModel:()=>jv,RTDetrObjectDetectionOutput:()=>Nv,RTDetrPreTrainedModel:()=>Av,RTDetrV2ForObjectDetection:()=>xE,RTDetrV2Model:()=>bE,RTDetrV2ObjectDetectionOutput:()=>SE,RTDetrV2PreTrainedModel:()=>yE,ResNetForImageClassification:()=>nE,ResNetModel:()=>tE,ResNetPreTrainedModel:()=>eE,RoFormerForMaskedLM:()=>hE,RoFormerForQuestionAnswering:()=>vE,RoFormerForSequenceClassification:()=>gE,RoFormerForTokenClassification:()=>_E,RoFormerModel:()=>mE,RoFormerPreTrainedModel:()=>pE,RobertaForMaskedLM:()=>lE,RobertaForQuestionAnswering:()=>fE,RobertaForSequenceClassification:()=>uE,RobertaForTokenClassification:()=>dE,RobertaModel:()=>cE,RobertaPreTrainedModel:()=>sE,Sam2ImageSegmentationOutput:()=>EE,Sam2Model:()=>OE,Sam2PreTrainedModel:()=>DE,Sam3TrackerModel:()=>AE,SamImageSegmentationOutput:()=>CE,SamModel:()=>TE,SamPreTrainedModel:()=>wE,SapiensForDepthEstimation:()=>NE,SapiensForNormalEstimation:()=>PE,SapiensForSemanticSegmentation:()=>ME,SapiensPreTrainedModel:()=>jE,SegformerForImageClassification:()=>LE,SegformerForSemanticSegmentation:()=>RE,SegformerModel:()=>IE,SegformerPreTrainedModel:()=>FE,Seq2SeqLMOutput:()=>zh,SequenceClassifierOutput:()=>J,SiglipModel:()=>BE,SiglipPreTrainedModel:()=>zE,SiglipTextModel:()=>VE,SiglipVisionModel:()=>HE,SmolLM3ForCausalLM:()=>GE,SmolLM3Model:()=>WE,SmolLM3PreTrainedModel:()=>UE,SmolVLMForConditionalGeneration:()=>KE,SnacDecoderModel:()=>XE,SnacEncoderModel:()=>YE,SnacModel:()=>JE,SnacPreTrainedModel:()=>qE,SolarOpenForCausalLM:()=>$E,SolarOpenModel:()=>QE,SolarOpenPreTrainedModel:()=>ZE,SpeechT5ForSpeechToText:()=>nD,SpeechT5ForTextToSpeech:()=>rD,SpeechT5HifiGan:()=>iD,SpeechT5Model:()=>tD,SpeechT5PreTrainedModel:()=>eD,SqueezeBertForMaskedLM:()=>sD,SqueezeBertForQuestionAnswering:()=>lD,SqueezeBertForSequenceClassification:()=>cD,SqueezeBertModel:()=>oD,SqueezeBertPreTrainedModel:()=>aD,StableLmForCausalLM:()=>fD,StableLmModel:()=>dD,StableLmPreTrainedModel:()=>uD,Starcoder2ForCausalLM:()=>hD,Starcoder2Model:()=>mD,Starcoder2PreTrainedModel:()=>pD,StyleTextToSpeech2Model:()=>_D,StyleTextToSpeech2PreTrainedModel:()=>gD,SupertonicForConditionalGeneration:()=>yD,SupertonicPreTrainedModel:()=>vD,Swin2SRForImageSuperResolution:()=>ED,Swin2SRModel:()=>TD,Swin2SRPreTrainedModel:()=>wD,SwinForImageClassification:()=>SD,SwinForSemanticSegmentation:()=>CD,SwinModel:()=>xD,SwinPreTrainedModel:()=>bD,T5ForConditionalGeneration:()=>kD,T5Model:()=>OD,T5PreTrainedModel:()=>DD,TableTransformerForObjectDetection:()=>MD,TableTransformerModel:()=>jD,TableTransformerObjectDetectionOutput:()=>ND,TableTransformerPreTrainedModel:()=>AD,TokenClassifierOutput:()=>Ph,TrOCRForCausalLM:()=>FD,TrOCRPreTrainedModel:()=>PD,UltravoxModel:()=>Ax,UltravoxPreTrainedModel:()=>kx,UniSpeechForCTC:()=>RD,UniSpeechForSequenceClassification:()=>zD,UniSpeechModel:()=>LD,UniSpeechPreTrainedModel:()=>ID,UniSpeechSatForAudioFrameClassification:()=>WD,UniSpeechSatForCTC:()=>HD,UniSpeechSatForSequenceClassification:()=>UD,UniSpeechSatModel:()=>VD,UniSpeechSatPreTrainedModel:()=>BD,VaultGemmaForCausalLM:()=>qD,VaultGemmaModel:()=>KD,VaultGemmaPreTrainedModel:()=>GD,ViTForImageClassification:()=>ZD,ViTMAEModel:()=>$D,ViTMAEPreTrainedModel:()=>QD,ViTMSNForImageClassification:()=>nO,ViTMSNModel:()=>tO,ViTMSNPreTrainedModel:()=>eO,ViTModel:()=>XD,ViTPreTrainedModel:()=>YD,VisionEncoderDecoderModel:()=>JD,VitMatteForImageMatting:()=>iO,VitMattePreTrainedModel:()=>rO,VitPoseForPoseEstimation:()=>oO,VitPosePreTrainedModel:()=>aO,VitsModel:()=>lO,VitsModelOutput:()=>sO,VitsPreTrainedModel:()=>cO,VoxtralForConditionalGeneration:()=>uO,VoxtralRealtimeForConditionalGeneration:()=>bO,VoxtralRealtimePreTrainedModel:()=>yO,Wav2Vec2BertForCTC:()=>CO,Wav2Vec2BertForSequenceClassification:()=>wO,Wav2Vec2BertModel:()=>SO,Wav2Vec2BertPreTrainedModel:()=>xO,Wav2Vec2ForAudioFrameClassification:()=>Yx,Wav2Vec2ForCTC:()=>qx,Wav2Vec2ForSequenceClassification:()=>Jx,Wav2Vec2Model:()=>Kx,Wav2Vec2PreTrainedModel:()=>Gx,WavLMForAudioFrameClassification:()=>jO,WavLMForCTC:()=>OO,WavLMForSequenceClassification:()=>kO,WavLMForXVector:()=>AO,WavLMModel:()=>DO,WavLMPreTrainedModel:()=>EO,WeSpeakerResNetModel:()=>NO,WeSpeakerResNetPreTrainedModel:()=>MO,WhisperForConditionalGeneration:()=>LO,WhisperModel:()=>IO,WhisperPreTrainedModel:()=>FO,XLMForQuestionAnswering:()=>WO,XLMForSequenceClassification:()=>HO,XLMForTokenClassification:()=>UO,XLMModel:()=>BO,XLMPreTrainedModel:()=>zO,XLMRobertaForMaskedLM:()=>qO,XLMRobertaForQuestionAnswering:()=>XO,XLMRobertaForSequenceClassification:()=>JO,XLMRobertaForTokenClassification:()=>YO,XLMRobertaModel:()=>KO,XLMRobertaPreTrainedModel:()=>GO,XLMWithLMHeadModel:()=>VO,XVectorOutput:()=>TO,YolosForObjectDetection:()=>$O,YolosModel:()=>QO,YolosObjectDetectionOutput:()=>ek,YolosPreTrainedModel:()=>ZO,YoutuForCausalLM:()=>rk,YoutuModel:()=>nk,YoutuPreTrainedModel:()=>tk,ZayaForCausalLM:()=>ok,ZayaModel:()=>ak,ZayaPreTrainedModel:()=>ik});var Jg=class extends X{},Yg=class extends Jg{},Xg=class extends Jg{async _call(e){return new J(await super._call(e))}},Zg=class extends Jg{async _call(e){return new Ih(await super._call(e))}},Qg=class extends Jg{async _call(e){return new Fh(await super._call(e))}},$g=class extends X{},e_=class extends $g{},t_=class extends $g{},n_=class extends X{},r_=class extends n_{},i_=class extends n_{},a_=class extends X{},o_=class extends a_{},s_=class extends a_{},c_=class extends X{},l_=class extends c_{},u_=class extends c_{},d_=class extends X{},f_=class extends d_{},p_=class extends d_{},m_=class extends d_{async _call(e){return new J(await super._call(e))}},h_=class extends X{},g_=class extends h_{},__=class extends h_{async _call(e){return new J(await super._call(e))}},v_=class extends X{},y_=class extends v_{},b_=class extends v_{async _call(e){return new Fh(await super._call(e))}},x_=class extends v_{async _call(e){return new J(await super._call(e))}},S_=class extends v_{async _call(e){return new Ph(await super._call(e))}},C_=class extends v_{async _call(e){return new Ih(await super._call(e))}},w_=class extends X{},T_=class extends w_{},E_=class extends w_{},D_=class extends X{},O_=class extends D_{},k_=class extends D_{},A_=class extends X{},j_=class extends A_{},M_=class extends A_{},N_=class extends X{},P_=class extends N_{},F_=class extends N_{async _call(e){return new Fh(await super._call(e))}},I_=class extends N_{async _call(e){return new J(await super._call(e))}},L_=class extends N_{async _call(e){return new Ph(await super._call(e))}},R_=class extends N_{async _call(e){return new Ih(await super._call(e))}},z_=4299n,B_=6561n,V_=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`audio_values`,`exaggeration`,`audio_features`,`audio_tokens`,`speaker_embeddings`,`speaker_features`,`past_key_values`];main_input_name=`input_ids`;_return_dict_in_generate_keys=[`audio_tokens`,`speaker_embeddings`,`speaker_features`]},H_=class extends V_{async encode_speech(e){return q(this.sessions.speech_encoder,{audio_values:e})}async forward({input_ids:e=null,attention_mask:t=null,audio_values:n=null,exaggeration:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,audio_features:u=null,audio_tokens:d=null,speaker_embeddings:f=null,speaker_features:p=null,...m}){let h;if(!a){let s=this.sessions.embed_tokens.inputNames,c={input_ids:e};if(s.includes(`exaggeration`)){if(!(r instanceof V)){let t=e.dims[0];if(r==null)r=_u([t],.5);else if(typeof r==`number`)r=_u([t],r);else if(Array.isArray(r))r=new V(`float32`,r,[t]);else throw Error("Unsupported type for `exaggeration` input")}c.exaggeration=r}if(s.includes(`position_ids`)&&(c.position_ids=i),{inputs_embeds:a}=await q(this.sessions.embed_tokens,c),u&&d&&f&&p&&(h={audio_features:u,audio_tokens:d,speaker_embeddings:f,speaker_features:p}),h||n)h??=await this.encode_speech(n),a=H([h.audio_features,a],1),t=yu([a.dims[0],a.dims[1]]);else{let e=a.dims[1];if(!o||e!==1)throw Error(`Incorrect state encountered during generation.`);let n=o.get_seq_length();t=yu([a.dims[0],n+e])}}return{...await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1),...h}}prepare_inputs_for_generation(e,t,n){return!t.position_ids&&this.sessions.embed_tokens.inputNames.includes(`position_ids`)&&(t.position_ids=t.input_ids.dims[1]===1?new V(`int64`,Array.from({length:e.length},(t,n)=>e[n].length-e[n].findLastIndex(e=>e==B_)-1),[e.length,1]):new V(`int64`,t.input_ids.tolist().map(e=>{let t=0;return e.map(e=>e>=B_?0:t++)}).flat(),t.input_ids.dims)),t.input_ids.dims[1]===1&&(delete t.audio_values,delete t.audio_features,delete t.audio_tokens,delete t.speaker_embeddings,delete t.speaker_features),Bg(this,e,t,n)}async generate(e){let t=e.past_key_values,{sequences:n,audio_tokens:r,speaker_embeddings:i,speaker_features:a,past_key_values:o}=await super.generate({...e,return_dict_in_generate:!0});try{let t=n.slice(null,[e.input_ids.dims[1],-1]),o=H([r,t,_u([t.dims[0],3],z_)],1),{waveform:s}=await q(this.sessions.conditional_decoder,{speech_tokens:o,speaker_features:a,speaker_embeddings:i});return s}finally{o!==t&&await o?.dispose()}}},U_=class extends X{},W_=class extends U_{},G_=class extends X{},K_=class extends G_{},q_=class extends X{},J_=class extends q_{},Y_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},X_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`audio_model`})}},Z_=class extends X{},Q_=class extends Z_{},$_=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},ev=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},tv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},nv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},rv=class extends X{},iv=class extends rv{},av=class extends rv{},ov=class extends X{},sv=class extends ov{},cv=class extends ov{},lv=class extends X{},uv=class extends lv{},dv=class extends lv{},fv=class extends X{},pv=class extends fv{},mv=class extends fv{},hv=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},gv=class extends hv{},_v=class extends hv{},vv=class extends X{},yv=class extends vv{},bv=class extends vv{async _call(e){return new Fh(await super._call(e))}},xv=class extends vv{async _call(e){return new J(await super._call(e))}},Sv=class extends vv{async _call(e){return new Ph(await super._call(e))}},Cv=class extends vv{async _call(e){return new Ih(await super._call(e))}},wv=class extends X{},Tv=class extends wv{},Ev=class extends wv{async _call(e){return new J(await super._call(e))}},Dv=class extends X{},Ov=class extends Dv{},kv=class extends Dv{async _call(e){return new J(await super._call(e))}},Av=class extends X{},jv=class extends Av{},Mv=class extends Av{async _call(e){return new Nv(await super._call(e))}},Nv=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},Pv=class extends X{},Fv=class extends Pv{},Iv=class extends Pv{async _call(e){return new Nv(await super._call(e))}},Lv=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},Rv=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},zv=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},Bv=class extends zv{async encode(e){return new Lv(await q(this.sessions.encoder_model,e))}async decode(e){return new Rv(await q(this.sessions.decoder_model,e))}},Vv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},Hv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},Uv=class extends X{},Wv=class extends Uv{},Gv=class extends Uv{async _call(e){return new Fh(await super._call(e))}},Kv=class extends Uv{async _call(e){return new J(await super._call(e))}},qv=class extends Uv{async _call(e){return new Ph(await super._call(e))}},Jv=class extends Uv{async _call(e){return new Ih(await super._call(e))}},Yv=class extends X{},Xv=class extends Yv{},Zv=class extends Yv{},Qv=class extends X{},$v=class extends Qv{},ey=class extends Qv{},ty=class extends X{},ny=class extends ty{},ry=class extends ty{async _call(e){return new Fh(await super._call(e))}},iy=class extends ty{async _call(e){return new J(await super._call(e))}},ay=class extends ty{async _call(e){return new Ph(await super._call(e))}},oy=class extends ty{async _call(e){return new Ih(await super._call(e))}},sy=class extends X{},cy=class extends sy{},ly=class extends X{},uy=class extends ly{},dy=class extends ly{async _call(e){return new J(await super._call(e))}},fy=class extends X{},py=class extends fy{},my=class extends X{},hy=class extends my{},gy=class extends X{},_y=class extends gy{},vy=class extends gy{async _call(e){return new by(await super._call(e))}},yy=class extends gy{async _call(e){return new xy(await super._call(e))}},by=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},xy=class extends Mh{constructor({logits:e,pred_boxes:t,pred_masks:n}){super(),this.logits=e,this.pred_boxes=t,this.pred_masks=n}},Sy=class extends X{},Cy=class extends Sy{},wy=class extends Sy{async _call(e){return new J(await super._call(e))}},Ty=class extends X{},Ey=class extends Ty{},Dy=class extends Ty{async _call(e){return new J(await super._call(e))}},Oy=class extends X{},ky=class extends Oy{},Ay=class extends X{},jy=class extends Ay{},My=class extends X{},Ny=class extends My{},Py=class extends My{async _call(e){return new J(await super._call(e))}},Fy=class extends My{async _call(e){return new Ph(await super._call(e))}},Iy=class extends My{async _call(e){return new Ih(await super._call(e))}},Ly=class extends My{async _call(e){return new Fh(await super._call(e))}},Ry=class extends X{},zy=class extends Ry{},By=class extends X{},Vy=class extends By{},Hy=class extends By{},Uy=class extends X{},Wy=class extends Uy{},Gy=class extends Uy{async _call(e){return new J(await super._call(e))}},Ky=class extends X{},qy=class extends Ky{},Jy=class extends Ky{async _call(e){return new Fh(await super._call(e))}},Yy=class extends Ky{async _call(e){return new J(await super._call(e))}},Xy=class extends Ky{async _call(e){return new Ph(await super._call(e))}},Zy=class extends Ky{async _call(e){return new Ih(await super._call(e))}},Qy=class extends X{},$y=class extends Qy{},eb=class extends Qy{},tb=class extends X{},nb=class extends tb{},rb=class extends tb{async _call(e){return new Fh(await super._call(e))}},ib=class extends tb{async _call(e){return new J(await super._call(e))}},ab=class extends tb{async _call(e){return new Ph(await super._call(e))}},ob=class extends X{},sb=class extends ob{},cb=class extends ob{async _call(e){return new Fh(await super._call(e))}},lb=class extends ob{async _call(e){return new J(await super._call(e))}},ub=class extends ob{async _call(e){return new Ph(await super._call(e))}},db=class extends X{},fb=class extends db{},pb=class extends db{},mb=class extends X{},hb=class extends mb{},gb=class extends mb{},_b=class extends X{},vb=class extends _b{},yb=class extends _b{},bb=class extends X{},xb=class extends bb{},Sb=class extends bb{async _call(e){return new J(await super._call(e))}},Cb=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`pixel_values`,`encoder_outputs`,`decoder_input_ids`,`decoder_inputs_embeds`,`decoder_attention_mask`,`past_key_values`];main_input_name=`inputs_embeds`},wb=class extends Cb{_merge_input_ids_with_image_features({inputs_embeds:e,image_features:t,input_ids:n,attention_mask:r}){return{inputs_embeds:H([t,e],1),attention_mask:H([yu(t.dims.slice(0,2)),r],1)}}async _prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:n,attention_mask:r}){if(!e&&!t)throw Error("Either `input_ids` or `pixel_values` should be provided.");let i,a;return e&&(i=await this.encode_text({input_ids:e})),t&&(a=await this.encode_image({pixel_values:t})),i&&a?{inputs_embeds:n,attention_mask:r}=this._merge_input_ids_with_image_features({inputs_embeds:i,image_features:a,input_ids:e,attention_mask:r}):n=i||a,{inputs_embeds:n,attention_mask:r}}async forward({input_ids:e,pixel_values:t,attention_mask:n,decoder_input_ids:r,decoder_attention_mask:i,encoder_outputs:a,past_key_values:o,inputs_embeds:s,decoder_inputs_embeds:c,num_logits_to_keep:l=null}){if(s||({inputs_embeds:s,attention_mask:n}=await this._prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:s,attention_mask:n})),!a){let{last_hidden_state:e}=await Dg(this,{inputs_embeds:s,attention_mask:n});a=e}if(!c){if(!r)throw Error("Either `decoder_input_ids` or `decoder_inputs_embeds` should be provided.");c=await this.encode_text({input_ids:r})}let u={inputs_embeds:c,attention_mask:i,encoder_attention_mask:n,encoder_hidden_states:a,past_key_values:o,num_logits_to_keep:l};return await Pg(this,u,!0)}},Tb=class extends X{},Eb=class extends Tb{},Db=class extends Tb{},Ob=class extends X{},kb=class extends Ob{},Ab=class extends Ob{},jb=class extends X{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`position_ids`,`past_key_values`]},Mb=class extends jb{_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_index??this.config.image_token_id,...e,image_features:n})}},Nb=class extends Mb{},Pb=class extends Mb{},Fb=class extends X{},Ib=class extends Fb{},Lb=class extends Mb{},Rb=class extends Lb{},zb=class extends X{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`input_features`,`input_features_mask`,`past_key_values`]},Bb=class extends zb{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,input_features:r=null,input_features_mask:i=null,position_ids:a=null,inputs_embeds:o=null,per_layer_inputs:s=null,past_key_values:c=null,generation_config:l=null,logits_processor:u=null,num_logits_to_keep:d=null,...f}){if((!o||!s)&&({inputs_embeds:o,per_layer_inputs:s}=await q(this.sessions.embed_tokens,{input_ids:e}),e.dims[1]!==1)){if(n){let{image_features:r}=await this._encode_vision({pixel_values:n,...f});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_image_features({image_features:r,inputs_embeds:o,input_ids:e,attention_mask:t}))}if(r){let{audio_features:n}=await q(this.sessions.audio_encoder,{input_features:r,input_features_mask:i});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_audio_features({audio_features:n,inputs_embeds:o,input_ids:e,attention_mask:t}))}}return await Pg(this,{inputs_embeds:o,per_layer_inputs:s,past_key_values:c,attention_mask:t,position_ids:a,generation_config:l,logits_processor:u,num_logits_to_keep:d},!0)}_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values})}_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_id,...e,image_features:n})}_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.audio_token_id,...e,audio_features:n})}},Vb=class extends Bb{},Hb=class extends Bb{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`image_position_ids`,`input_features`,`input_features_mask`,`past_key_values`];_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values,pixel_position_ids:e.image_position_ids})}},Ub=class extends Hb{},Wb=class extends X{},Gb=class extends Wb{},Kb=class extends Wb{},qb=class extends X{},Jb=class extends qb{},Yb=class extends qb{},Xb=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`,`pixel_values`,`image_grid_thw`]},Zb=class extends Xb{image_grid_thw_name=`grid_thw`;_get_text_only_rope_index(e,t){if(t){let{data:e,dims:n}=Rg(t),r=BigInt64Array.from({length:3*e.length},(t,n)=>e[n%e.length]),i=Array.from({length:n[0]},(t,r)=>ll(e.subarray(n[1]*r,n[1]*(r+1)))[0]+1n+BigInt(n[1]));return[new V(`int64`,r,[3,...n]),new V(`int64`,i,[i.length,1])]}{let[t,n]=e.dims;return[new V(`int64`,BigInt64Array.from({length:3*t*n},(e,r)=>BigInt(Math.floor(r%n/t))),[3,...e.dims]),xu([t,1])]}}_reorder_and_write_positions(e,t,n,r){let i=e.reduce((e,t)=>e+t.length,0),a=Array(i),o=0;for(let t=0;t<3;++t)for(let n of e){let e=n.length/3;for(let r=t*e;r<(t+1)*e;++r)a[o++]=n[r]}let s=0;for(let e=0;e(t==s&&e.push(n),e),[]).map(e=>c[e+1]),u=l.filter(e=>e==a).length,d=l.filter(e=>e==o).length,f=[],p=0,m=u,h=d;for(let e=0;et>p&&e==a),s=c.findIndex((e,t)=>t>p&&e==o),l=m>0&&e!==-1?e:c.length+1,u=h>0&&s!==-1?s:c.length+1,d,g,_,v;l0?ll(f.at(-1))[0]+1:0;f.push(Array.from({length:3*S},(e,t)=>C+t%S));let ee=S+C,w=y*b*x,te=Array.from({length:w},(e,t)=>ee+Math.floor(t/(b*x))),ne=Array.from({length:w},(e,t)=>ee+Math.floor(t/x)%b),re=Array.from({length:w},(e,t)=>ee+t%x);f.push([te,ne,re].flat()),p=d+w}if(p0?ll(f.at(-1))[0]+1:0,t=c.length-p;f.push(Array.from({length:3*t},(n,r)=>e+r%t))}return f}get_rope_index(e,t,n,r){let{vision_config:i}=this.config,a=i.spatial_merge_size??2;if(t||n){let i=e.tolist();r||=bu(e);let o=r.tolist(),s=Array.from({length:3},()=>Array.from({length:e.dims[0]},()=>Array.from({length:e.dims[1]},()=>0))),c=t?t.tolist():[],l=n?n.tolist():[],u={image_index:0,video_index:0},d=[];for(let e=0;eo[e][n]==1),n=this._get_multimodal_rope_positions({filtered_ids:t,image_grid_thw_list:c,video_grid_thw_list:l,spatial_merge_size:a,state:u}),r=this._reorder_and_write_positions(n,o[e],s,e);d.push(ll(r)[0]+1-i[e].length)}return[new V(`int64`,s.flat(1/0),[3,e.dims[0],e.dims[1]]),new V(`int64`,d,[d.length,1])]}return this._get_text_only_rope_index(e,r)}async encode_image({pixel_values:e,image_grid_thw:t}){return(await q(this.sessions.vision_encoder,{pixel_values:e,[this.image_grid_thw_name]:t})).image_features}_merge_input_ids_with_image_features(e){return Wg({image_token_id:this.config.image_token_id,...e})}prepare_inputs_for_generation(e,t,n){if(Ng(this,t,1n),!t.attention_mask||t.position_ids||!(this.sessions.decoder_model_merged??this.sessions.model).inputNames.includes(`position_ids`))return t;if(!t.past_key_values)[t.position_ids,t.rope_deltas]=this.get_rope_index(t.input_ids,t.image_grid_thw,t.video_grid_thw,t.attention_mask);else{t.pixel_values=null;let e=t.past_key_values.get_seq_length();if(en+e);t.position_ids=du([r,r,r],0)}}return t}},Qb=class extends Zb{},$b=class extends Zb{image_grid_thw_name=`image_grid_thw`},ex=class extends Qb{image_grid_thw_name=`image_grid_thw`},tx=class extends $b{get_vision_position_ids(e,t,n,r){let i=Math.floor(t[0]/n),a=Math.floor(t[1]/r),o=Math.floor(t[2]/r),s=a*o*i,c=Array.from({length:s},()=>e),l=Array.from({length:s},(t,n)=>e+Math.floor(n/(o*i))),u=Array.from({length:s},(t,n)=>e+n%o);return[...c,...l,...u]}_get_multimodal_rope_positions({filtered_ids:e,image_grid_thw_list:t,video_grid_thw_list:n,spatial_merge_size:r,state:i}){let{image_token_id:a}=this.config,o=[],s=0,c=+(e[0]==a);for(let t=1;t<=e.length;++t){let n=tl+n%e)),l+=e}else{let e=t[i.image_index++].map(Number),n=e[0];u.push(this.get_vision_position_ids(l,e,n,r)),l+=Math.max(e[1],e[2])/r}return u}},nx=class extends X{},rx=class extends nx{},ix=class extends nx{},ax=class extends X{},ox=class extends ax{},sx=class extends ax{},cx=class extends X{},lx=class extends cx{},ux=class extends cx{},dx=class extends X{},fx=class extends dx{},px=class extends dx{},mx=class extends X{},hx=class extends mx{},gx=class extends mx{},_x=class extends X{},vx=class extends _x{},yx=class extends _x{},bx=class extends X{},xx=class extends bx{},Sx=class extends bx{},Cx=class extends X{},wx=class extends Cx{},Tx=class extends Cx{},Ex=class extends X{},Dx=class extends Ex{},Ox=class extends Ex{},kx=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`audio_values`,`past_key_values`]},Ax=class extends kx{_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.ignore_index??this.config.audio_token_id??this.config.audio_token_index,...e,audio_features:n})}},jx=class extends Ax{forward_params=[`input_ids`,`attention_mask`,`input_features`,`past_key_values`]},Mx=class extends X{},Nx=class extends Mx{},Px=class extends X{},Fx=class extends Px{},Ix=class extends X{},Lx=class extends Ix{},Rx=class extends Ix{},zx=class extends X{},Bx=class extends zx{},Vx=class extends zx{async _call(e){return new J(await super._call(e))}},Hx=class extends X{},Ux=class extends Hx{},Wx=class extends Hx{forward_params=[`input_ids`,`attention_mask`,`token_type_ids`,`past_key_values`];prepare_inputs_for_generation(e,t,n){let r=Bg(this,e,t,n);return r.token_type_ids=(r.past_key_values?Su:bu)(r.input_ids),r}},Gx=class extends X{},Kx=class extends Gx{},qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},Jx=class extends Gx{async _call(e){return new J(await super._call(e))}},Yx=class extends Gx{async _call(e){return new Ph(await super._call(e))}},Xx=class extends X{},Zx=class extends Gx{},Qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},$x=class extends Gx{async _call(e){return new J(await super._call(e))}},eS=class extends X{},tS=class extends eS{},nS=class extends eS{},rS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`position_ids`,`past_key_values`]},iS=class extends X{},aS=class extends iS{},oS=class extends iS{async _call(e){return new J(await super._call(e))}},sS=class extends X{},cS=class extends sS{},lS=class extends sS{},uS=class extends X{},dS=class extends uS{async forward(e){let t=!e.input_ids,n=!e.pixel_values;if(t&&n)throw Error("Either `input_ids` or `pixel_values` should be provided.");if(t&&(e.input_ids=yu([e.pixel_values.dims[0],1])),n){let{image_size:t}=this.config.vision_config;e.pixel_values=_u([0,3,t,t],0)}let{text_embeddings:r,image_embeddings:i,l2norm_text_embeddings:a,l2norm_image_embeddings:o}=await super.forward(e),s={};return t||(s.text_embeddings=r,s.l2norm_text_embeddings=a),n||(s.image_embeddings=i,s.l2norm_image_embeddings=o),s}},fS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},pS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},mS=class extends X{},hS=class extends mS{},gS=class extends mS{},_S=class extends Mb{},vS=class extends X{},yS=class extends vS{},bS=class extends vS{},xS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`spatial_shapes`,`position_ids`,`past_key_values`]},SS=class extends X{},CS=class extends SS{},wS=class extends SS{},TS=class extends X{},ES=class extends TS{},DS=class extends X{},OS=class extends DS{},kS=class extends DS{},AS=class extends X{},jS=class extends AS{},MS=class extends AS{},NS=class extends X{},PS=class extends NS{},FS=class extends NS{},IS=class extends X{},LS=class extends IS{},RS=class extends IS{},zS=class extends X{},BS=class extends zS{},VS=class extends zS{},HS=class extends zS{async _call(e){return new J(await super._call(e))}},US=class extends zS{},WS=class extends X{},GS=class extends WS{},KS=class extends X{},qS=class extends KS{},JS=class extends Mh{constructor({char_logits:e,bpe_logits:t,wp_logits:n}){super(),this.char_logits=e,this.bpe_logits=t,this.wp_logits=n}get logits(){return[this.char_logits,this.bpe_logits,this.wp_logits]}},YS=class extends X{},XS=class extends YS{async _call(e){return new JS(await super._call(e))}},ZS=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},QS=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},$S=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},eC=class extends $S{async encode(e){return new ZS(await q(this.sessions.encoder_model,e))}async decode(e){return new QS(await q(this.sessions.decoder_model,e))}},tC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},nC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},rC=class extends X{},iC=class extends rC{},aC=class extends rC{},oC=class extends X{},sC=class extends oC{},cC=class extends oC{},lC=class extends X{},uC=class extends lC{},dC=class extends lC{},fC=class extends Mb{},pC=class extends X{},mC=class extends pC{},hC=class extends pC{},gC=class extends X{},_C=class extends gC{},vC=class extends gC{async _call(e){return new Fh(await super._call(e))}},yC=class extends gC{async _call(e){return new J(await super._call(e))}},bC=class extends gC{async _call(e){return new Ih(await super._call(e))}},xC=class extends X{},SC=class extends xC{},CC=class extends xC{},wC=class extends X{},TC=class extends wC{},EC=class extends wC{async _call(e){return new J(await super._call(e))}},DC=class extends wC{},OC=class extends X{},kC=class extends OC{},AC=class extends OC{async _call(e){return new J(await super._call(e))}},jC=class extends OC{},MC=class extends X{},NC=class extends MC{},PC=class extends MC{async _call(e){return new J(await super._call(e))}},FC=class extends MC{},IC=class extends X{},LC=class extends IC{},RC=class extends IC{async _call(e){return new J(await super._call(e))}},zC=class extends IC{},BC=class extends X{},VC=class extends BC{},HC=class extends BC{async _call(e){return new J(await super._call(e))}},UC=class extends X{},WC=class extends UC{},GC=class extends UC{async _call(e){return new J(await super._call(e))}},KC=class extends X{},qC=class extends KC{},JC=class extends KC{async _call(e){return new Fh(await super._call(e))}},YC=class extends KC{async _call(e){return new J(await super._call(e))}},XC=class extends KC{async _call(e){return new Ph(await super._call(e))}},ZC=class extends X{},QC=class extends ZC{},$C=class extends ZC{},ew=class extends X{requires_attention_mask=!1;main_input_name=`input_values`;forward_params=[`input_values`,`decoder_input_ids`,`past_key_values`]},tw=class extends ew{},nw=class extends ew{},rw=class extends X{},iw=class extends rw{},aw=class extends rw{async _call(e){return new Fh(await super._call(e))}},ow=class extends rw{async _call(e){return new J(await super._call(e))}},sw=class extends rw{async _call(e){return new Ph(await super._call(e))}},cw=class extends rw{async _call(e){return new Ih(await super._call(e))}},lw=class extends X{},uw=class extends lw{},dw=class extends lw{},fw=class extends X{},pw=class extends fw{},mw=class extends fw{},hw=class extends X{},gw=class extends hw{forward_params=[`input_ids`,`pixel_values`,`images_seq_mask`,`images_emb_mask`,`attention_mask`,`position_ids`,`past_key_values`];constructor(...e){super(...e),this._generation_mode=`text`}async forward(e){let t=this._generation_mode??`text`,n;if(t===`text`||!e.past_key_values){let t=this.sessions.prepare_inputs_embeds;n=await q(t,ci(e,t.inputNames))}else{let t=this.sessions.gen_img_embeds;n=await q(t,ci({image_ids:e.input_ids},t.inputNames))}let r={...e,...n},i=await Pg(this,r),a=this.sessions[t===`text`?`lm_head`:`gen_head`];if(!a)throw Error(`Unable to find "${a}" generation head`);let o=await q(a,ci(i,a.inputNames));return{...n,...i,...o}}prepare_inputs_for_generation(e,t,n){let r=!!t.past_key_values;return Ng(this,t,1n),n.guidance_scale!==null&&n.guidance_scale>1&&(r?t.input_ids=H([t.input_ids,t.input_ids],0):(t.input_ids=H([t.input_ids,vu(t.input_ids,BigInt(n.pad_token_id))],0),t.attention_mask=H([t.attention_mask,vu(t.attention_mask,0n)],0))),(r||!t.pixel_values)&&(t.pixel_values=_u([0,0,3,384,384],1)),r&&(t.images_seq_mask=new V(`bool`,[,].fill(!0).fill(!1,0,1),[1,1]),t.images_emb_mask=new V(`bool`,[].fill(!1),[1,1,0])),t}async generate(e){return this._generation_mode=`text`,super.generate(e)}async generate_images(e){this._generation_mode=`image`;let t=(e.inputs??e[this.main_input_name]).dims[1],n=(await super.generate(e)).slice(null,[t,null]),r=this.sessions.image_decode,{decoded_image:i}=await q(r,{generated_tokens:n}),a=i.add_(1).mul_(255/2).clamp_(0,255).to(`uint8`),o=[];for(let e of a){let t=Vf.fromTensor(e);o.push(t)}return o}},_w=class extends X{},vw=class extends _w{},yw=class extends _w{},bw=class extends X{forward_params=[`input_ids`,`attention_mask`,`encoder_outputs`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`];_apply_and_filter_by_delay_pattern_mask(e){let[t,n]=e.dims,r=this.config.decoder.num_codebooks,i=n-r,a=0;for(let t=0;t0&&o<=i&&(e.data[a++]=e.data[t])}let o=Math.floor(t/r),s=a/(o*r);return new V(e.type,e.data.slice(0,a),[o,r,s])}prepare_inputs_for_generation(e,t,n){let r=BigInt(this.config.decoder.pad_token_id),i=structuredClone(e);for(let e=0;e=t&&(i[e][t]=r);return n.guidance_scale!==null&&n.guidance_scale>1&&(i=i.concat(i)),Vg(this,i,t,n)}async generate(e){let t=await super.generate(e),n=this._apply_and_filter_by_delay_pattern_mask(t).unsqueeze_(0),{audio_values:r}=await q(this.sessions.encodec_decode,{audio_codes:n});return r}},xw=class extends X{},Sw=class extends xw{},Cw=class extends xw{},ww=class extends X{},Tw=class extends ww{},Ew=class extends ww{},Dw=class extends X{},Ow=class extends Dw{},kw=class extends Dw{async _call(e){return new Fh(await super._call(e))}},Aw=class extends Dw{async _call(e){return new J(await super._call(e))}},jw=class extends Dw{async _call(e){return new Ph(await super._call(e))}},Mw=class extends Dw{async _call(e){return new Ih(await super._call(e))}},Nw=class extends X{},Pw=class extends Nw{},Fw=class extends X{},Iw=class extends Fw{},Lw=class extends Fw{},Rw=class extends X{},zw=class extends Rw{},Bw=class extends Rw{},Vw=class extends X{},Hw=class extends Vw{},Uw=class extends Vw{},Ww=class extends X{},Gw=class extends Ww{},Kw=class extends Ww{},qw=class extends X{},Jw=class extends qw{},Yw=class extends qw{async _call(e){return new J(await super._call(e))}},Xw=class extends X{},Zw=class extends Xw{},Qw=class extends Xw{},$w=class extends X{},eT=class extends $w{},tT=class extends $w{},nT=class extends X{},rT=class extends nT{},iT=class extends nT{},aT=class extends X{},oT=class extends aT{},sT=class extends aT{},cT=class extends Mb{},lT=class extends X{},uT=class extends lT{async _call(e){return new Lh(await super._call(e))}},dT=class extends X{},fT=class extends dT{},pT=class extends dT{},mT=class extends X{},hT=class extends mT{},gT=class extends mT{},_T=class extends X{},vT=class extends _T{},yT=class extends _T{},bT=class extends X{},xT=class extends bT{},ST=class extends bT{},CT=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`pixel_values`,`image_sizes`,`past_key_values`]},wT=class extends CT{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,image_sizes:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,...u}){if(!a){let t;if(n&&e.dims[1]!==1){if(!r)throw Error("`image_sizes` must be provided when `pixel_values` is provided.");({image_features:t}=await q(this.sessions.vision_encoder,{pixel_values:n,image_sizes:r}))}else{let e=this.config.normalized_config.hidden_size;t=new V(`float32`,[],[0,e])}({inputs_embeds:a}=await q(this.sessions.prepare_inputs_embeds,{input_ids:e,image_features:t}))}return await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,position_ids:i,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1)}},TT=class extends X{},ET=class extends TT{},DT=class extends TT{async _call(e){return new J(await super._call(e))}},OT=class extends X{},kT=class extends OT{},AT=class extends OT{async _call(e){return new Ph(await super._call(e))}},jT=class extends X{},MT=class extends jT{},NT=class extends jT{},PT=class extends X{},FT=class extends PT{},IT=class extends PT{},LT=class extends X{},RT=class extends LT{},zT=class extends LT{},BT=class extends X{},VT=class extends BT{},HT=class extends BT{},UT=class extends X{},WT=class extends UT{},GT=class extends UT{},KT=class extends $b{},qT=class extends ex{},JT=class extends KT{},YT=class extends qT{},XT=class extends KT{},ZT=class extends XT{},QT=class extends XT{},$T=class extends ZT{},eE=class extends X{},tE=class extends eE{},nE=class extends eE{async _call(e){return new J(await super._call(e))}},rE=class extends X{},iE=class extends rE{},aE=class extends rE{async _call(e){return new oE(await super._call(e))}},oE=class extends Nv{},sE=class extends X{},cE=class extends sE{},lE=class extends sE{async _call(e){return new Fh(await super._call(e))}},uE=class extends sE{async _call(e){return new J(await super._call(e))}},dE=class extends sE{async _call(e){return new Ph(await super._call(e))}},fE=class extends sE{async _call(e){return new Ih(await super._call(e))}},pE=class extends X{},mE=class extends pE{},hE=class extends pE{async _call(e){return new Fh(await super._call(e))}},gE=class extends pE{async _call(e){return new J(await super._call(e))}},_E=class extends pE{async _call(e){return new Ph(await super._call(e))}},vE=class extends pE{async _call(e){return new Ih(await super._call(e))}},yE=class extends X{},bE=class extends yE{},xE=class extends yE{async _call(e){return new SE(await super._call(e))}},SE=class extends Nv{},CE=class extends Mh{constructor({iou_scores:e,pred_masks:t}){super(),this.iou_scores=e,this.pred_masks=t}},wE=class extends X{},TE=class extends wE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){e=!e.image_embeddings||!e.image_positional_embeddings?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_labels??=yu(e.input_points.dims.slice(0,-1));let t={image_embeddings:e.image_embeddings,image_positional_embeddings:e.image_positional_embeddings};return e.input_points&&(t.input_points=e.input_points),e.input_labels&&(t.input_labels=e.input_labels),e.input_boxes&&(t.input_boxes=e.input_boxes),await q(this.sessions.prompt_encoder_mask_decoder,t)}async _call(e){return new CE(await super._call(e))}},EE=class extends Mh{constructor({iou_scores:e,pred_masks:t,object_score_logits:n}){super(),this.iou_scores=e,this.pred_masks=t,this.object_score_logits=n}},DE=class extends X{},OE=class extends DE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){let{num_feature_levels:t}=this.config.vision_config;if(e=Array.from({length:t},(e,t)=>`image_embeddings.${t}`).some(t=>!e[t])?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_points){if(e.input_boxes&&e.input_boxes.dims[1]!==1)throw Error("When both `input_points` and `input_boxes` are provided, the number of boxes per image must be 1.");let t=e.input_points.dims;e.input_labels??=yu(t.slice(0,-1)),e.input_boxes??=_u([t[0],0,4],0)}else if(e.input_boxes){let t=e.input_boxes.dims;e.input_labels=_u([t[0],t[1],0],-1n),e.input_points=_u([t[0],1,0,2],0)}else throw Error("At least one of `input_points` or `input_boxes` must be provided.");let n=this.sessions.prompt_encoder_mask_decoder;return await q(n,ci(e,n.inputNames))}async _call(e){return new EE(await super._call(e))}},kE=class extends OE{},AE=class extends OE{},jE=class extends X{},ME=class extends jE{},NE=class extends jE{},PE=class extends jE{},FE=class extends X{},IE=class extends FE{},LE=class extends FE{},RE=class extends FE{},zE=class extends X{},BE=class extends zE{},VE=class extends zE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},HE=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},UE=class extends X{},WE=class extends UE{},GE=class extends UE{},KE=class extends rS{},qE=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},JE=class extends qE{async encode(e){return await q(this.sessions.encoder_model,e)}async decode(e){return await q(this.sessions.decoder_model,e)}},YE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},XE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},ZE=class extends X{},QE=class extends ZE{},$E=class extends ZE{},eD=class extends X{},tD=class extends eD{},nD=class extends eD{},rD=class extends eD{async generate_speech(e,t,{threshold:n=.5,minlenratio:r=0,maxlenratio:i=20,vocoder:a=null}={}){let o={input_ids:e},{encoder_outputs:s,encoder_attention_mask:c}=await Dg(this,o),l=s.dims[1]/this.config.reduction_factor,u=Math.floor(l*i),d=Math.floor(l*r),f=this.config.num_mel_bins,p=[],m=null,h=null,g=0;for(;;){++g;let e=bg(!!h),r;r=h?h.output_sequence_out:new V(`float32`,new Float32Array(f),[1,1,f]);let i={use_cache_branch:e,output_sequence:r,encoder_attention_mask:c,speaker_embeddings:t,encoder_hidden_states:s};Mg(this,i,m),h=await q(this.sessions.decoder_model_merged,i),m=kg(h,m);let{prob:a,spectrum:o}=h;if(p.push(o),g>=d&&(Array.from(a.data).filter(e=>e>=n).length>0||g>=u))break}let _=H(p),{waveform:v}=await q(a.sessions.model,{spectrogram:_});return{spectrogram:_,waveform:v}}},iD=class extends X{main_input_name=`spectrogram`},aD=class extends X{},oD=class extends aD{},sD=class extends aD{async _call(e){return new Fh(await super._call(e))}},cD=class extends aD{async _call(e){return new J(await super._call(e))}},lD=class extends aD{async _call(e){return new Ih(await super._call(e))}},uD=class extends X{},dD=class extends uD{},fD=class extends uD{},pD=class extends X{},mD=class extends pD{},hD=class extends pD{},gD=class extends X{},_D=class extends gD{},vD=class extends X{},yD=class extends vD{async generate_speech({input_ids:e,attention_mask:t,style:n,num_inference_steps:r=5,speed:i=1.05}){let{sampling_rate:a,chunk_compress_factor:o,base_chunk_size:s,latent_dim:c}=this.config,{last_hidden_state:l,durations:u}=await q(this.sessions.text_encoder,{input_ids:e,attention_mask:t,style:n}),d=u.div(i).mul_(a),f=s*o,p=d.data,m=Int32Array.from(p,e=>Math.ceil(e/f)),h=Math.max(...m),g=e.dims[0],_=new BigInt64Array(g*h);for(let e=0;ee*t,1),r=Ql[e.type];c[e.name]=new V(e.type,new r(n),t)}let f=Ql[d],p=new V(d,new f(s*dO),[1,s,dO]),m=t[Symbol.asyncIterator]?.()??t[Symbol.iterator]?.();if(!m)throw Error(`input_features must be iterable or async iterable`);return{encoder_session:i,enc_kv_cache:c,enc_padding_cache:p,enc_past_seq_len:0,audio_embed_queue:[],audio_embed_total_tokens:0,audio_queue_offset:0,audio_consumed:0,stream_exhausted:!1,chunks_iter:m,text_hidden_size:n.hidden_size}}async function hO(e,t){let n=t.dims[2],r=Math.floor((fO+n-3)/2)+1,i=new V(`int64`,BigInt64Array.from({length:r},(t,n)=>BigInt(e.enc_past_seq_len+n)),[1,r]),a=e.enc_past_seq_len+r,o=yu([1,a]),{audio_embeds:s,present_padding_cache:c,...l}=await q(e.encoder_session,{input_features:t,attention_mask:o,position_ids:i,past_padding_cache:e.enc_padding_cache,...e.enc_kv_cache});e.enc_padding_cache.location===`gpu-buffer`&&e.enc_padding_cache.dispose(),e.enc_padding_cache=c;for(let t in l)if(t.startsWith(`present.`)){let n=t.replace(`present`,`past_key_values`),r=e.enc_kv_cache[n];r?.location===`gpu-buffer`&&r.dispose(),e.enc_kv_cache[n]=l[t]}return e.enc_past_seq_len=a,s}async function gO(e,t){for(;e.audio_embed_total_tokens0&&e.audio_embed_queue.length>0;){let t=e.audio_embed_queue[0],n=t.tokens-e.audio_queue_offset,o=Math.min(a,n),s=e.audio_queue_offset*e.text_hidden_size;for(let n=0;n=t.tokens&&(e.audio_embed_queue.shift(),e.audio_queue_offset=0)}e.audio_consumed+=n-a}var vO=class extends rg{constructor(e){super(),this._s=e}_call(e){let t=this._s.stream_exhausted&&this._s.audio_embed_queue.length===0;return e.map(()=>t)}},yO=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`]},bO=class extends yO{async forward({input_ids:e,past_key_values:t,...n}){let r=e.dims[1],i=pO.get(this);i&&await gO(i,i.audio_consumed+r);let{inputs_embeds:a}=await q(this.sessions.embed_tokens,{input_ids:e});i&&_O(i,a,r);let o={inputs_embeds:a,...n};Mg(this,o,t);let s=this.sessions.decoder_model_merged;return await q(s,ci(o,s.inputNames))}async generate({input_features:e,stopping_criteria:t,...n}){if(!e)throw Error(`input_features (generator/iterable) must be provided`);let r=mO(this,e);pO.set(this,r);let i=new ig;i.push(new vO(r)),t&&i.extend(t);try{return await super.generate({...n,stopping_criteria:i})}finally{r.enc_kv_cache.dispose(),pO.delete(this)}}},xO=class extends X{},SO=class extends xO{},CO=class extends xO{async _call(e){return new Lh(await super._call(e))}},wO=class extends xO{async _call(e){return new J(await super._call(e))}},TO=class extends Mh{constructor({logits:e,embeddings:t}){super(),this.logits=e,this.embeddings=t}},EO=class extends X{},DO=class extends EO{},OO=class extends EO{async _call(e){return new Lh(await super._call(e))}},kO=class extends EO{async _call(e){return new J(await super._call(e))}},AO=class extends EO{async _call(e){return new TO(await super._call(e))}},jO=class extends EO{async _call(e){return new Ph(await super._call(e))}},MO=class extends X{},NO=class extends MO{},PO=class extends ng{return_timestamps=null;return_token_timestamps=null;num_frames=null;alignment_heads=null;task=null;language=null;no_timestamps_token_id=null;prompt_ids=null;is_multilingual=null;lang_to_id=null;task_to_id=null;max_initial_timestamp_index=1},FO=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`attention_mask`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},IO=class extends FO{},LO=class extends FO{_prepare_generation_config(e,t){return super._prepare_generation_config(e,t,PO)}_retrieve_init_tokens(e){let t=[e.decoder_start_token_id],n=e.language,r=e.task;if(e.is_multilingual){n||=(A.warn(`No language specified - defaulting to English (en).`),`en`);let i=`<|${Dd(n)}|>`;t.push(e.lang_to_id[i]),t.push(e.task_to_id[r??`transcribe`])}else if(n||r)throw Error("Cannot specify `task` or `language` for an English-only model. If the model is intended to be multilingual, pass `is_multilingual=true` to generate, or update the generation config.");return!e.return_timestamps&&e.no_timestamps_token_id&&t.at(-1)!==e.no_timestamps_token_id?t.push(e.no_timestamps_token_id):e.return_timestamps&&t.at(-1)===e.no_timestamps_token_id&&(A.warn("<|notimestamps|> prompt token is removed from generation_config since `return_timestamps` is set to `true`."),t.pop()),t.filter(e=>e!=null)}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,...i}){t=this._prepare_generation_config(t,i);let a=i.decoder_input_ids instanceof V?Du(i.decoder_input_ids):i.decoder_input_ids??this._retrieve_init_tokens(t);if(t.return_timestamps&&(n??=new Uh,n.push(new Jh(t,a))),t.begin_suppress_tokens&&(n??=new Uh,n.push(new qh(t.begin_suppress_tokens,a.length))),t.return_token_timestamps){if(!t.alignment_heads)throw Error("Model generation config has no `alignment_heads`, token-level timestamps not available. See https://gist.github.com/hollance/42e32852f24243b748ae6bc1f985b13a on how to add this property to the generation config.");t.task===`translate`&&A.warn(`Token-level timestamps may not be reliable for task 'translate'.`),t.output_attentions=!0,t.return_dict_in_generate=!0}if(t.return_timestamps&&!i.max_new_tokens)return this._generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:a,kwargs:i});let o=await super.generate({inputs:e,generation_config:t,logits_processor:n,decoder_input_ids:a,...i});return t.return_token_timestamps&&(o.token_timestamps=this._extract_token_timestamps(o,t.alignment_heads,t.num_frames,.02,a.length)),o}async _generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:r,kwargs:i}){let a=t.no_timestamps_token_id+1,o=Array.isArray(t.eos_token_id)?t.eos_token_id[0]:t.eos_token_id,s=t.return_token_timestamps,c=e,l=c.dims[2],u=2*this.config.max_source_positions,d=0,f=[],p=[];for(;de+n)}if(v.length>0&&v.at(-1)===o&&v.pop(),v.length===0)break;let b=v.map(e=>e>=a),x=v.length>=2&&b[v.length-1]&&!b[v.length-2],S=[];for(let e=0;e0){if(x)C=e-d;else{let e=S.at(-1);C=(v[e-1]-a)*2,ee=e}}else C=e-d;let w=Math.floor(d/2),te=a+1500;for(let e=0;e=a&&(v[e]=Math.min(v[e]+w,te));f.push(...v.slice(0,ee)),y&&p.push(...y.slice(0,ee)),d+=C}f.push(o);let m=[...r,...f];if(s){let e=new V(`int64`,m.map(BigInt),[1,m.length]),t=[...Array(r.length).fill(0),...p,0];return{sequences:e,token_timestamps:new V(`float32`,new Float32Array(t),[1,t.length])}}return new V(`int64`,m.map(BigInt),[1,m.length])}_extract_token_timestamps(e,t,n=null,r=.02,i=0){if(!e.cross_attentions)throw Error("Model outputs must contain cross attentions to extract timestamps. This is most likely because the model was not exported with `output_attentions=True`.");n??A.warn("`num_frames` has not been set, meaning the entire audio will be analyzed. This may lead to inaccurate token-level timestamps for short audios (< 30 seconds).");let a=this.config.median_filter_width;a===void 0&&(A.warn("Model config has no `median_filter_width`, using default value of 7."),a=7);let o=e.cross_attentions,s=Array.from({length:this.config.decoder_layers},(e,t)=>H(o.map(e=>e[t]),2)),c=du(t.map(([e,t])=>{if(e>=s.length)throw Error(`Layer index ${e} is out of bounds for cross attentions (length ${s.length}).`);return n?s[e].slice(null,t,null,[0,n]):s[e].slice(null,t)})).permute(1,0,2,3),[l,u]=pu(c,-2,0,!0),d=c.clone();for(let e=0;e0?d.slice(null,null,[i,d.dims[2]],null):d,1)],p=e.sequences.dims,m=new V(`float32`,new Float32Array(p[0]*p[1]),p);for(let e=0;et[n+1]-t[n])).map(e=>!!e),o=[];for(let e=0;e0&&s.push(o.at(-1)),m[e].data.set(s)}return m}},RO=class extends LO{},zO=class extends X{},BO=class extends zO{},VO=class extends zO{async _call(e){return new Fh(await super._call(e))}},HO=class extends zO{async _call(e){return new J(await super._call(e))}},UO=class extends zO{async _call(e){return new Ph(await super._call(e))}},WO=class extends zO{async _call(e){return new Ih(await super._call(e))}},GO=class extends X{},KO=class extends GO{},qO=class extends GO{async _call(e){return new Fh(await super._call(e))}},JO=class extends GO{async _call(e){return new J(await super._call(e))}},YO=class extends GO{async _call(e){return new Ph(await super._call(e))}},XO=class extends GO{async _call(e){return new Ih(await super._call(e))}},ZO=class extends X{},QO=class extends ZO{},$O=class extends ZO{async _call(e){return new ek(await super._call(e))}},ek=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},tk=class extends X{},nk=class extends tk{},rk=class extends tk{},ik=class extends X{},ak=class extends ik{},ok=class extends ik{},sk=/* @__PURE__ */ new Map([[`bert`,`BertModel`],[`eurobert`,`EuroBertModel`],[`neobert`,`NeoBertModel`],[`modernbert`,`ModernBertModel`],[`nomic_bert`,`NomicBertModel`],[`roformer`,`RoFormerModel`],[`electra`,`ElectraModel`],[`esm`,`EsmModel`],[`convbert`,`ConvBertModel`],[`camembert`,`CamembertModel`],[`deberta`,`DebertaModel`],[`deberta-v2`,`DebertaV2Model`],[`mpnet`,`MPNetModel`],[`albert`,`AlbertModel`],[`distilbert`,`DistilBertModel`],[`roberta`,`RobertaModel`],[`xlm`,`XLMModel`],[`xlm-roberta`,`XLMRobertaModel`],[`clap`,`ClapModel`],[`clip`,`CLIPModel`],[`clipseg`,`CLIPSegModel`],[`chinese_clip`,`ChineseCLIPModel`],[`siglip`,`SiglipModel`],[`jina_clip`,`JinaCLIPModel`],[`mobilebert`,`MobileBertModel`],[`squeezebert`,`SqueezeBertModel`],[`wav2vec2`,`Wav2Vec2Model`],[`wav2vec2-bert`,`Wav2Vec2BertModel`],[`unispeech`,`UniSpeechModel`],[`unispeech-sat`,`UniSpeechSatModel`],[`hubert`,`HubertModel`],[`wavlm`,`WavLMModel`],[`audio-spectrogram-transformer`,`ASTModel`],[`vits`,`VitsModel`],[`pyannote`,`PyAnnoteModel`],[`wespeaker-resnet`,`WeSpeakerResNetModel`],[`detr`,`DetrModel`],[`rt_detr`,`RTDetrModel`],[`rt_detr_v2`,`RTDetrV2Model`],[`rf_detr`,`RFDetrModel`],[`d_fine`,`DFineModel`],[`table-transformer`,`TableTransformerModel`],[`vit`,`ViTModel`],[`ijepa`,`IJepaModel`],[`pvt`,`PvtModel`],[`vit_msn`,`ViTMSNModel`],[`vit_mae`,`ViTMAEModel`],[`groupvit`,`GroupViTModel`],[`fastvit`,`FastViTModel`],[`mobilevit`,`MobileViTModel`],[`mobilevitv2`,`MobileViTV2Model`],[`owlvit`,`OwlViTModel`],[`owlv2`,`Owlv2Model`],[`beit`,`BeitModel`],[`deit`,`DeiTModel`],[`hiera`,`HieraModel`],[`convnext`,`ConvNextModel`],[`convnextv2`,`ConvNextV2Model`],[`dinov2`,`Dinov2Model`],[`dinov2_with_registers`,`Dinov2WithRegistersModel`],[`dinov3_vit`,`DINOv3ViTModel`],[`dinov3_convnext`,`DINOv3ConvNextModel`],[`resnet`,`ResNetModel`],[`swin`,`SwinModel`],[`swin2sr`,`Swin2SRModel`],[`donut-swin`,`DonutSwinModel`],[`yolos`,`YolosModel`],[`dpt`,`DPTModel`],[`glpn`,`GLPNModel`],[`hifigan`,`SpeechT5HifiGan`],[`efficientnet`,`EfficientNetModel`],[`decision_transformer`,`DecisionTransformerModel`],[`patchtst`,`PatchTSTModel`],[`patchtsmixer`,`PatchTSMixerModel`],[`mobilenet_v1`,`MobileNetV1Model`],[`mobilenet_v2`,`MobileNetV2Model`],[`mobilenet_v3`,`MobileNetV3Model`],[`mobilenet_v4`,`MobileNetV4Model`],[`maskformer`,`MaskFormerModel`],[`mgp-str`,`MgpstrForSceneTextRecognition`],[`style_text_to_speech_2`,`StyleTextToSpeech2Model`],[`openai_privacy_filter`,`OpenAIPrivacyFilterModel`]]),ck=/* @__PURE__ */ new Map([[`t5`,`T5Model`],[`longt5`,`LongT5Model`],[`mt5`,`MT5Model`],[`bart`,`BartModel`],[`mbart`,`MBartModel`],[`marian`,`MarianModel`],[`whisper`,`WhisperModel`],[`cohere_asr`,`CohereAsrModel`],[`m2m_100`,`M2M100Model`],[`blenderbot`,`BlenderbotModel`],[`blenderbot-small`,`BlenderbotSmallModel`]]),lk=/* @__PURE__ */ new Map([[`mimi`,`MimiModel`],[`dac`,`DacModel`],[`snac`,`SnacModel`]]),uk=/* @__PURE__ */ new Map([[`bloom`,`BloomModel`],[`jais`,`JAISModel`],[`gpt2`,`GPT2Model`],[`gpt_oss`,`GptOssModel`],[`gptj`,`GPTJModel`],[`gpt_bigcode`,`GPTBigCodeModel`],[`gpt_neo`,`GPTNeoModel`],[`gpt_neox`,`GPTNeoXModel`],[`codegen`,`CodeGenModel`],[`llama`,`LlamaModel`],[`apertus`,`ApertusModel`],[`nanochat`,`NanoChatModel`],[`arcee`,`ArceeModel`],[`afmoe`,`AfmoeModel`],[`lfm2`,`Lfm2Model`],[`lfm2_moe`,`Lfm2MoeModel`],[`smollm3`,`SmolLM3Model`],[`exaone`,`ExaoneModel`],[`olmo`,`OlmoModel`],[`olmo2`,`Olmo2Model`],[`olmo3`,`Olmo3Model`],[`olmo_hybrid`,`OlmoHybridModel`],[`mobilellm`,`MobileLLMModel`],[`granite`,`GraniteModel`],[`granitemoehybrid`,`GraniteMoeHybridModel`],[`cohere`,`CohereModel`],[`cohere2`,`Cohere2Model`],[`gemma`,`GemmaModel`],[`gemma2`,`Gemma2Model`],[`vaultgemma`,`VaultGemmaModel`],[`gemma3_text`,`Gemma3Model`],[`helium`,`HeliumModel`],[`glm`,`GlmModel`],[`glm_moe_dsa`,`GlmMoeDsaModel`],[`openelm`,`OpenELMModel`],[`qwen2`,`Qwen2Model`],[`qwen2_moe`,`Qwen2MoeModel`],[`qwen3`,`Qwen3Model`],[`qwen3_moe`,`Qwen3MoeModel`],[`qwen3_next`,`Qwen3NextModel`],[`phi`,`PhiModel`],[`phi3`,`Phi3Model`],[`mpt`,`MptModel`],[`opt`,`OPTModel`],[`mistral`,`MistralModel`],[`mistral4`,`Mistral4Model`],[`ministral`,`MinistralModel`],[`ministral3`,`Ministral3Model`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2Model`],[`deepseek_v3`,`DeepseekV3Model`],[`deepseek_v4`,`DeepseekV4Model`],[`falcon`,`FalconModel`],[`falcon_h1`,`FalconH1Model`],[`nemotron_h`,`NemotronHModel`],[`solar_open`,`SolarOpenModel`],[`stablelm`,`StableLmModel`],[`modernbert-decoder`,`ModernBertDecoderModel`],[`hunyuan_v1_dense`,`HunYuanDenseV1Model`],[`youtu`,`YoutuModel`],[`zaya`,`ZayaModel`],[`hrm_text`,`HrmTextModel`]]),dk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForSpeechToText`],[`whisper`,`WhisperForConditionalGeneration`],[`lite-whisper`,`LiteWhisperForConditionalGeneration`],[`moonshine`,`MoonshineForConditionalGeneration`],[`cohere_asr`,`CohereAsrForConditionalGeneration`]]),fk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForTextToSpeech`]]),pk=/* @__PURE__ */ new Map([[`vits`,`VitsModel`],[`musicgen`,`MusicgenForConditionalGeneration`],[`supertonic`,`SupertonicForConditionalGeneration`]]),mk=/* @__PURE__ */ new Map([[`bert`,`BertForSequenceClassification`],[`eurobert`,`EuroBertForSequenceClassification`],[`neobert`,`NeoBertForSequenceClassification`],[`modernbert`,`ModernBertForSequenceClassification`],[`roformer`,`RoFormerForSequenceClassification`],[`electra`,`ElectraForSequenceClassification`],[`esm`,`EsmForSequenceClassification`],[`convbert`,`ConvBertForSequenceClassification`],[`camembert`,`CamembertForSequenceClassification`],[`deberta`,`DebertaForSequenceClassification`],[`deberta-v2`,`DebertaV2ForSequenceClassification`],[`mpnet`,`MPNetForSequenceClassification`],[`albert`,`AlbertForSequenceClassification`],[`distilbert`,`DistilBertForSequenceClassification`],[`roberta`,`RobertaForSequenceClassification`],[`xlm`,`XLMForSequenceClassification`],[`xlm-roberta`,`XLMRobertaForSequenceClassification`],[`bart`,`BartForSequenceClassification`],[`mbart`,`MBartForSequenceClassification`],[`mobilebert`,`MobileBertForSequenceClassification`],[`squeezebert`,`SqueezeBertForSequenceClassification`]]),hk=/* @__PURE__ */ new Map([[`bert`,`BertForTokenClassification`],[`eurobert`,`EuroBertForTokenClassification`],[`neobert`,`NeoBertForTokenClassification`],[`modernbert`,`ModernBertForTokenClassification`],[`roformer`,`RoFormerForTokenClassification`],[`electra`,`ElectraForTokenClassification`],[`esm`,`EsmForTokenClassification`],[`convbert`,`ConvBertForTokenClassification`],[`camembert`,`CamembertForTokenClassification`],[`deberta`,`DebertaForTokenClassification`],[`deberta-v2`,`DebertaV2ForTokenClassification`],[`mpnet`,`MPNetForTokenClassification`],[`distilbert`,`DistilBertForTokenClassification`],[`roberta`,`RobertaForTokenClassification`],[`xlm`,`XLMForTokenClassification`],[`xlm-roberta`,`XLMRobertaForTokenClassification`],[`openai_privacy_filter`,`OpenAIPrivacyFilterForTokenClassification`]]),gk=/* @__PURE__ */ new Map([[`t5`,`T5ForConditionalGeneration`],[`longt5`,`LongT5ForConditionalGeneration`],[`mt5`,`MT5ForConditionalGeneration`],[`bart`,`BartForConditionalGeneration`],[`mbart`,`MBartForConditionalGeneration`],[`marian`,`MarianMTModel`],[`m2m_100`,`M2M100ForConditionalGeneration`],[`blenderbot`,`BlenderbotForConditionalGeneration`],[`blenderbot-small`,`BlenderbotSmallForConditionalGeneration`]]),_k=/* @__PURE__ */ new Map([[`bloom`,`BloomForCausalLM`],[`gpt2`,`GPT2LMHeadModel`],[`gpt_oss`,`GptOssForCausalLM`],[`jais`,`JAISLMHeadModel`],[`gptj`,`GPTJForCausalLM`],[`gpt_bigcode`,`GPTBigCodeForCausalLM`],[`gpt_neo`,`GPTNeoForCausalLM`],[`gpt_neox`,`GPTNeoXForCausalLM`],[`codegen`,`CodeGenForCausalLM`],[`llama`,`LlamaForCausalLM`],[`nanochat`,`NanoChatForCausalLM`],[`apertus`,`ApertusForCausalLM`],[`llama4_text`,`Llama4ForCausalLM`],[`arcee`,`ArceeForCausalLM`],[`afmoe`,`AfmoeForCausalLM`],[`lfm2`,`Lfm2ForCausalLM`],[`lfm2_moe`,`Lfm2MoeForCausalLM`],[`smollm3`,`SmolLM3ForCausalLM`],[`exaone`,`ExaoneForCausalLM`],[`olmo`,`OlmoForCausalLM`],[`olmo2`,`Olmo2ForCausalLM`],[`olmo3`,`Olmo3ForCausalLM`],[`olmo_hybrid`,`OlmoHybridForCausalLM`],[`mobilellm`,`MobileLLMForCausalLM`],[`granite`,`GraniteForCausalLM`],[`granitemoehybrid`,`GraniteMoeHybridForCausalLM`],[`cohere`,`CohereForCausalLM`],[`cohere2`,`Cohere2ForCausalLM`],[`gemma`,`GemmaForCausalLM`],[`gemma2`,`Gemma2ForCausalLM`],[`vaultgemma`,`VaultGemmaForCausalLM`],[`gemma3_text`,`Gemma3ForCausalLM`],[`gemma3`,`Gemma3ForCausalLM`],[`helium`,`HeliumForCausalLM`],[`glm`,`GlmForCausalLM`],[`glm_moe_dsa`,`GlmMoeDsaForCausalLM`],[`openelm`,`OpenELMForCausalLM`],[`qwen2`,`Qwen2ForCausalLM`],[`qwen2_moe`,`Qwen2MoeForCausalLM`],[`qwen3`,`Qwen3ForCausalLM`],[`qwen3_moe`,`Qwen3MoeForCausalLM`],[`qwen3_next`,`Qwen3NextForCausalLM`],[`qwen2_vl`,`Qwen2VLForCausalLM`],[`qwen2_5_vl`,`Qwen2_5_VLForCausalLM`],[`qwen3_vl`,`Qwen3VLForCausalLM`],[`qwen3_vl_moe`,`Qwen3VLMoeForCausalLM`],[`qwen3_5`,`Qwen3_5ForCausalLM`],[`qwen3_5_text`,`Qwen3_5ForCausalLM`],[`qwen3_5_moe`,`Qwen3_5MoeForCausalLM`],[`gemma3n`,`Gemma3nForCausalLM`],[`gemma4`,`Gemma4ForCausalLM`],[`phi`,`PhiForCausalLM`],[`phi3`,`Phi3ForCausalLM`],[`mpt`,`MptForCausalLM`],[`opt`,`OPTForCausalLM`],[`mbart`,`MBartForCausalLM`],[`mistral`,`MistralForCausalLM`],[`mistral4`,`Mistral4ForCausalLM`],[`ministral`,`MinistralForCausalLM`],[`ministral3`,`Ministral3ForCausalLM`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2ForCausalLM`],[`deepseek_v3`,`DeepseekV3ForCausalLM`],[`deepseek_v4`,`DeepseekV4ForCausalLM`],[`falcon`,`FalconForCausalLM`],[`falcon_h1`,`FalconH1ForCausalLM`],[`nemotron_h`,`NemotronHForCausalLM`],[`trocr`,`TrOCRForCausalLM`],[`solar_open`,`SolarOpenForCausalLM`],[`stablelm`,`StableLmForCausalLM`],[`modernbert-decoder`,`ModernBertDecoderForCausalLM`],[`hunyuan_v1_dense`,`HunYuanDenseV1ForCausalLM`],[`youtu`,`YoutuForCausalLM`],[`zaya`,`ZayaForCausalLM`],[`hrm_text`,`HrmTextForCausalLM`],[`phi3_v`,`Phi3VForCausalLM`]]),vk=/* @__PURE__ */ new Map([[`multi_modality`,`MultiModalityCausalLM`]]),yk=/* @__PURE__ */ new Map([[`bert`,`BertForMaskedLM`],[`eurobert`,`EuroBertForMaskedLM`],[`neobert`,`NeoBertForMaskedLM`],[`modernbert`,`ModernBertForMaskedLM`],[`roformer`,`RoFormerForMaskedLM`],[`electra`,`ElectraForMaskedLM`],[`esm`,`EsmForMaskedLM`],[`convbert`,`ConvBertForMaskedLM`],[`camembert`,`CamembertForMaskedLM`],[`deberta`,`DebertaForMaskedLM`],[`deberta-v2`,`DebertaV2ForMaskedLM`],[`mpnet`,`MPNetForMaskedLM`],[`albert`,`AlbertForMaskedLM`],[`distilbert`,`DistilBertForMaskedLM`],[`roberta`,`RobertaForMaskedLM`],[`xlm`,`XLMWithLMHeadModel`],[`xlm-roberta`,`XLMRobertaForMaskedLM`],[`mobilebert`,`MobileBertForMaskedLM`],[`squeezebert`,`SqueezeBertForMaskedLM`]]),bk=/* @__PURE__ */ new Map([[`bert`,`BertForQuestionAnswering`],[`neobert`,`NeoBertForQuestionAnswering`],[`roformer`,`RoFormerForQuestionAnswering`],[`electra`,`ElectraForQuestionAnswering`],[`convbert`,`ConvBertForQuestionAnswering`],[`camembert`,`CamembertForQuestionAnswering`],[`deberta`,`DebertaForQuestionAnswering`],[`deberta-v2`,`DebertaV2ForQuestionAnswering`],[`mpnet`,`MPNetForQuestionAnswering`],[`albert`,`AlbertForQuestionAnswering`],[`distilbert`,`DistilBertForQuestionAnswering`],[`roberta`,`RobertaForQuestionAnswering`],[`xlm`,`XLMForQuestionAnswering`],[`xlm-roberta`,`XLMRobertaForQuestionAnswering`],[`mobilebert`,`MobileBertForQuestionAnswering`],[`squeezebert`,`SqueezeBertForQuestionAnswering`]]),xk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`]]),Sk=/* @__PURE__ */ new Map([[`llava`,`LlavaForConditionalGeneration`],[`llava_onevision`,`LlavaOnevisionForConditionalGeneration`],[`moondream1`,`Moondream1ForConditionalGeneration`],[`florence2`,`Florence2ForConditionalGeneration`],[`qwen2_vl`,`Qwen2VLForConditionalGeneration`],[`qwen2_5_vl`,`Qwen2_5_VLForConditionalGeneration`],[`qwen3_vl`,`Qwen3VLForConditionalGeneration`],[`qwen3_vl_moe`,`Qwen3VLMoeForConditionalGeneration`],[`qwen3_5`,`Qwen3_5ForConditionalGeneration`],[`qwen3_5_moe`,`Qwen3_5MoeForConditionalGeneration`],[`lfm2_vl`,`Lfm2VlForConditionalGeneration`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`],[`paligemma`,`PaliGemmaForConditionalGeneration`],[`llava_qwen2`,`LlavaQwen2ForCausalLM`],[`gemma3`,`Gemma3ForConditionalGeneration`],[`gemma3n`,`Gemma3nForConditionalGeneration`],[`gemma4`,`Gemma4ForConditionalGeneration`],[`mistral3`,`Mistral3ForConditionalGeneration`],[`lighton_ocr`,`LightOnOcrForConditionalGeneration`],[`glm_ocr`,`GlmOcrForConditionalGeneration`]]),Ck=/* @__PURE__ */ new Map([[`granite_speech`,`GraniteSpeechForConditionalGeneration`],[`ultravox`,`UltravoxModel`],[`voxtral`,`VoxtralForConditionalGeneration`],[`voxtral_realtime`,`VoxtralRealtimeForConditionalGeneration`]]),wk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`]]),Tk=/* @__PURE__ */ new Map([[`vit`,`ViTForImageClassification`],[`ijepa`,`IJepaForImageClassification`],[`pvt`,`PvtForImageClassification`],[`vit_msn`,`ViTMSNForImageClassification`],[`fastvit`,`FastViTForImageClassification`],[`mobilevit`,`MobileViTForImageClassification`],[`mobilevitv2`,`MobileViTV2ForImageClassification`],[`beit`,`BeitForImageClassification`],[`deit`,`DeiTForImageClassification`],[`hiera`,`HieraForImageClassification`],[`convnext`,`ConvNextForImageClassification`],[`convnextv2`,`ConvNextV2ForImageClassification`],[`dinov2`,`Dinov2ForImageClassification`],[`dinov2_with_registers`,`Dinov2WithRegistersForImageClassification`],[`resnet`,`ResNetForImageClassification`],[`swin`,`SwinForImageClassification`],[`segformer`,`SegformerForImageClassification`],[`efficientnet`,`EfficientNetForImageClassification`],[`mobilenet_v1`,`MobileNetV1ForImageClassification`],[`mobilenet_v2`,`MobileNetV2ForImageClassification`],[`mobilenet_v3`,`MobileNetV3ForImageClassification`],[`mobilenet_v4`,`MobileNetV4ForImageClassification`]]),Ek=/* @__PURE__ */ new Map([[`detr`,`DetrForObjectDetection`],[`rt_detr`,`RTDetrForObjectDetection`],[`rt_detr_v2`,`RTDetrV2ForObjectDetection`],[`rf_detr`,`RFDetrForObjectDetection`],[`d_fine`,`DFineForObjectDetection`],[`table-transformer`,`TableTransformerForObjectDetection`],[`yolos`,`YolosForObjectDetection`]]),Dk=/* @__PURE__ */ new Map([[`owlvit`,`OwlViTForObjectDetection`],[`owlv2`,`Owlv2ForObjectDetection`],[`grounding-dino`,`GroundingDinoForObjectDetection`]]),Ok=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`clipseg`,`CLIPSegForImageSegmentation`]]),kk=/* @__PURE__ */ new Map([[`segformer`,`SegformerForSemanticSegmentation`],[`sapiens`,`SapiensForSemanticSegmentation`],[`swin`,`SwinForSemanticSegmentation`],[`mobilenet_v1`,`MobileNetV1ForSemanticSegmentation`],[`mobilenet_v2`,`MobileNetV2ForSemanticSegmentation`],[`mobilenet_v3`,`MobileNetV3ForSemanticSegmentation`],[`mobilenet_v4`,`MobileNetV4ForSemanticSegmentation`]]),Ak=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`maskformer`,`MaskFormerForInstanceSegmentation`]]),jk=/* @__PURE__ */ new Map([[`sam`,`SamModel`],[`sam2`,`Sam2Model`],[`edgetam`,`EdgeTamModel`],[`sam3_tracker`,`Sam3TrackerModel`]]),Mk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForCTC`],[`wav2vec2-bert`,`Wav2Vec2BertForCTC`],[`unispeech`,`UniSpeechForCTC`],[`unispeech-sat`,`UniSpeechSatForCTC`],[`wavlm`,`WavLMForCTC`],[`hubert`,`HubertForCTC`],[`parakeet_ctc`,`ParakeetForCTC`]]),Nk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForSequenceClassification`],[`wav2vec2-bert`,`Wav2Vec2BertForSequenceClassification`],[`unispeech`,`UniSpeechForSequenceClassification`],[`unispeech-sat`,`UniSpeechSatForSequenceClassification`],[`wavlm`,`WavLMForSequenceClassification`],[`hubert`,`HubertForSequenceClassification`],[`audio-spectrogram-transformer`,`ASTForAudioClassification`]]),Pk=/* @__PURE__ */ new Map([[`wavlm`,`WavLMForXVector`]]),Fk=/* @__PURE__ */ new Map([[`unispeech-sat`,`UniSpeechSatForAudioFrameClassification`],[`wavlm`,`WavLMForAudioFrameClassification`],[`wav2vec2`,`Wav2Vec2ForAudioFrameClassification`],[`pyannote`,`PyAnnoteForAudioFrameClassification`]]),Ik=/* @__PURE__ */ new Map([[`vitmatte`,`VitMatteForImageMatting`]]),Lk=/* @__PURE__ */ new Map([[`patchtst`,`PatchTSTForPrediction`],[`patchtsmixer`,`PatchTSMixerForPrediction`]]),Rk=/* @__PURE__ */ new Map([[`swin2sr`,`Swin2SRForImageSuperResolution`]]),zk=/* @__PURE__ */ new Map([[`chmv2`,`CHMv2ForDepthEstimation`],[`dpt`,`DPTForDepthEstimation`],[`depth_anything`,`DepthAnythingForDepthEstimation`],[`glpn`,`GLPNForDepthEstimation`],[`sapiens`,`SapiensForDepthEstimation`],[`depth_pro`,`DepthProForDepthEstimation`],[`metric3d`,`Metric3DForDepthEstimation`],[`metric3dv2`,`Metric3Dv2ForDepthEstimation`]]),Bk=/* @__PURE__ */ new Map([[`sapiens`,`SapiensForNormalEstimation`]]),Vk=/* @__PURE__ */ new Map([[`vitpose`,`VitPoseForPoseEstimation`]]),Hk=/* @__PURE__ */ new Map([[`clip`,`CLIPVisionModelWithProjection`],[`siglip`,`SiglipVisionModel`],[`jina_clip`,`JinaCLIPVisionModel`]]),Uk=[[sk,Y.EncoderOnly],[ck,Y.EncoderDecoder],[uk,Y.DecoderOnlyWithoutHead],[lk,Y.AutoEncoder],[mk,Y.EncoderOnly],[hk,Y.EncoderOnly],[gk,Y.Seq2Seq],[dk,Y.Seq2Seq],[_k,Y.DecoderOnly],[vk,Y.MultiModality],[yk,Y.EncoderOnly],[bk,Y.EncoderOnly],[xk,Y.Vision2Seq],[Sk,Y.ImageTextToText],[Ck,Y.AudioTextToText],[Tk,Y.EncoderOnly],[Ok,Y.EncoderOnly],[Ak,Y.EncoderOnly],[kk,Y.EncoderOnly],[Ik,Y.EncoderOnly],[Lk,Y.EncoderOnly],[Rk,Y.EncoderOnly],[zk,Y.EncoderOnly],[Bk,Y.EncoderOnly],[Vk,Y.EncoderOnly],[Ek,Y.EncoderOnly],[Dk,Y.EncoderOnly],[jk,Y.MaskGeneration],[Mk,Y.EncoderOnly],[Nk,Y.EncoderOnly],[fk,Y.Seq2Seq],[pk,Y.EncoderOnly],[Pk,Y.EncoderOnly],[Fk,Y.EncoderOnly],[Hk,Y.EncoderOnly]];for(let[e,t]of Uk)for(let n of e.values()){Cg.set(n,t);let e=qg[n];Tg.set(e,n),wg.set(n,e)}var Wk=[[`MusicgenForConditionalGeneration`,bw,Y.Musicgen],[`Phi3VForCausalLM`,wT,Y.Phi3V],[`CLIPTextModelWithProjection`,ev,Y.EncoderOnly],[`SiglipTextModel`,VE,Y.EncoderOnly],[`JinaCLIPTextModel`,fS,Y.EncoderOnly],[`ClapTextModelWithProjection`,Y_,Y.EncoderOnly],[`ClapAudioModelWithProjection`,X_,Y.EncoderOnly],[`DacEncoderModel`,Vv,Y.EncoderOnly],[`DacDecoderModel`,Hv,Y.EncoderOnly],[`MimiEncoderModel`,tC,Y.EncoderOnly],[`MimiDecoderModel`,nC,Y.EncoderOnly],[`SnacEncoderModel`,YE,Y.EncoderOnly],[`SnacDecoderModel`,XE,Y.EncoderOnly],[`Gemma3nForConditionalGeneration`,Bb,Y.ImageAudioTextToText],[`Gemma4ForConditionalGeneration`,Hb,Y.ImageAudioTextToText],[`SupertonicForConditionalGeneration`,yD,Y.Supertonic],[`ChatterboxModel`,H_,Y.Chatterbox],[`VoxtralRealtimeForConditionalGeneration`,bO,Y.VoxtralRealtime]];for(let[e,t,n]of Wk)Cg.set(e,n),Tg.set(t,e),wg.set(e,t);var Gk=/* @__PURE__ */ new Map([[`modnet`,Ok],[`birefnet`,Ok],[`isnet`,Ok],[`ben`,Ok]]);for(let[e,t]of Gk.entries())t.set(e,`PreTrainedModel`),Cg.set(e,Y.EncoderOnly),wg.set(e,X);var Kk=new Set(Gk.keys());Cg.set(`PreTrainedModel`,Y.EncoderOnly),Tg.set(X,`PreTrainedModel`);var Z={MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES:mk,MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES:hk,MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES:fk,MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES:pk,MODEL_FOR_MASKED_LM_MAPPING_NAMES:yk,MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES:bk,MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES:Tk,MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES:Ok,MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES:kk,MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES:Ak,MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES:Ek,MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES:Dk,MODEL_FOR_MASK_GENERATION_MAPPING_NAMES:jk,MODEL_FOR_CTC_MAPPING_NAMES:Mk,MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES:Nk,MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES:Pk,MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES:Fk,MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES:wk,MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES:Ik,MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES:Rk,MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES:zk,MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES:Bk,MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES:Vk,MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES:Hk,MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES:Sk,MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES:Ck,MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES:gk,MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES:dk,MODEL_FOR_CAUSAL_LM_MAPPING_NAMES:_k,MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES:xk};vg(Z);var Q=class{static MODEL_CLASS_MAPPINGS=null;static BASE_IF_FAIL=!1;static supports(e){if(!this.MODEL_CLASS_MAPPINGS)return!1;for(let t of this.MODEL_CLASS_MAPPINGS)if(t.has(e))return!0;return this.BASE_IF_FAIL}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d};if(f.config=await Ch.from_pretrained(e,f),!this.MODEL_CLASS_MAPPINGS)throw Error("`MODEL_CLASS_MAPPINGS` not implemented for this type of `AutoClass`: "+this.name);let{model_type:p}=f.config;for(let t of this.MODEL_CLASS_MAPPINGS){let n=t.get(p);if(!n){for(let e of t.values())if(e[0]===p){n=e;break}if(!n)continue}return await qg[n].from_pretrained(e,f)}if(this.BASE_IF_FAIL)return Kk.has(p)||A.warn(`Unknown model class "${p}", attempting to construct from base class.`),await X.from_pretrained(e,f);throw Error(`Unsupported model type: ${p}`)}},qk=class extends Q{static MODEL_CLASS_MAPPINGS=Uk.map(e=>e[0]);static BASE_IF_FAIL=!0},Jk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES]},Yk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES]},Xk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES]},Zk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES]},Qk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES]},$k=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES]},eA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES]},tA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASKED_LM_MAPPING_NAMES]},nA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES]},rA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES]},iA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES]},aA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES]},oA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES]},sA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES]},cA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES]},lA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASK_GENERATION_MAPPING_NAMES]});var uA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CTC_MAPPING_NAMES]},dA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES]};var fA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES]});var pA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES]},mA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES]};var hA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES]};async function gA(e){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>Vf.read(e)))}async function _A(e,t){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>typeof e==`string`||e instanceof URL?Wd(e,t):e instanceof Float64Array?new Float32Array(e):e))}function vA(e,t){t&&(e=e.map(e=>e|0));let[n,r,i,a]=e;return{xmin:n,ymin:r,xmax:i,ymax:a}}var yA=class extends $r{constructor({task:e,model:t,tokenizer:n=null,processor:r=null}){super(),this.task=e,this.model=t,this.tokenizer=n,this.processor=r}async dispose(){await this.model.dispose()}},bA=class extends yA{async _call(e,{top_k:t=1}={}){let n=this.tokenizer(e,{padding:!0,truncation:!0}),r=await this.model(n),{problem_type:i,id2label:a}=this.model.config,o=i===`multi_label_classification`?e=>e.sigmoid():e=>new V(`float32`,ol(e.data),e.dims),s=[];for(let e of r.logits){let n=await iu(o(e),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));t===1?s.push(...i):s.push(i)}return Array.isArray(e)||t===1?s:s[0]}},xA=class extends yA{async _call(e,{ignore_labels:t=[`O`],aggregation_strategy:n=`none`}={}){if(n!==`none`&&n!==`simple`)throw Error(`Invalid aggregation_strategy: "${n}". Must be one of "none" or "simple".`);let r=Array.isArray(e),i=this.tokenizer(r?e:[e],{padding:!0,truncation:!0}),a=(await this.model(i)).logits,o=this.model.config.id2label,s=[];for(let e=0;e{let o=0,s=[];for(let n=i;ne==u),i=a[e].tolist(),f=o[e].tolist();for(let n=1;ne==t[n])!==-1)&&(i[n]=-1/0,f[n]=-1/0);let p=ol(i).map((e,t)=>[e,t]),m=ol(f).map((e,t)=>[e,t]);p[0][0]=0,m[0][0]=0;let h=oi(p,m).filter(e=>e[0][1]<=e[1][1]).map(e=>[e[0][1],e[1][1],e[0][0]*e[1][0]]).sort((e,t)=>t[2]-e[2]),g=[];for(let e=0;ee==n);if(c===-1)throw Error(`Mask token (${r}) not found in text.`);let l=a[e][c],u=await iu(new V(`float32`,ol(l.data),l.dims),t),d=u[0].tolist(),f=u[1].tolist();o.push(f.map((e,t)=>{let n=i.slice();return n[c]=e,{score:d[t],token:Number(e),token_str:this.tokenizer.decode([e]),sequence:this.tokenizer.decode(n,{skip_special_tokens:!0})}}))}return Array.isArray(e)?o:o[0]}},EA=class extends yA{_default_generation_config={max_new_tokens:256};_key=`generated_text`;async _call(e,t={}){Array.isArray(e)||(e=[e]),this.model.config.prefix&&(e=e.map(e=>this.model.config.prefix+e));let n=this.model.config.task_specific_params;n&&n[this.task]&&n[this.task].prefix&&(e=e.map(e=>n[this.task].prefix+e));let r=this.tokenizer,i={padding:!0,truncation:!0},a;a=this.task===`translation`&&`_build_translation_inputs`in r?r._build_translation_inputs(e,i,t):r(e,i);let o=await this.model.generate({...a,...this._default_generation_config,...t});return r.batch_decode(o,{skip_special_tokens:!0}).map(e=>({[this._key]:e}))}},DA=class extends EA{_key=`summary_text`},OA=class extends EA{_key=`translation_text`};function kA(e){return Array.isArray(e)&&e.every(e=>`role`in e&&`content`in e)}var AA=class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t={}){let{add_special_tokens:n,return_full_text:r,tools:i,documents:a,chat_template:o,tokenizer_encode_kwargs:s,...c}=t,l=!1,u=!1,d=n??(this.tokenizer.add_bos_token||this.tokenizer.add_eos_token)??!1,f=s,p;if(typeof e==`string`)p=e=[e];else if(Array.isArray(e)&&e.every(e=>typeof e==`string`))l=!0,p=e;else{if(kA(e))e=[e];else if(Array.isArray(e)&&e.every(kA))l=!0;else throw Error(`Input must be a string, an array of strings, a Chat, or an array of Chats`);u=!0;let t={tokenize:!1,add_generation_prompt:!0,...ci({tools:i,documents:a,chat_template:o},[`tools`,`documents`,`chat_template`]),...f};p=e.map(e=>this.tokenizer.apply_chat_template(e,t)),d=!1,f=void 0}let m=u?!1:r??!0;this.tokenizer.padding_side=`left`;let h=this.tokenizer(p,{add_special_tokens:d,padding:!0,truncation:!0,...f}),g=await this.model.generate({...h,...this._default_generation_config,...c}),_=this.tokenizer.batch_decode(g,{skip_special_tokens:!0}),v;!m&&h.input_ids.dims.at(-1)>0&&(v=this.tokenizer.batch_decode(h.input_ids,{skip_special_tokens:!0}).map(e=>e.length));let y=Array.from({length:e.length},e=>[]);for(let t=0;t<_.length;++t){let n=Math.floor(t/g.dims[0]*e.length);v&&(_[t]=_[t].slice(v[n])),y[n].push({generated_text:u?[...e[n],{role:`assistant`,content:_[t]}]:_[t]})}return!l&&y.length===1?y[0]:y}},jA=class extends yA{constructor(e){super(e),this.label2id=Object.fromEntries(Object.entries(this.model.config.label2id).map(([e,t])=>[e.toLowerCase(),t])),this.entailment_id=this.label2id.entailment,this.entailment_id===void 0&&(A.warn(`Could not find 'entailment' in label2id mapping. Using 2 as entailment_id.`),this.entailment_id=2),this.contradiction_id=this.label2id.contradiction??this.label2id.not_entailment,this.contradiction_id===void 0&&(A.warn(`Could not find 'contradiction' in label2id mapping. Using 0 as contradiction_id.`),this.contradiction_id=0)}async _call(e,t,{hypothesis_template:n=`This example is {}.`,multi_label:r=!1}={}){let i=Array.isArray(e);i||(e=[e]),Array.isArray(t)||(t=[t]);let a=t.map(e=>n.replace(`{}`,e)),o=r||t.length===1,s=[];for(let n of e){let e=[];for(let t of a){let r=this.tokenizer(n,{text_pair:t,padding:!0,truncation:!0}),i=await this.model(r);o?e.push([i.logits.data[this.contradiction_id],i.logits.data[this.entailment_id]]):e.push(i.logits.data[this.entailment_id])}let r=(o?e.map(e=>ol(e)[1]):ol(e)).map((e,t)=>[e,t]).sort((e,t)=>t[0]-e[0]);s.push({sequence:n,labels:r.map(e=>t[e[1]]),scores:r.map(e=>e[0])})}return i?s:s[0]}},MA=class extends yA{async _call(e,{top_k:t=5}={}){let n=this.processor.feature_extractor.config.sampling_rate,r=await _A(e,n),i=this.model.config.id2label,a=[];for(let e of r){let n=await this.processor(e),r=(await this.model(n)).logits[0],o=await iu(new V(`float32`,ol(r.data),r.dims),t),s=o[0].tolist(),c=o[1].tolist().map((e,t)=>({label:i?i[e]:`LABEL_${e}`,score:s[t]}));a.push(c)}return Array.isArray(e)?a:a[0]}},NA=class extends yA{async _call(e,t,{hypothesis_template:n=`This is a sound of {}.`}={}){let r=!Array.isArray(e);r&&(e=[e]);let i=t.map(e=>n.replace(`{}`,e)),a=this.tokenizer(i,{padding:!0,truncation:!0}),o=this.processor.feature_extractor.config.sampling_rate,s=await _A(e,o),c=[];for(let e of s){let n=await this.processor(e),r=ol((await this.model({...a,...n})).logits_per_audio.data);c.push([...r].map((e,n)=>({score:e,label:t[n]})))}return r?c[0]:c}},PA=class extends yA{_default_generation_config={};async _call(e,t={}){switch(t={...this._default_generation_config,...t},this.model.config.model_type){case`whisper`:case`lite-whisper`:return this._call_whisper(e,t);case`wav2vec2`:case`wav2vec2-bert`:case`unispeech`:case`unispeech-sat`:case`hubert`:case`parakeet_ctc`:return this._call_wav2vec2(e,t);case`moonshine`:return this._call_moonshine(e,t);case`cohere_asr`:return this._call_cohere_asr(e,t);default:throw Error(`AutomaticSpeechRecognitionPipeline does not support model type '${this.model.config.model_type}'.`)}}async _call_wav2vec2(e,t){t.language&&A.warn('`language` parameter is not yet supported for `wav2vec2` models, defaulting to "English".'),t.task&&A.warn('`task` parameter is not yet supported for `wav2vec2` models, defaulting to "transcribe".');let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let t=await this.processor(e),n=(await this.model(t)).logits[0],r=[];for(let e of n)r.push(ll(e.data)[1]);let i=this.tokenizer.decode(r,{skip_special_tokens:!0}).trim();o.push({text:i})}return n?o[0]:o}async _call_whisper(e,t){let n=t.return_timestamps??!1,r=t.chunk_length_s??0,i=t.force_full_sequences??!1,a=t.stride_length_s??null,o={...t};n===`word`&&(o.return_token_timestamps=!0,o.return_timestamps=!0);let s=!Array.isArray(e),c=s?[e]:e,l=this.processor.feature_extractor.config,u=l.chunk_length/this.model.config.max_source_positions,d=l.hop_length,f=l.sampling_rate,p=await _A(c,f),m=[];for(let e of p){let t=[];if(r>0){if(a===null)a=r/6;else if(r<=a)throw Error("`chunk_length_s` must be larger than `stride_length_s`.");let n=f*r,i=f*a,o=n-2*i,s=0;for(;;){let r=s+n,a=e.subarray(s,r),c=await this.processor(a),l=s===0,u=r>=e.length;if(t.push({stride:[a.length,l?0:i,u?0:i],input_features:c.input_features,is_last:u}),u)break;s+=o}}else t=[{stride:[e.length,0,0],input_features:(await this.processor(e)).input_features,is_last:!0}];for(let e of t){o.num_frames=Math.floor(e.stride[0]/d);let t=await this.model.generate({inputs:e.input_features,...o});if(n===`word`){let n=t.sequences.tolist()[0],r=t.token_timestamps.tolist()[0],i=this.tokenizer.timestamp_begin,a=Math.max(n.findIndex(e=>Number(e)>=i),0);e.tokens=n.slice(a),e.token_timestamps=r.slice(a).map(e=>hl(e,2))}else e.tokens=t[0].tolist();e.stride=e.stride.map(e=>e/f)}let[s,c]=this.tokenizer._decode_asr(t,{time_precision:u,return_timestamps:n,force_full_sequences:i});m.push({text:s,...c})}return s?m[0]:m}async _call_moonshine(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let n=await this.processor(e),r=Math.floor(e.length/i)*6,a=await this.model.generate({max_new_tokens:r,...t,...n}),s=this.tokenizer.batch_decode(a,{skip_special_tokens:!0})[0];o.push({text:s})}return n?o[0]:o}async _call_cohere_asr(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor,a=i.config.sampling_rate,o=await _A(r,a),s=t.language??`en`,c=this.processor.get_decoder_prompt_ids(s),l=[];for(let e of o){let n=i.split_audio(e),r=[];for(let e of n){let n=await this.processor(e),i=await this.model.generate({...n,decoder_input_ids:c,...t}),a=this.tokenizer.decode(i[0].tolist(),{skip_special_tokens:!0}).trim();r.push(a)}let a=this.processor.constructor.join_chunks(r,s);l.push({text:a})}return n?l[0]:l}},FA=class extends yA{DEFAULT_VOCODER_ID=`Xenova/speecht5_hifigan`;constructor(e){super(e),this.vocoder=e.vocoder??null}async _prepare_speaker_embeddings(e,t){if((typeof e==`string`||e instanceof URL)&&(e=new Float32Array(await(await k.fetch(e)).arrayBuffer())),e instanceof Float32Array)e=new V(`float32`,e,[e.length]);else if(!(e instanceof V))throw Error("Speaker embeddings must be a `Tensor`, `Float32Array`, `string`, or `URL`.");if(t>1){if(e.dims[0]===1)e=e.repeat(t,1);else if(e.dims[0]!==t)throw Error(`Expected speaker embeddings batch size to be 1 or ${t}, but got ${e.dims[0]}.`)}return e}_postprocess_waveform(e,t,n,r=null){let i=t.data,[a,o]=t.dims,s=r?r.data:null,c=[];for(let e=0;e({generated_text:e.trim()}));a.push(r)}return n?a:a[0]}},LA=class extends yA{async _call(e,{top_k:t=5}={}){let n=await gA(e),{pixel_values:r}=await this.processor(n),i=await this.model({pixel_values:r}),{id2label:a}=this.model.config,o=[];for(let e of i.logits){let n=await iu(new V(`float32`,ol(e.data),e.dims),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));o.push(i)}return Array.isArray(e)?o:o[0]}},RA={panoptic:`post_process_panoptic_segmentation`,instance:`post_process_instance_segmentation`,semantic:`post_process_semantic_segmentation`},zA=class extends yA{async _call(e,{threshold:t=.5,mask_threshold:n=.5,overlap_mask_area_threshold:r=.8,label_ids_to_fuse:i=null,target_sizes:a=null,subtask:o=null}={}){if(Array.isArray(e)&&e.length!==1)throw Error(`Image segmentation pipeline currently only supports a batch size of 1.`);let s=await gA(e),c=s.map(e=>[e.height,e.width]),l=await this.processor(s),{inputNames:u,outputNames:d}=this.model.sessions.model;if(!u.includes(`pixel_values`)){if(u.length!==1)throw Error(`Expected a single input name, but got ${u.length} inputs: ${u}.`);let e=u[0];if(e in l)throw Error(`Input name ${e} already exists in the inputs.`);l[e]=l.pixel_values}let f=await this.model(l),p=null;if(o!==null)p=RA[o];else if(this.processor.image_processor){for(let[e,t]of Object.entries(RA))if(t in this.processor.image_processor){p=this.processor.image_processor[t].bind(this.processor.image_processor),o=e;break}}let m=this.model.config.id2label,h=[];if(!o){let e=f[d[0]];for(let t=0;te<-1e-5||e>1.00001)&&r.sigmoid_();let i=await Vf.fromTensor(r.mul_(255).to(`uint8`)).resize(n[1],n[0]);h.push({label:null,score:null,mask:i})}}else if(o===`panoptic`||o===`instance`){let e=p(f,t,n,r,i,a??c)[0],o=e.segmentation;for(let t of e.segments_info){let e=new Uint8ClampedArray(o.data.length);for(let n=0;n{let n=e.clone();return n.putAlpha(r[t].mask),n});return Array.isArray(e)?i:i[0]}},model:[aA,oA,sA],default:{model:`Xenova/modnet`},type:`image`},"zero-shot-image-classification":{pipeline:class extends yA{async _call(e,t,{hypothesis_template:n=`This is a photo of {}`}={}){let r=Array.isArray(e),i=await gA(e),a=t.map(e=>n.replace(`{}`,e)),o=this.tokenizer(a,{padding:this.model.config.model_type!==`siglip`||`max_length`,truncation:!0}),{pixel_values:s}=await this.processor(i),c=await this.model({...o,pixel_values:s}),l=this.model.config.model_type===`siglip`?e=>e.sigmoid().data:e=>ol(e.data),u=[];for(let e of c.logits_per_image){let n=[...l(e)].map((e,n)=>({score:e,label:t[n]}));n.sort((e,t)=>t.score-e.score),u.push(n)}return r?u:u[0]}},model:qk,default:{model:`Xenova/clip-vit-base-patch32`},type:`multimodal`},"object-detection":{pipeline:class extends yA{async _call(e,{threshold:t=.9,percentage:n=!1}={}){let r=Array.isArray(e);if(r&&e.length!==1)throw Error(`Object detection pipeline currently only supports a batch size of 1.`);let i=await gA(e),a=n?null:i.map(e=>[e.height,e.width]),{pixel_values:o,pixel_mask:s}=await this.processor(i),c=await this.model({pixel_values:o,pixel_mask:s}),l=this.processor.image_processor.post_process_object_detection(c,t,a),{id2label:u}=this.model.config,d=l.map(e=>e.boxes.map((t,r)=>({score:e.scores[r],label:u[e.classes[r]],box:vA(t,!n)})));return r?d:d[0]}},model:cA,default:{model:`Xenova/detr-resnet-50`},type:`multimodal`},"zero-shot-object-detection":{pipeline:class extends yA{async _call(e,t,{threshold:n=.1,top_k:r=null,percentage:i=!1}={}){let a=Array.isArray(e),o=await gA(e),s=this.tokenizer(t,{padding:!0,truncation:!0}),c=await this.processor(o),l=[];for(let e=0;e({score:e.scores[n],label:e.labels[n],box:vA(t,!i)}))}else{let e=this.processor.image_processor.post_process_object_detection(f,n,u,!0)[0];p=e.boxes.map((n,r)=>({score:e.scores[r],label:t[e.classes[r]],box:vA(n,!i)}))}p.sort((e,t)=>t.score-e.score),r!==null&&(p=p.slice(0,r)),l.push(p)}return a?l:l[0]}},model:lA,default:{model:`Xenova/owlvit-base-patch32`},type:`multimodal`},"document-question-answering":{pipeline:class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t,n={}){if(Array.isArray(e)){if(e.length!==1)throw Error(`Document Question Answering pipeline currently only supports a batch size of 1.`);e=e[0]}let r=(await gA(e))[0],{pixel_values:i}=await this.processor(r),a=`${t}`,o=this.tokenizer(a,{add_special_tokens:!1,padding:!0,truncation:!0}).input_ids,s=await this.model.generate({inputs:i,max_length:this.model.config.decoder.max_position_embeddings,decoder_input_ids:o,...this._default_generation_config,...n}),c=this.tokenizer.batch_decode(s)[0].match(/(.*?)<\/s_answer>/),l=null;return c&&c.length>=2&&(l=c[1].trim()),[{answer:l}]}},model:fA,default:{model:`Xenova/donut-base-finetuned-docvqa`},type:`multimodal`},"image-to-image":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),r=await this.model(n),i=[];for(let e of r.reconstruction){let t=e.squeeze().clamp_(0,1).mul_(255).round_().to(`uint8`);i.push(Vf.fromTensor(t))}return Array.isArray(e)?i:i[0]}},model:pA,default:{model:`Xenova/swin2SR-classical-sr-x2-64`},type:`image`},"depth-estimation":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),{predicted_depth:r}=await this.model(n),i=[];for(let e=0;et).sort((e,t)=>o[t]-o[e]).slice(0,r).map(e=>({index:e,score:o[e]}))}const WA={amp:`&`,lt:`<`,gt:`>`,quot:`"`,apos:`'`,nbsp:` `,hellip:`…`,mdash:`—`,ndash:`–`,laquo:`«`,raquo:`»`,middot:`·`,deg:`°`,times:`×`,euro:`€`,pound:`£`,reg:`®`,copy:`©`,bull:`•`,trade:`™`,rsquo:`’`,lsquo:`‘`,ldquo:`“`,rdquo:`”`};function GA(e){return typeof e!=`string`||!e?``:e.replace(/<[^>]*>/g,` `).replace(/&#x([0-9a-f]+);/gi,(e,t)=>KA(parseInt(t,16))).replace(/&#(\d+);/g,(e,t)=>KA(parseInt(t,10))).replace(/&([a-z]+);/gi,(e,t)=>WA[t.toLowerCase()]??e).replace(/\s+/g,` `).trim()}function KA(e){return Number.isFinite(e)&&e>0&&e<=1114111?String.fromCodePoint(e):``}function qA(e){return String(e??``).normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}const JA=/* @__PURE__ */ new Set(/* @__PURE__ */ `va.hoac.cua.cho.voi.mot.nung.khong.duoc.de.theo.loai.tinh.gia.thuoc.ve.tai.nha.mat.neu.thi.la.cac.nhan.bi.ra.nay`.split(`.`));function YA(e){let t=[];for(let n of qA(e).split(/[^a-z0-9]+/))n.length>1&&!JA.has(n)&&t.push(n);return t}function $(...e){for(let t of e)if(typeof t==`string`&&t.trim())return GA(t);return``}function XA(e){let t=/* @__PURE__ */ new Set,n=[],r=e=>{if(typeof e!=`string`)return;let r=e.trim();r&&!t.has(r)&&(/^https?:\/\//i.test(r)||/^data:image\//i.test(r))&&(t.add(r),n.push(r))};return Array.isArray(e.imgs)&&e.imgs.forEach(r),Array.isArray(e.images)&&e.images.forEach(r),r(e.i),r(e.image),n}function ZA(e){for(let t of[e.pn,e.salePn,e.priceNum,e.price_number,e.priceNumber]){let e=Number(t);if(Number.isFinite(e)&&e>0)return e}return 0}function QA(e){let t=Math.round(Number(e)||0);return t<=0?``:`${String(t).replace(/\B(?=(\d{3})+(?!\d))/g,`.`)}₫`}function $A(e){return $(e.p,e.priceText,e.price)||QA(ZA(e))}function ej(e){let t=e;if(typeof t==`string`&&t.trim()){let e=t.trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{t=JSON.parse(e)}catch{t=null}else t=null}let n=[];if(Array.isArray(t))for(let e of t)Array.isArray(e)&&e.length>=2?n.push([$(e[0]),$(e[1])]):e&&typeof e==`object`&&n.push([$(e.name,e.key),$(e.value)]);else if(t&&typeof t==`object`)for(let[e,r]of Object.entries(t)){let t=$(r)||(r==null?``:String(r));t&&n.push([$(e),t])}return n.filter(([e,t])=>e&&t)}function tj(e){return(Array.isArray(e.feats)?e.feats:Array.isArray(e.features)?e.features:[]).map(e=>$(e)).filter(Boolean)}function nj(e){if(!e||typeof e!=`object`)return null;let t=$(e.sku,e.mod,e.model,e.SAP),n=$(e.slug),r=$(e.n,e.name,e.title_clean,e.title)||t||n,i=t||n;return!i||!r?null:{sku:i,slug:n,model:$(e.mod,e.model,t),name:r,brand:$(e.brand),category:$(e.c,e.category,e.cs,e.category_slug),link:$(e.l,e.link),price:$A(e),priceNum:ZA(e),images:XA(e),summary:$(e.sum,e.summary,e.description,e.desc),specs:ej(e.specs),feats:tj(e),addedBy:$(e._addedBy,e._source),addedAt:e._added_at||e.addedAt||null}}const rj={"catalogue/products.json":`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_url_added.json`,"catalogue/promos.json":`https://huggingface.co/datasets/bep40/vaistudio-data/resolve/main/promos.json`};let ij=null;function aj(){return import.meta.url.replace(/\/dist\/assets\/[^/]*$/,`/`)}function oj(e){let t=aj(),n=[new URL(`dist/`+e,t).href,new URL(e,t).href];return typeof document<`u`&&document.baseURI&&(n.push(new URL(e.replace(/^catalogue\//,`dist/catalogue/`),document.baseURI).href),n.push(new URL(e,document.baseURI).href)),[...new Set(n)]}async function sj(e){let t=rj[e],n=t?[t,...oj(e)]:oj(e),r;for(let t of n)try{let n={cache:`no-store`};typeof AbortSignal<`u`&&typeof AbortSignal.timeout==`function`&&(n.signal=AbortSignal.timeout(2e4));let i=await fetch(t,n);if(!i.ok){r=/* @__PURE__ */ Error(`HTTP ${i.status}`);continue}let a=await i.text(),o;try{o=JSON.parse(a)}catch{r=/* @__PURE__ */ Error(`body is not valid JSON`);continue}if(Array.isArray(o)?o.length===0&&e.includes(`products`):!o||typeof o!=`object`){r=/* @__PURE__ */ Error(`unexpected shape`);continue}return o}catch(e){r=e}throw Error(`Không tìm thấy ${e} (${r?.message||`không rõ`}). Chạy \`node scripts/sync-catalogue.mjs\` để nhân bản dữ liệu từ vai-avatar vào Space.`)}async function cj(){try{let e=await fetch(`https://huggingface.co/api/datasets/bep40/grob-products-updated/revision/main`,{cache:`no-store`});if(!e.ok)return null;let t=await e.json();return typeof t?.sha==`string`?t.sha:null}catch{return null}}let lj=null,uj=null;async function dj(){let e=await cj();if(e&&ij&&e===ij)return lj;let t=await fetch(`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_with_slugs.json`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=JSON.parse(await t.text());if(!Array.isArray(n)||!n.length)throw Error(`unexpected shape`);return lj=n,ij=e??`len:${n.length}`,n}function fj(){return uj||(uj=dj().catch(e=>{if(lj)return lj;throw e}).finally(()=>{uj=null}),uj)}function pj(e){return $(e.sku,e.mod,e.model).toUpperCase()?0:$(e.slug)?1:2}function mj(e){let t=[],n=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Map;for(let i of vj(Array.isArray(e)?e:[])){if(!i||typeof i!=`object`)continue;let e=$(i.slug).toLowerCase(),a=qA($(i.n,i.name,i.title)).trim(),o=$(i.imgs?.[0],i.i,i.image).split(`?`)[0],s=a&&o?`${a}\u0000${o}`:null;if(!e&&!s)continue;let c=pj(i),l=[];e&&l.push(n.get(e)),s&&l.push(r.get(s));let u=l.find(e=>e!==void 0);if(u&&u.ranke.described)).size===1&&(i.sort((e,t)=>t.images.length-e.images.length),r.set(e,i[0].images));return r}function vj(e){if(!Array.isArray(e))return e;let t=e.filter(gj);if(!t.length)return e;let n=_j(e),r=[],i=0,a=0;for(let t of e){if(!gj(t)){r.push(t);continue}let e=null;for(let r of hj($(t.n,t.name,t.title)))if(n.has(r)){e=n.get(r);break}if(e){r.push({...t,imgs:e,i:e[0],brand:`Malloca`}),i++;continue}r.push({...t,brand:`Malloca`}),a++}return t.length&&console.info(`[catalogue] Malloca misbranding: ${t.length} rows (name says Malloca, brand says otherwise). ${i} swapped to a real Malloca photo, ${a} relabelled, ${t.length-i-a} hidden.`),r}function yj(e){let t=[],n=e=>{let n=$(e).toUpperCase();n&&!t.includes(n)&&t.push(n)};n(e.sku),n(e.mod),n(e.model),n(e.SAP),n(e._source_alias),n(e.slug);let r=qA($(e.n,e.name,e.title_clean,e.title)).replace(/\s+/g,` `).trim();return r.length>8&&n(r),t}const bj=[[`name`,[`n`,`title_clean`,`title`]],[`priceNum`,[`p`,`pn`,`salePn`,`price_number`,`priceNumber`,`price`]],[`description`,[`sum`,`summary`,`desc`]],[`features`,[`feats`]],[`images`,[`imgs`,`i`,`image`]]];function xj(e){let t=e&&e.deleted;return t===!0||t===1||t===`true`||t===`1`}const Sj=[`/eurogold_img/`,`/eurogold_tb_img/`,`/demax_img/`,`/canzy_img/`,`/images/`],Cj=[`huggingface.co/spaces/bep40/v.aistudio`];function wj(e){if(typeof e!=`string`||!e)return!1;let t=e.toLowerCase();return Cj.some(e=>t.includes(e))?Sj.some(e=>t.includes(e)):!1}function Tj(e){return XA(e)[0]||``}function Ej(e){return wj(Tj(e))}function Dj(e,t,n){let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Set;function o(e,t){for(let n of t){if(a.has(n))continue;let t=i.get(n);t===void 0?i.set(n,e):t!==e&&(i.delete(n),a.add(n))}}function s(e,t,n){let i=r.get(e);if(!i){r.set(e,{...t});return}let a=Ej(i),o=Ej(t);if(!a&&o){let a={...i};if(n){for(let[e,r]of n)if(t[e]!==void 0)for(let e of r)delete a[e]}let o=XA(i);r.set(e,{...a,...t,imgs:o});return}let s={...i};if(n){for(let[e,r]of n)if(t[e]!==void 0)for(let e of r)delete s[e]}r.set(e,{...s,...t})}for(let e of Array.isArray(n)?n:[]){if(!e||typeof e!=`object`)continue;let t=yj(e);t.length&&(s(t[0],e),o(t[0],t))}for(let t of Array.isArray(e)?e:[]){if(!t||typeof t!=`object`)continue;let e=yj(t);if(!e.length)continue;let n=e.map(e=>i.get(e)).find(e=>e!==void 0)??e[0];s(n,t,bj),o(n,e)}let c=t&&typeof t==`object`&&t.productEdits&&typeof t.productEdits==`object`?t.productEdits:{};for(let[e,t]of Object.entries(c)){if(!t||typeof t!=`object`)continue;let n=yj(t),r=$(e).toUpperCase();if(!n.length&&!r)continue;let a=[...n,r].map(e=>i.get(e)).find(e=>e!==void 0)??r;s(a,t,bj),o(a,[...n,r])}let l=/* @__PURE__ */ new Map;for(let[e,t]of r){if(xj(t))continue;let n=nj(t);n&&l.set(e,n)}return kj(l),l}const Oj={EPD4635VX:`EPD4635`,EUM101:`EUM101L`,ETW8080VX:`ETW8080`,ETW8090VX:`ETW8090`,EUC87848EB:`EUC87848GA`,EUC88050GA:`EUC88050GE`,EAS1200G:`EAS1200`,EAS1200P:`EAS1200`,ETT103B:`ETT01B`,ETT103M:`ETT01B`};function kj(e){if(e)for(let[t,n]of e){let r=Array.isArray(n.images)?n.images[0]:``;if(!r||!wj(r))continue;let i=Oj[t.toUpperCase()];if(!i){let e=r.split(`/`).pop().replace(/\.[a-z0-9]+$/i,``).toUpperCase();e&&e!==t.toUpperCase()&&(i=e)}if(!i)continue;let a=e.get(i);if(!a)continue;let o=Array.isArray(a.images)?a.images[0]:``;o&&!wj(o)&&(n.images=[o,...n.images.filter(e=>!wj(e))])}}function Aj(e){let t=2166136261,n=e=>{let n=String(e);for(let e=0;e>>0).toString(36)}-${e.size}`}let jj=null,Mj=null;function Nj(){return Mj||(Mj=(async()=>{let[e,t,n]=await Promise.all([sj(`catalogue/products.json`),sj(`catalogue/promos.json`).then(e=>(jj=e,e)).catch(()=>jj??{}),fj().then(e=>mj(e)).catch(()=>lj?mj(lj):[])]),r=Dj(e,t,n);return{items:r,signature:Aj(r),syncedAt:Date.now(),partial:!n.length}})().finally(()=>{Mj=null}),Mj)}async function Pj(){try{return await Nj()}catch{return null}}const Fj={name:6,model:4,brand:3,category:3,summary:1,feats:1,specs:1};function Ij(e){let t={name:YA(e.name),model:YA(e.model),brand:YA(e.brand),category:YA(e.category),summary:YA(e.summary.slice(0,600)),feats:e.feats.flatMap(YA),specs:e.specs.flatMap(([e,t])=>YA(e).concat(YA(t)))},n=/* @__PURE__ */ new Map;for(let[e,r]of Object.entries(Fj))for(let i of new Set(t[e]||[]))(n.get(i)||0)2&&e.length>2&&(r.startsWith(e)||e.startsWith(r))&&(n=Math.max(n,i*.7));n&&(o+=n,s++)}s&&(o*=.55+.45*(s/r.length),i.length>3&&n.includes(i)&&(o*=1.35),a.push({sku:e.sku,score:o,product:e}))}return a.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),a.slice(0,n)}const Bj=qA;function Vj(e){return Bj(e).split(/\s+/).filter(e=>e.length>1)}const Hj=[`inox 304`,`inox sus304`,`inox304`,`inox`,`sus304`,`sus 304`,`nan oval`,`nan vuông`,`nan tron`,`nan dẹt`,`nan det`,`khung nhôm`,`nhôm`,`hợp kim`,`kính`,`gốm`,`đá granite`,`da granite`,`mây`,`thép`,`gang`,`nhựa abs`,`abs`,`thủy tinh`],Uj=[`malloca`,`eurogold`,`grob`,`canzy`,`demax`,`sunhouse`,`kangaroo`,`sharp`,`toshiba`,`panasonic`,`samsung`,`lg`,`electrolux`,`bosch`,`fischer`],Wj={ke:[`gia`],gia:[`ke`]};function Gj(e,t){if(e.includes(t))return!0;let n=Wj[t];if(!n)return!1;for(let t of n)if(e.includes(t))return!0;return!1}function Kj(e){let t=/* @__PURE__ */ new Set,n=/(\d{1,4})\s*mm/gi,r=/[wdh]\s*[:=]?\s*(\d{1,4})/gi,i;for(;i=n.exec(e);)t.add(parseInt(i[1],10));for(;i=r.exec(e);)t.add(parseInt(i[1],10));return t}function qj(e){let t=Bj((e.specs||[]).map(([e,t])=>`${e} ${t}`).join(` `));return{name:Bj(e.name||``),sku:Bj(e.model||e.sku||``),brand:Bj(e.brand||``),category:Bj(e.category||``),summary:Bj(e.summary||``),feats:Bj((e.feats||[]).join(` `)),specsText:t}}function Jj(e,t,n){let{name:r,sku:i,brand:a,category:o,summary:s,feats:c,specsText:l}=qj(e),u=Bj(String(t||``).trim()),d=0,f=u.replace(/[^a-z0-9]/g,``),p=r.replace(/[^a-z0-9]/g,``),m=i.replace(/[^a-z0-9]/g,``);f.length>=4&&(m===f?d+=1e3:p===f?d+=900:p.includes(f)||m.includes(f)?d+=550:m.length>=Math.max(5,f.length/2)&&f.includes(m)&&(d+=400));let h=n.filter(e=>e.length>1&&!/^\d{2,4}mm/.test(e));h.length&&h.every(e=>Gj(r,e))&&(d+=300);let g=[r,a,o,Bj(e.summary||``),c,l].join(` `),_=String(t||``).trim();r===_?d+=200:i===_?d+=180:r.includes(_)?d+=100:i.includes(_)?d+=80:g.includes(_)&&(d+=50);let v=Kj(`${r} ${l} ${Bj(e.summary||``)} ${c} ${s}`),y=Kj(_);[...y].some(e=>v.has(e))?r.includes(_)?d+=40:r.split(` `).some(e=>/^\d{1,4}mm$/i.test(e))?d+=55:d+=l===``?40:50:y.size&&(d-=10);for(let e of n.filter(e=>/^\d{2,4}\s*mm$/.test(e))){let t=e.replace(/\s+/g,``);r.includes(t)?d+=60:i.includes(t)?d+=40:g.includes(t)&&(d+=25)}for(let t of Hj){let n=Bj(t);if(u.includes(n)&&(r.includes(n)||l.includes(n)||Bj(e.summary||``).includes(n))){d+=30;break}}let b=0,x=n.filter(e=>e.length>1&&!/^\d{2,4}\s*mm$/.test(e));for(let e of x)Gj(r,e)?(d+=16,b++):i.includes(e)?d+=12:a.includes(e)?d+=8:o.includes(e)?d+=10:g.includes(e)&&(d+=3);b>=2?d+=35:b===1&&x.length>=2&&(d+=10);for(let e of x)o.includes(e)&&(d+=6);for(let e of Uj)u.includes(e)&&a.includes(e)&&(d+=50);return d}function Yj(e,t,n=24){let r=Vj(e);if(!r.length||!t?.size)return[];let i=[];for(let n of t.values()){let t=Jj(n,String(e||``).trim(),r);t>=24&&i.push({sku:n.sku,score:t,product:n})}if(i.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),i.length>1){let e=/* @__PURE__ */ new Map;for(let t of i)e.has(t.score)||e.set(t.score,[]),e.get(t.score).push(t);let t=Array.from(e.keys()).sort((e,t)=>t-e),n=[];for(let r of t){let t=e.get(r),i=/* @__PURE__ */ new Map;for(let e of t){let t=(e.product?.brand||``).toLowerCase()||`unknown`;i.has(t)||i.set(t,[]),i.get(t).push(e)}let a=!0;for(;a;){a=!1;for(let e of i.values())e.length&&(n.push(e.shift()),a=!0)}}i.length=0,i.push(...n)}return i.slice(0,n)}const Xj={nha:[`ong`,`biet`,`thu`,`lien`],pho:[`nha`,`ong`,`lien`],ong:[`nha`,`pho`,`lien`],lien:[`nha`,`pho`,`ong`],biet:[`thu`,`villa`,`vuon`],thu:[`biet`,`villa`,`vuon`],villa:[`biet`,`thu`],vuon:[`biet`,`thu`],noi:[`that`],that:[`noi`],trang:[`tri`],tri:[`trang`],phong:[`khach`,`ngu`,`tam`],khach:[`phong`],ngu:[`phong`],tam:[`phong`],ban:[`ghe`],ghe:[`ban`]};function Zj(e){let t=new Set(e);for(let n of e)for(let e of Xj[n]??[])t.add(e);return[...t]}function Qj(e){let t=String(e?.image_id||``).trim();return t?`https://bep40-vai-avatar2-interior-api.hf.space/image/${encodeURIComponent(t)}.jpg`:``}function $j(e){return String(e??``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}function eM(e){let t=String(e?.image_id||``).trim();if(!t)return null;let n=Qj(e);if(!n)return null;let r=String(e.desc||e.alt||(e.post_titles||[])[0]||``).trim(),i=[].concat(e.categories||[],e.room_hints||[],e.labels||[]).map(e=>String(e||``).trim()).filter(Boolean),a=(e.keywords||[]).map(e=>String(e||``).trim()).filter(Boolean),o=Number(e.w),s=Number(e.h),c=Number.isFinite(o)&&Number.isFinite(s)&&o>0&&s>0?o/s:1;return{sku:`avatarimg:${t}`,avatarImageId:t,title:r,name:r,description:String(e.desc||``).trim(),categories:i,keywords:a,source:String(e.source||``).trim(),link:String((e.post_urls||[])[0]||``).trim(),ar:Math.max(.5,Math.min(2,c)),images:[n],src:n,addedAt:String(e.created_at||``).trim()}}async function tM(e=60){try{let t=await fetch(`https://huggingface.co/datasets/bep40/vai-avatar2-interior/resolve/main/index.json`,{cache:`no-cache`});if(!t.ok)return[];let n=await t.json();if(!Array.isArray(n))return[];let r=n.filter(e=>e&&typeof e.created_at==`string`&&e.created_at).sort((e,t)=>e.created_att.created_at?-1:0).slice(0,200),i=[];for(let e of r){let t=eM(e);t&&i.push(t)}return i.sort((e,t)=>e.addedAtt.addedAt?-1:0),i.slice(0,e)}catch{return[]}}function nM(e,t,n=60){let r=$j(String(e||``).trim());if(r.length<2||!t?.length)return[];let i=Zj(r.split(/\s+/).filter(e=>e.length>1)),a=[];for(let e of t){let t=$j([e.title,e.description,...e.categories||[],...e.keywords||[]].join(` `)),n=0;r.length>=3&&t.includes(r)&&(n+=900);let o=0;for(let e of i)t.includes(e)&&(n+=25,o++);o&&(n+=o*10,!(n<900&&n<60)&&a.push({...e,score:n}))}return a.sort((e,t)=>t.score-e.score||(e.addedAtself.postMessage(e);function sM(){return rM??=(async()=>{oM({status:`loading`,label:`Đang tải mô hình tìm kiếm`});let[e,t,n,r]=await Promise.all([W.from_pretrained(`sentence-transformers/clip-ViT-B-32-multilingual-v1`),ev.from_pretrained(`bep40/clip-vit-b32-multilingual-vi-text`,{dtype:`fp32`,device:`wasm`,revision:`9e1d53553228b17abfe6986fbe92e22bd6bd6bad`,progress_callback:e=>{e.status===`progress`&&e.file?.endsWith(`.onnx`)&&oM({status:`loading`,label:`Đang tải mô hình tìm kiếm`,progress:e.progress})}}),VA(BA+`image-embeddings.json`).then(e=>JSON.parse(new TextDecoder().decode(e))),VA(BA+`image-embeddings_25k-512-32bit.bin`)]),i=new Float32Array(r);if(i.length!==n.length*512)throw Error(`The image database and embeddings do not match.`);return HA(i,512),oM({status:`loading`,label:`Đang khởi động tìm kiếm`,progress:100}),await t(e(`a photograph`,{padding:!0,truncation:!0})),oM({status:`ready`,count:n.length}),{tokenizer:e,model:t,metadata:n,embeddings:i}})().catch(e=>{throw rM=null,e})}async function cM(){if(!aM){aM=!0;try{let{tokenizer:e,model:t,metadata:n,embeddings:r}=await sM();for(;iM;){let i=iM;iM=null;let a=performance.now();try{let{text_embeds:o}=await t(e(i.text,{padding:!0,truncation:!0}));if(iM)continue;let s=UA(o.data,r,512,96).map(({index:e,score:t})=>({...n[e],score:t}));oM({status:`complete`,id:i.id,text:i.text,output:s,elapsed:performance.now()-a})}catch(e){oM({status:`error`,id:i.id,message:e.message})}}}catch(e){oM({status:`error`,id:iM?.id,message:e.message}),iM=null}finally{aM=!1}}}let lM=null;function uM(){return lM??Nj().then(e=>(lM=e,e))}async function dM(e=!1){let t=e?await Nj():await Pj();return t&&(lM=t),t}let fM=null,pM=``,mM=``;async function hM(){return fM||(fM=await tM(60),pM=fM.map(e=>e.avatarImageId).join(`,`),fM)}async function gM(){let e=await tM(60),t=e.map(e=>e.avatarImageId).join(`,`),{items:n}=await uM().catch(()=>({items:null})),r=n?_M(n):[],i=r.map(e=>e.sku+`@`+(e.addedAt||``)).join(`,`),a=t!==pM||i!==mM;fM=e,pM=t,mM=i,oM({status:`avatar-updated`,items:e,signature:t,changed:a,count:e.length,recentProducts:r})}function _M(e){if(!e?.size)return[];let t=[];for(let n of e.values())n?.addedAt&&Array.isArray(n.images)&&n.images.some(e=>typeof e==`string`&&/^(https?:\/\/|data:image\/)/i.test(e))&&t.push({...n,score:1});return t.sort((e,t)=>String(t.addedAt||``).localeCompare(String(e.addedAt||``))),t.slice(0,12)}async function vM(e,t,n){let r=performance.now();try{oM({status:`products-loading`});let{items:i,signature:a}=await uM(),o=Yj(e,i,n),s=zj(e,i,n),c=nM(e,await hM());oM({status:`products-complete`,id:t,text:e,output:o,legacy:s,interiors:c,signature:a,count:i.size,elapsed:performance.now()-r})}catch(e){oM({status:`products-error`,id:t,message:e.message})}}self.addEventListener(`message`,({data:e})=>{e.type===`init`?(sM().catch(e=>oM({status:`error`,message:e.message})),uM().catch(()=>{}),gM().catch(()=>{})):e.type===`search`?(iM={id:e.id,text:e.text},cM()):e.type===`search-products`?vM(e.text,e.id,e.limit??48):e.type===`refresh-catalogue`?(dM(e.force===!0).then(e=>e&&oM({status:`catalogue-updated`,signature:e.signature,count:e.items.size,syncedAt:e.syncedAt})).catch(e=>oM({status:`catalogue-error`,message:e.message})),gM().catch(()=>{})):e.type===`clear`&&(iM=null)}); \ No newline at end of file diff --git a/dist/assets/worker-nnOdWzlm.js b/dist/assets/worker-nnOdWzlm.js deleted file mode 100644 index c676334fd61461ebaf6573aa26cc37621d23bb31..0000000000000000000000000000000000000000 --- a/dist/assets/worker-nnOdWzlm.js +++ /dev/null @@ -1,45 +0,0 @@ -var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n=/* @__PURE__ */ (e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")}),r=/* @__PURE__ */ t({InferenceSession:()=>Me,TRACE:()=>Ce,TRACE_EVENT_BEGIN:()=>De,TRACE_EVENT_END:()=>Oe,TRACE_FUNC_BEGIN:()=>Te,TRACE_FUNC_END:()=>Ee,Tensor:()=>xe,default:()=>rr,env:()=>w,registerBackend:()=>h}),i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,c=(e=>typeof n<`u`?n:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof n<`u`?n:e)[t]}):e)(function(e){ -/*! -* ONNX Runtime Web v1.31.0-dev.20260914-8d85527a0 -* Copyright (c) Microsoft Corporation. All rights reserved. -* Licensed under the MIT License. -*/ -if(typeof n<`u`)return n.apply(this,arguments);throw Error(`Dynamic require of "`+e+`" is not supported`)}),l=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},u=(e,t)=>{for(var n in t)i(e,n,{get:t[n],enumerable:!0})},d=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(let c of o(t))!s.call(e,c)&&c!==n&&i(e,c,{get:()=>t[c],enumerable:!(r=a(t,c))||r.enumerable});return e},f=e=>d(i({},`__esModule`,{value:!0}),e),p,m,h,g,_,v=l(()=>{p=/* @__PURE__ */ new Map,m=[],h=(e,t,n)=>{if(t&&typeof t.init==`function`&&typeof t.createInferenceSessionHandler==`function`){let r=p.get(e);if(r===void 0)p.set(e,{backend:t,priority:n});else{if(r.priority>n)return;if(r.priority===n&&r.backend!==t)throw Error(`cannot register backend "${e}" using priority ${n}`)}if(n>=0){let t=m.indexOf(e);t!==-1&&m.splice(t,1);for(let t=0;t{let t=p.get(e);if(!t)return`backend not found.`;if(t.initialized)return t.backend;if(t.aborted)return t.error;{let n=!!t.initPromise;try{return n||(t.initPromise=t.backend.init(e)),await t.initPromise,t.initialized=!0,t.backend}catch(e){return n||(t.error=`${e}`,t.aborted=!0),t.error}finally{delete t.initPromise}}},_=async e=>{let t=e.executionProviders||[],n=t.map(e=>typeof e==`string`?e:e.name),r=n.length===0?m:n,i,a=[],o=/* @__PURE__ */ new Set;for(let e of r){let t=await g(e);typeof t==`string`?a.push({name:e,err:t}):(i||=t,i===t&&o.add(e))}if(!i)throw Error(`no available backend found. ERR: ${a.map(e=>`[${e.name}] ${e.err}`).join(`, `)}`);for(let{name:e,err:t}of a)n.includes(e)&&console.warn(`removing requested execution provider "${e}" from session options because it is not available: ${t}`);let s=t.filter(e=>o.has(typeof e==`string`?e:e.name));return[i,new Proxy(e,{get:(e,t)=>t===`executionProviders`?s:Reflect.get(e,t)})]}}),y=l(()=>{v()}),b,x=l(()=>{b=`1.31.0-dev.20260911-2a43ec07e`}),S,C,ee=l(()=>{x(),S=`warning`,C={wasm:{},webgl:{},webgpu:{},versions:{common:b},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);S=e}},get logLevel(){return S}},Object.defineProperty(C,"logLevel",{enumerable:!0})}),w,te=l(()=>{ee(),w=C}),ne,re,ie=l(()=>{ne=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t!==void 0&&t.format!==void 0?t.format:`RGB`,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t{be(),ae=(e,t)=>{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat!==void 0&&t.tensorFormat!==void 0?t.tensorFormat:`RGB`,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,ae(o,s)}throw Error(`Can not access image data`)}else{if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(ae(e.data,s))}});throw Error(`Input data provided is not supported - aborted tensor creation`)}if(o!==void 0)return ae(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},se=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new ye({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ce=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new ye({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},le=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new ye({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},ue=(e,t,n)=>new ye({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]})}),de,fe,pe,me,he=l(()=>{de=/* @__PURE__ */ new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),fe=/* @__PURE__ */ new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]),pe=!1,me=()=>{if(!pe){pe=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=typeof n<`u`&&n.from;e&&(de.set(`int64`,BigInt64Array),fe.set(BigInt64Array,`int64`)),t&&(de.set(`uint64`,BigUint64Array),fe.set(BigUint64Array,`uint64`)),r?(de.set(`float16`,n),fe.set(n,`float16`)):de.set(`float16`,Uint16Array)}}}),ge,_e,ve=l(()=>{be(),ge=e=>{let t=1;for(let n=0;n{switch(e.location){case`cpu`:return new ye(e.type,e.data,t);case`cpu-pinned`:return new ye({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new ye({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new ye({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new ye({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}}}),ye,be=l(()=>{ie(),T(),he(),ve(),ye=class{constructor(e,t,n){me();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=de.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`){if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=de.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray){if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`)}else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=fe.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=ge(i);if(this.cpuData&&a!==this.cpuData.length&&(r!==`uint4`&&r!==`int4`||Math.ceil(a/2)!==this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return oe(e,t)}static fromTexture(e,t){return se(e,t)}static fromGpuBuffer(e,t){return ce(e,t)}static fromMLTensor(e,t){return le(e,t)}static fromPinnedBuffer(e,t,n){return ue(e,t,n)}toDataURL(e){return ne(this,e)}toImageData(e){return re(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return _e(this,e)}}}),xe,Se=l(()=>{be(),xe=ye}),Ce,we,Te,Ee,De,Oe,ke=l(()=>{ee(),Ce=(e,t)=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.timeStamp(`${e}::ORT::${t}`)},we=(e,t)=>{let n=(/* @__PURE__ */ Error()).stack?.split(/\r\n|\r|\n/g)||[],r=!1;for(let i=0;i{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||we(`BEGIN`,e)},Ee=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||we(`END`,e)},De=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.time(`ORT::${e}`)},Oe=e=>{(typeof C.trace>`u`?!C.wasm.trace:!C.trace)||console.timeEnd(`ORT::${e}`)}}),Ae,je=l(()=>{v(),Se(),ke(),Ae=class e{constructor(e){this.handler=e}async run(e,t,n){Te(),De(`InferenceSession.run`);let r={},i={};if(typeof e!=`object`||!e||e instanceof xe||Array.isArray(e))throw TypeError(`'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.`);let a=!0;if(typeof t==`object`){if(t===null)throw TypeError(`Unexpected argument[1]: cannot be null.`);if(t instanceof xe)throw TypeError(`'fetches' cannot be a Tensor`);if(Array.isArray(t)){if(t.length===0)throw TypeError(`'fetches' cannot be an empty array.`);a=!1;for(let e of t){if(typeof e!=`string`)throw TypeError(`'fetches' must be a string array or an object.`);if(this.outputNames.indexOf(e)===-1)throw RangeError(`'fetches' contains invalid output name: ${e}.`);r[e]=null}if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else{let e=!1,o=Object.getOwnPropertyNames(t);for(let n of this.outputNames)if(o.indexOf(n)!==-1){let i=t[n];(i===null||i instanceof xe)&&(e=!0,a=!1,r[n]=i)}if(e){if(typeof n==`object`&&n)i=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else i=t}}else if(typeof t<`u`)throw TypeError(`Unexpected argument[1]: must be 'fetches' or 'options'.`);for(let t of this.inputNames)if(typeof e[t]>`u`)throw Error(`input '${t}' is missing in 'feeds'.`);if(a)for(let e of this.outputNames)r[e]=null;let o=await this.handler.run(e,r,i),s={};for(let e in o)if(Object.hasOwnProperty.call(o,e)){let t=o[e];s[e]=t instanceof xe?t:new xe(t.type,t.data,t.dims)}return Oe(`InferenceSession.run`),Ee(),s}async release(){return this.handler.dispose()}static async create(t,n,r,i){Te(),De(`InferenceSession.create`);let a,o={};if(typeof t==`string`){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof Uint8Array){if(a=t,typeof n==`object`&&n)o=n;else if(typeof n<`u`)throw TypeError(`'options' must be an object.`)}else if(t instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&t instanceof SharedArrayBuffer){let e=t,s=0,c=t.byteLength;if(typeof n==`object`&&n)o=n;else if(typeof n==`number`){if(s=n,!Number.isSafeInteger(s))throw RangeError(`'byteOffset' must be an integer.`);if(s<0||s>=e.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${e.byteLength}).`);if(c=t.byteLength-s,typeof r==`number`){if(c=r,!Number.isSafeInteger(c))throw RangeError(`'byteLength' must be an integer.`);if(c<=0||s+c>e.byteLength)throw RangeError(`'byteLength' is out of range (0, ${e.byteLength-s}].`);if(typeof i==`object`&&i)o=i;else if(typeof i<`u`)throw TypeError(`'options' must be an object.`)}else if(typeof r<`u`)throw TypeError(`'byteLength' must be a number.`)}else if(typeof n<`u`)throw TypeError(`'options' must be an object.`);a=new Uint8Array(e,s,c)}else throw TypeError(`Unexpected argument[0]: must be 'path' or 'buffer'.`);let[s,c]=await _(o),l=await s.createInferenceSessionHandler(a,c);return Oe(`InferenceSession.create`),Ee(),new e(l)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),Me,Ne=l(()=>{je(),Me=Ae}),Pe=l(()=>{}),Fe=l(()=>{}),Ie=l(()=>{}),Le=l(()=>{}),Re={};u(Re,{InferenceSession:()=>Me,TRACE:()=>Ce,TRACE_EVENT_BEGIN:()=>De,TRACE_EVENT_END:()=>Oe,TRACE_FUNC_BEGIN:()=>Te,TRACE_FUNC_END:()=>Ee,Tensor:()=>xe,env:()=>w,registerBackend:()=>h});var ze=l(()=>{y(),te(),Ne(),Se(),Pe(),Fe(),ke(),Ie(),Le()}),Be=l(()=>{}),Ve={};u(Ve,{default:()=>We});var He,Ue,We,Ge=l(()=>{Dn(),ht(),ot(),He=`ort-wasm-proxy-worker`,Ue=globalThis.self?.name===He,Ue&&(self.onmessage=e=>{let{type:t,in:n}=e.data;try{switch(t){case`init-wasm`:mt(n.wasm).then(()=>{hn(n).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})})},e=>{postMessage({type:t,err:e})});break;case`init-ep`:{let{epName:e,env:r}=n;gn(r,e).then(()=>{postMessage({type:t})},e=>{postMessage({type:t,err:e})});break}case`copy-from`:{let{buffer:e}=n,r=bn(e);postMessage({type:t,out:r});break}case`create`:{let{model:e,options:r}=n;xn(e,r).then(e=>{postMessage({type:t,out:e})},e=>{postMessage({type:t,err:e})});break}case`release`:Sn(n),postMessage({type:t});break;case`run`:{let{sessionId:e,inputIndices:r,inputs:i,outputIndices:a,options:o}=n;wn(e,r,i,a,Array(a.length).fill(null),o).then(e=>{e.some(e=>e[3]!==`cpu`)?postMessage({type:t,err:`Proxy does not support non-cpu tensor location.`}):postMessage({type:t,out:e},En([...i,...e]))},e=>{postMessage({type:t,err:e})});break}case`end-profiling`:Tn(n),postMessage({type:t})}}catch(e){postMessage({type:t,err:e})}}),We=Ue?null:e=>new Worker(e??Ye,{type:`module`,name:He})}),Ke,qe,Je,Ye,Xe,Ze,Qe,$e,et,tt,nt,rt,it,at,ot=l(()=>{Be(),Ke=typeof location>`u`?void 0:location.origin,qe=import.meta.url>`file:`&&import.meta.url<`file;`,Je=()=>qe?new URL(new URL(`ort.webgpu.min.mjs`,import.meta.url).href,Ke).href:import.meta.url,Ye=Je(),Xe=()=>{if(Ye&&!Ye.startsWith(`blob:`))return Ye.substring(0,Ye.lastIndexOf(`/`)+1)},Ze=(e,t)=>{try{let n=t??Ye;return(n?new URL(e,n):new URL(e)).origin===Ke}catch{return!1}},Qe=(e,t)=>{let n=t??Ye;try{return(n?new URL(e,n):new URL(e)).href}catch{return}},$e=(e,t)=>`${t??`./`}${e}`,et=async e=>{let t=await(await fetch(e,{credentials:`same-origin`})).blob();return URL.createObjectURL(t)},tt=async e=>(await import( -/*webpackIgnore:true*/ -/*@vite-ignore*/ -e)).default,nt=(Ge(),f(Ve)).default,rt=async()=>{if(!Ye)throw Error(`Failed to load proxy worker: cannot determine the script source URL.`);if(Ze(Ye))return[void 0,nt()];let e=await et(Ye);return[e,nt(e)]},it=void 0,at=async(e,t,n,r)=>{let i=it&&!(e||t);if(i){if(Ye)i=Ze(Ye)||r&&!n;else if(r&&!n)i=!0;else throw Error(`cannot determine the script source URL.`)}if(i)return[void 0,it];{let r=`ort-wasm-simd-threaded.asyncify.mjs`,i=e??Qe(r,t),a=n&&i&&!Ze(i,t),o=a?await et(i):i??$e(r,t);return[a?o:void 0,await tt(o)]}}}),st,ct,lt,ut,dt,ft,pt,mt,E,ht=l(()=>{ot(),ct=!1,lt=!1,ut=!1,dt=()=>{if(typeof SharedArrayBuffer>`u`)return!1;try{return typeof MessageChannel<`u`&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},ft=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},pt=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},mt=async e=>{if(ct)return Promise.resolve();if(lt)throw Error(`multiple calls to 'initializeWebAssembly()' detected.`);if(ut)throw Error(`previous call to 'initializeWebAssembly()' failed.`);lt=!0;let t=e.initTimeout,n=e.numThreads;if(e.simd!==!1){if(e.simd===`relaxed`){if(!pt())throw Error(`Relaxed WebAssembly SIMD is not supported in the current environment.`)}else if(!ft())throw Error(`WebAssembly SIMD is not supported in the current environment.`)}let r=dt();n>1&&!r&&(typeof self<`u`&&!self.crossOriginIsolated&&console.warn(`env.wasm.numThreads is set to `+n+`, but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info.`),console.warn(`WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading.`),e.numThreads=n=1);let i=e.wasmPaths,a=typeof i==`string`?i:void 0,o=i?.mjs,s=o?.href??o,c=i?.wasm,l=c?.href??c,u=e.wasmBinary,[d,f]=await at(s,a,n>1,!!u||!!l),p=!1,m=[];if(t>0&&m.push(new Promise(e=>{setTimeout(()=>{p=!0,e()},t)})),m.push(new Promise((e,t)=>{let r={numThreads:n};if(u)r.wasmBinary=u,r.locateFile=e=>e;else if(l||a)r.locateFile=e=>l??a+e;else if(s&&s.indexOf(`blob:`)!==0)r.locateFile=e=>new URL(e,s).href;else if(d){let e=Xe();e&&(r.locateFile=t=>e+t)}f(r).then(t=>{lt=!1,ct=!0,st=t,e(),d&&URL.revokeObjectURL(d)},e=>{lt=!1,ut=!0,t(e)})})),await Promise.race(m),p)throw Error(`WebAssembly backend initializing failed due to timeout: ${t}ms`)},E=()=>{if(ct&&st)return st;throw Error(`WebAssembly is not initialized yet.`)}}),gt,_t,D,vt=l(()=>{ht(),gt=(e,t)=>{let n=E(),r=n.lengthBytesUTF8(e)+1,i=n._malloc(r);return n.stringToUTF8(e,i,r),t.push(i),i},_t=(e,t,n,r)=>{if(typeof e==`object`&&e){if(n.has(e))throw Error(`Circular reference in options`);n.add(e)}Object.entries(e).forEach(([e,i])=>{let a=t?t+e:e;if(typeof i==`object`)_t(i,a+`.`,n,r);else if(typeof i==`string`||typeof i==`number`)r(a,i.toString());else if(typeof i==`boolean`)r(a,i?`1`:`0`);else throw Error(`Can't handle extra config type: ${typeof i}`)})},D=e=>{let t=E(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetLastError(r,r+n);let i=Number(t.getValue(r,n===4?`i32`:`i64`)),a=t.getValue(r+n,`*`),o=a?t.UTF8ToString(a):``;throw Error(`${e} ERROR_CODE: ${i}, ERROR_MESSAGE: ${o}`)}finally{t.stackRestore(n)}}}),yt,bt=l(()=>{ht(),vt(),yt=e=>{let t=E(),n=0,r=[],i=e||{};try{if(e?.logSeverityLevel===void 0)i.logSeverityLevel=2;else if(typeof e.logSeverityLevel!=`number`||!Number.isInteger(e.logSeverityLevel)||e.logSeverityLevel<0||e.logSeverityLevel>4)throw Error(`log severity level is not valid: ${e.logSeverityLevel}`);if(e?.logVerbosityLevel===void 0)i.logVerbosityLevel=0;else if(typeof e.logVerbosityLevel!=`number`||!Number.isInteger(e.logVerbosityLevel))throw Error(`log verbosity level is not valid: ${e.logVerbosityLevel}`);e?.terminate===void 0&&(i.terminate=!1);let a=0;return e?.tag!==void 0&&(a=gt(e.tag,r)),n=t._OrtCreateRunOptions(i.logSeverityLevel,i.logVerbosityLevel,!!i.terminate,a),n===0&&D(`Can't create run options.`),e?.extra!==void 0&&_t(e.extra,``,/* @__PURE__ */ new WeakSet,(e,i)=>{let a=gt(e,r),o=gt(i,r);t._OrtAddRunConfigEntry(n,a,o)!==0&&D(`Can't set a run config entry: ${e} - ${i}.`)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseRunOptions(n),r.forEach(e=>t._free(e)),e}}}),xt,St,Ct,wt,Tt,Et,Dt,Ot=l(()=>{ht(),vt(),xt=e=>{switch(e){case`disabled`:return 0;case`basic`:return 1;case`extended`:return 2;case`layout`:return 3;case`all`:return 99;default:throw Error(`unsupported graph optimization level: ${e}`)}},St=e=>{switch(e){case`sequential`:return 0;case`parallel`:return 1;default:throw Error(`unsupported execution mode: ${e}`)}},Ct=e=>{e.extra||={},e.extra.session||(e.extra.session={});let t=e.extra.session;t.use_ort_model_bytes_directly||=`1`,e.executionProviders&&e.executionProviders.some(e=>(typeof e==`string`?e:e.name)===`webgpu`)&&(e.enableMemPattern=!1)},wt=(e,t,n,r)=>{let i=gt(t,r),a=gt(n,r);E()._OrtAddSessionConfigEntry(e,i,a)!==0&&D(`Can't set a session config entry: ${t} - ${n}.`)},Tt=(e,t,n,r)=>{let i=gt(t,r),a=gt(n,r);e.push([i,a])},Et=async(e,t,n)=>{let r=t.executionProviders;for(let i of r){let r=typeof i==`string`?i:i.name,a=[];switch(r){case`webnn`:if(r=`WEBNN`,wt(e,`session.disable_quant_qdq`,`1`,n),wt(e,`session.disable_qdq_constant_folding`,`1`,n),typeof i!=`string`){let t=i?.deviceType;t&&wt(e,`deviceType`,t,n)}break;case`webgpu`:{r=`WebGPU`;let e;if(typeof i!=`string`){let r=i;if(r.device){if(typeof GPUDevice<`u`&&r.device instanceof GPUDevice)e=r.device;else throw Error(`Invalid GPU device set in WebGPU EP options.`)}let{enableGraphCapture:o}=t;if(typeof o==`boolean`&&o&&Tt(a,`enableGraphCapture`,`1`,n),typeof r.preferredLayout==`string`&&Tt(a,`preferredLayout`,r.preferredLayout,n),r.forceCpuNodeNames){let e=Array.isArray(r.forceCpuNodeNames)?r.forceCpuNodeNames:[r.forceCpuNodeNames];Tt(a,`forceCpuNodeNames`,e.join(` -`),n)}r.validationMode&&Tt(a,`validationMode`,r.validationMode,n),typeof r.enableMatmulFp32Accumulation==`boolean`&&Tt(a,`enableMatmulFp32Accumulation`,r.enableMatmulFp32Accumulation?`1`:`0`,n);for(let e of[`storageBufferCacheMode`,`uniformBufferCacheMode`,`queryResolveBufferCacheMode`,`defaultBufferCacheMode`]){let t=r[e];if(t){if(t!==`disabled`&&t!==`lazyRelease`&&t!==`simple`&&t!==`bucket`)throw Error(`${e} must be one of 'disabled', 'lazyRelease', 'simple' or 'bucket': ${t}`);Tt(a,e,t,n)}}}let o=E().webgpuRegisterDevice(e);if(o){let[e,t,r]=o;Tt(a,`deviceId`,e.toString(),n),Tt(a,`webgpuInstance`,t.toString(),n),Tt(a,`webgpuDevice`,r.toString(),n)}}break;case`wasm`:case`cpu`:continue;default:throw Error(`not supported execution provider: ${r}`)}let o=gt(r,n),s=a.length,c=0,l=0;if(s>0){c=E()._malloc(s*E().PTR_SIZE),n.push(c),l=E()._malloc(s*E().PTR_SIZE),n.push(l);for(let e=0;e{let t=E(),n=0,r=[],i=e||{};Ct(i);try{let e=xt(i.graphOptimizationLevel??`all`),a=St(i.executionMode??`sequential`),o=typeof i.logId==`string`?gt(i.logId,r):0,s=i.logSeverityLevel??2;if(!Number.isInteger(s)||s<0||s>4)throw Error(`log severity level is not valid: ${s}`);let c=i.logVerbosityLevel??0;if(!Number.isInteger(c)||c<0||c>4)throw Error(`log verbosity level is not valid: ${c}`);let l=typeof i.optimizedModelFilePath==`string`?gt(i.optimizedModelFilePath,r):0;if(n=t._OrtCreateSessionOptions(e,!!i.enableCpuMemArena,!!i.enableMemPattern,a,!!i.enableProfiling,0,o,s,c,l),n===0&&D(`Can't create session options.`),i.executionProviders&&await Et(n,i,r),i.enableGraphCapture!==void 0){if(typeof i.enableGraphCapture!=`boolean`)throw Error(`enableGraphCapture must be a boolean value: ${i.enableGraphCapture}`);wt(n,`enableGraphCapture`,i.enableGraphCapture.toString(),r)}if(i.freeDimensionOverrides)for(let[e,a]of Object.entries(i.freeDimensionOverrides)){if(typeof e!=`string`)throw Error(`free dimension override name must be a string: ${e}`);if(typeof a!=`number`||!Number.isInteger(a)||a<0)throw Error(`free dimension override value must be a non-negative integer: ${a}`);let i=gt(e,r);t._OrtAddFreeDimensionOverride(n,i,a)!==0&&D(`Can't set a free dimension override: ${e} - ${a}.`)}return i.extra!==void 0&&_t(i.extra,``,/* @__PURE__ */ new WeakSet,(e,t)=>{wt(n,e,t,r)}),[n,r]}catch(e){throw n!==0&&t._OrtReleaseSessionOptions(n)!==0&&D(`Can't release session options.`),r.forEach(e=>t._free(e)),e}}}),kt,At,jt,Mt,Nt,Pt,Ft,It,Lt=l(()=>{kt=e=>{switch(e){case`int8`:return 3;case`uint8`:return 2;case`bool`:return 9;case`int16`:return 5;case`uint16`:return 4;case`int32`:return 6;case`uint32`:return 12;case`float16`:return 10;case`float32`:return 1;case`float64`:return 11;case`string`:return 8;case`int64`:return 7;case`uint64`:return 13;case`int4`:return 22;case`uint4`:return 21;default:throw Error(`unsupported data type: ${e}`)}},At=e=>{switch(e){case 3:return`int8`;case 2:return`uint8`;case 9:return`bool`;case 5:return`int16`;case 4:return`uint16`;case 6:return`int32`;case 12:return`uint32`;case 10:return`float16`;case 1:return`float32`;case 11:return`float64`;case 8:return`string`;case 7:return`int64`;case 13:return`uint64`;case 22:return`int4`;case 21:return`uint4`;default:throw Error(`unsupported data type: ${e}`)}},jt=(e,t)=>{let n=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,.5,.5][e],r=typeof t==`number`?t:t.reduce((e,t)=>e*t,1);return n>0?Math.ceil(r*n):void 0},Mt=e=>{switch(e){case`float16`:return typeof Float16Array<`u`?Float16Array:Uint16Array;case`float32`:return Float32Array;case`uint8`:return Uint8Array;case`int8`:return Int8Array;case`uint16`:return Uint16Array;case`int16`:return Int16Array;case`int32`:return Int32Array;case`bool`:return Uint8Array;case`float64`:return Float64Array;case`uint32`:return Uint32Array;case`int64`:return BigInt64Array;case`uint64`:return BigUint64Array;default:throw Error(`unsupported type: ${e}`)}},Nt=e=>{switch(e){case`verbose`:return 0;case`info`:return 1;case`warning`:return 2;case`error`:return 3;case`fatal`:return 4;default:throw Error(`unsupported logging level: ${e}`)}},Pt=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,Ft=e=>e===`float32`||e===`float16`||e===`int32`||e===`int64`||e===`uint32`||e===`uint64`||e===`int8`||e===`uint8`||e===`bool`||e===`uint4`||e===`int4`,It=e=>{switch(e){case`none`:return 0;case`cpu`:return 1;case`cpu-pinned`:return 2;case`texture`:return 3;case`gpu-buffer`:return 4;case`ml-tensor`:return 5;default:throw Error(`unsupported data location: ${e}`)}}}),Rt,zt=l(()=>{Be(),Rt=async e=>{if(typeof e==`string`){let t=await fetch(e);if(!t.ok)throw Error(`failed to load external data file: ${e}`);let n=t.headers.get(`Content-Length`),r=n?parseInt(n,10):0;if(r<1073741824)return new Uint8Array(await t.arrayBuffer());{if(!t.body)throw Error(`failed to load external data file: ${e}, no response body.`);let n=t.body.getReader(),i;try{i=new ArrayBuffer(r)}catch(e){if(e instanceof RangeError){let e=Math.ceil(r/65536);i=new WebAssembly.Memory({initial:e,maximum:e}).buffer}else throw e}let a=0;for(;;){let{done:e,value:t}=await n.read();if(e)break;let r=t.byteLength;new Uint8Array(i,a,r).set(t),a+=r}return new Uint8Array(i,0,r)}}return e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof Uint8Array?e:new Uint8Array(e)}}),Bt,Vt=l(()=>{Lt(),Bt=(e,t)=>new(Mt(t))(e)}),Ht,Ut,Wt,Gt,Kt,qt,Jt,Yt=l(()=>{Lt(),Ht=[`V`,`I`,`W`,`E`,`F`],Ut=(e,t)=>{console.log(`[${Ht[e]},${(/* @__PURE__ */ new Date()).toISOString()}]${t}`)},Kt=(e,t)=>{Wt=e,Gt=t},qt=(e,t)=>{let n=Nt(e);n>=Nt(Wt)&&Ut(n,typeof t==`function`?t():t)},Jt=(...e)=>{Gt&&qt(...e)}}),Xt,Zt,Qt,$t,en,tn,nn,rn,an,on,sn,cn=l(()=>{Lt(),Yt(),Xt=/* @__PURE__ */ new Map([[`float32`,32],[`float16`,16],[`int32`,32],[`uint32`,32],[`int64`,64],[`uint64`,64],[`int8`,8],[`uint8`,8],[`int4`,4],[`uint4`,4]]),Zt=(e,t)=>{if(t===`int32`)return e;let n=Xt.get(t);if(!n)throw Error(`WebNN backend does not support data type: ${t}`);let r=n/8;if(e.byteLength%r!==0)throw Error(`Invalid Uint8Array length - must be a multiple of ${r}.`);let i=e.byteLength/r,a=new(Mt(t))(e.buffer,e.byteOffset,i);switch(t){case`int64`:case`uint64`:{let e=new Int32Array(i);for(let t=0;t2147483647n||n<-2147483648n)throw Error(`Can not convert int64 data to int32 - value out of range.`);e[t]=Number(n)}return new Uint8Array(e.buffer)}case`int8`:case`uint8`:case`uint32`:{if(t===`uint32`&&a.some(e=>e>2147483647))throw Error(`Can not convert uint32 data to int32 - value out of range.`);let e=Int32Array.from(a,Number);return new Uint8Array(e.buffer)}default:throw Error(`Unsupported data conversion from ${t} to 'int32'`)}},Qt=(e,t)=>{if(t===`int32`)return e;if(e.byteLength%4!=0)throw Error(`Invalid Uint8Array length - must be a multiple of 4 (int32).`);let n=e.byteLength/4,r=new Int32Array(e.buffer,e.byteOffset,n);switch(t){case`int64`:{let e=BigInt64Array.from(r,BigInt);return new Uint8Array(e.buffer)}case`uint64`:{if(r.some(e=>e<0))throw Error(`Can not convert int32 data to uin64 - negative value found.`);let e=BigUint64Array.from(r,BigInt);return new Uint8Array(e.buffer)}case`int8`:{if(r.some(e=>e<-128||e>127))throw Error(`Can not convert int32 data to int8 - value out of range.`);let e=Int8Array.from(r,Number);return new Uint8Array(e.buffer)}case`uint8`:if(r.some(e=>e<0||e>255))throw Error(`Can not convert int32 data to uint8 - value out of range.`);return Uint8Array.from(r,Number);case`uint32`:{if(r.some(e=>e<0))throw Error(`Can not convert int32 data to uint32 - negative value found.`);let e=Uint32Array.from(r,Number);return new Uint8Array(e.buffer)}default:throw Error(`Unsupported data conversion from 'int32' to ${t}`)}},$t=1,en=()=>$t++,tn=/* @__PURE__ */ new Map([[`int8`,`int32`],[`uint8`,`int32`],[`uint32`,`int32`],[`int64`,`int32`]]),nn=(e,t)=>{let n=Xt.get(e);if(!n)throw Error(`WebNN backend does not support data type: ${e}`);return t.length>0?Math.ceil(t.reduce((e,t)=>e*t)*n/8):0},rn=class{constructor(e){this.isDataConverted=!1;let{sessionId:t,context:n,tensor:r,dataType:i,shape:a,fallbackDataType:o}=e;this.sessionId=t,this.mlContext=n,this.mlTensor=r,this.dataType=i,this.tensorShape=a,this.fallbackDataType=o}get tensor(){return this.mlTensor}get type(){return this.dataType}get fallbackType(){return this.fallbackDataType}get shape(){return this.tensorShape}get byteLength(){return nn(this.dataType,this.tensorShape)}destroy(){Jt(`verbose`,()=>`[WebNN] TensorWrapper.destroy`),this.mlTensor.destroy()}write(e){this.mlContext.writeTensor(this.mlTensor,e)}async read(e){if(this.fallbackDataType){let t=await this.mlContext.readTensor(this.mlTensor),n=Qt(new Uint8Array(t),this.dataType);if(e){(e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)).set(n);return}return new Uint8Array(n).buffer}return e?this.mlContext.readTensor(this.mlTensor,e):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(e,t,n){return this.mlContext===e&&this.dataType===t&&this.tensorShape.length===n.length&&this.tensorShape.every((e,t)=>e===n[t])}setIsDataConverted(e){this.isDataConverted=e}},an=class{constructor(e,t){this.tensorManager=e,this.wrapper=t}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(e,t,n,r){let i=this.tensorManager.getMLContext(e),a=this.tensorManager.getMLOpSupportLimits(e),o;if(!a?.input.dataTypes.includes(t)){if(o=tn.get(t),!o||!a?.input.dataTypes.includes(o))throw Error(`WebNN backend does not support data type: ${t}`);Jt(`verbose`,()=>`[WebNN] TensorIdTracker.ensureTensor: fallback dataType from ${t} to ${o}`)}if(this.wrapper){if(this.wrapper.canReuseTensor(i,t,n))return this.wrapper.tensor;if(r){if(this.wrapper.byteLength!==nn(t,n))throw Error(`Unable to copy data to tensor with different size.`);this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let s=typeof MLTensorUsage>`u`?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(e,t,n,s,!0,!0,o),r&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(e){let t=e;if(this.wrapper){if(this.wrapper.fallbackType){if(this.wrapper.fallbackType===`int32`)t=Zt(e,this.wrapper.type),this.wrapper.setIsDataConverted(!0);else throw Error(`Unsupported fallback data type: ${this.wrapper.fallbackType}`)}if(e.byteLength===this.wrapper.byteLength){this.wrapper.write(t);return}Jt(`verbose`,()=>`Data size does not match tensor size. Releasing tensor.`),this.releaseTensor()}this.activeUpload?this.activeUpload.set(t):this.activeUpload=new Uint8Array(t)}async download(e){if(this.activeUpload){let t=this.wrapper?.isDataConverted?Qt(this.activeUpload,this.wrapper?.type):this.activeUpload;if(e){e instanceof ArrayBuffer?new Uint8Array(e).set(t):new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(t);return}return t.buffer}if(!this.wrapper)throw Error(`Tensor has not been created.`);return e?this.wrapper.read(e):this.wrapper.read()}},on=class{constructor(e){this.backend=e,this.tensorTrackersById=/* @__PURE__ */ new Map,this.freeTensors=[],this.externalTensors=/* @__PURE__ */ new Set}getMLContext(e){let t=this.backend.getMLContext(e);if(!t)throw Error(`MLContext not found for session.`);return t}getMLOpSupportLimits(e){return this.backend.getMLOpSupportLimits(e)}reserveTensorId(){let e=en();return this.tensorTrackersById.set(e,new an(this)),e}releaseTensorId(e){let t=this.tensorTrackersById.get(e);t&&(this.tensorTrackersById.delete(e),t.tensorWrapper&&this.releaseTensor(t.tensorWrapper))}async ensureTensor(e,t,n,r,i){Jt(`verbose`,()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${t}, dataType: ${n}, shape: ${r}, copyOld: ${i}}`);let a=this.tensorTrackersById.get(t);if(!a)throw Error(`Tensor not found.`);return a.ensureTensor(e,n,r,i)}upload(e,t){let n=this.tensorTrackersById.get(e);if(!n)throw Error(`Tensor not found.`);n.upload(t)}async download(e,t){Jt(`verbose`,()=>`[WebNN] TensorManager.download {tensorId: ${e}, dstBuffer: ${t?.byteLength}}`);let n=this.tensorTrackersById.get(e);if(!n)throw Error(`Tensor not found.`);return n.download(t)}releaseTensorsForSession(e){for(let t of this.freeTensors)t.sessionId===e&&t.destroy();this.freeTensors=this.freeTensors.filter(t=>t.sessionId!==e)}registerTensor(e,t,n,r){let i=this.getMLContext(e),a=en(),o=new rn({sessionId:e,context:i,tensor:t,dataType:n,shape:r});return this.tensorTrackersById.set(a,new an(this,o)),this.externalTensors.add(o),a}async getCachedTensor(e,t,n,r,i,a,o){let s=this.getMLContext(e);for(let[r,i]of this.freeTensors.entries())if(i.canReuseTensor(s,t,n)){Jt(`verbose`,()=>`[WebNN] Reusing tensor {dataType: ${t}, ${o?`fallbackDataType: ${o},`:``} shape: ${n}`);let i=this.freeTensors.splice(r,1)[0];return i.sessionId=e,i}Jt(`verbose`,()=>`[WebNN] MLContext.createTensor {dataType: ${t}, ${o?`fallbackDataType: ${o},`:``} shape: ${n}}`);let c=await s.createTensor({dataType:o??t,shape:n,dimensions:n,usage:r,writable:i,readable:a});return new rn({sessionId:e,context:s,tensor:c,dataType:t,shape:n,fallbackDataType:o})}releaseTensor(e){this.externalTensors.has(e)&&this.externalTensors.delete(e),this.freeTensors.push(e)}},sn=(...e)=>new on(...e)}),ln={};u(ln,{WebNNBackend:()=>fn});var un,dn,fn,pn=l(()=>{Lt(),ht(),Vt(),cn(),Yt(),un=/* @__PURE__ */ new Map([[1,`float32`],[10,`float16`],[6,`int32`],[12,`uint32`],[7,`int64`],[13,`uint64`],[22,`int4`],[21,`uint4`],[3,`int8`],[2,`uint8`],[9,`uint8`]]),dn=(e,t)=>{if(e===t)return!0;if(e===void 0||t===void 0)return!1;let n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((n,i)=>n===r[i]&&e[n]===t[n])},fn=class{constructor(e){this.tensorManager=sn(this),this.mlContextBySessionId=/* @__PURE__ */ new Map,this.sessionIdsByMLContext=/* @__PURE__ */ new Map,this.mlContextCache=[],this.sessionGraphInputs=/* @__PURE__ */ new Map,this.sessionGraphOutputs=/* @__PURE__ */ new Map,this.temporaryGraphInputs=[],this.temporaryGraphOutputs=[],this.temporarySessionTensorIds=/* @__PURE__ */ new Map,this.mlOpSupportLimitsBySessionId=/* @__PURE__ */ new Map,Kt(e.logLevel,!!e.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw Error(`No active session`);return this.activeSessionId}onRunStart(e){Jt(`verbose`,()=>`[WebNN] onRunStart {sessionId: ${e}}`),this.activeSessionId=e}onRunEnd(e){Jt(`verbose`,()=>`[WebNN] onRunEnd {sessionId: ${e}}`);let t=this.temporarySessionTensorIds.get(e);if(t){for(let e of t)Jt(`verbose`,()=>`[WebNN] releasing temporary tensor {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e);this.temporarySessionTensorIds.delete(e),this.activeSessionId=void 0}}async createMLContext(e){if(e instanceof GPUDevice){let t=this.mlContextCache.findIndex(t=>t.gpuDevice===e);if(t!==-1)return this.mlContextCache[t].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({gpuDevice:e,mlContext:t}),t}}if(e===void 0){let e=this.mlContextCache.findIndex(e=>e.options===void 0&&e.gpuDevice===void 0);if(e!==-1)return this.mlContextCache[e].mlContext;{let e=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:e}),e}}let t=this.mlContextCache.findIndex(t=>dn(t.options,e));if(t!==-1)return this.mlContextCache[t].mlContext;{let t=await navigator.ml.createContext(e);return this.mlContextCache.push({options:e,mlContext:t}),t}}registerMLContext(e,t){this.mlContextBySessionId.set(e,t);let n=this.sessionIdsByMLContext.get(t);n||(n=/* @__PURE__ */ new Set,this.sessionIdsByMLContext.set(t,n)),n.add(e),this.mlOpSupportLimitsBySessionId.has(e)||this.mlOpSupportLimitsBySessionId.set(e,t.opSupportLimits()),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(e,this.temporaryGraphInputs),this.temporaryGraphInputs=[]),this.temporaryGraphOutputs.length>0&&(this.sessionGraphOutputs.set(e,this.temporaryGraphOutputs),this.temporaryGraphOutputs=[])}onReleaseSession(e){this.sessionGraphInputs.delete(e),this.sessionGraphOutputs.delete(e);let t=this.mlContextBySessionId.get(e);if(!t)return;this.tensorManager.releaseTensorsForSession(e),this.mlContextBySessionId.delete(e),this.mlOpSupportLimitsBySessionId.delete(e);let n=this.sessionIdsByMLContext.get(t);if(n.delete(e),n.size===0){this.sessionIdsByMLContext.delete(t);let e=this.mlContextCache.findIndex(e=>e.mlContext===t);e!==-1&&this.mlContextCache.splice(e,1)}}getMLContext(e){return this.mlContextBySessionId.get(e)}getMLOpSupportLimits(e){return this.mlOpSupportLimitsBySessionId.get(e)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(e){Jt(`verbose`,()=>`[WebNN] releaseTensorId {tensorId: ${e}}`),this.tensorManager.releaseTensorId(e)}async ensureTensor(e,t,n,r,i){let a=un.get(n);if(!a)throw Error(`Unsupported ONNX data type: ${n}`);return this.tensorManager.ensureTensor(e??this.currentSessionId,t,a,r,i)}async createTemporaryTensor(e,t,n){Jt(`verbose`,()=>`[WebNN] createTemporaryTensor {onnxDataType: ${t}, shape: ${n}}`);let r=un.get(t);if(!r)throw Error(`Unsupported ONNX data type: ${t}`);let i=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(e,i,r,n,!1);let a=this.temporarySessionTensorIds.get(e);return a?a.push(i):this.temporarySessionTensorIds.set(e,[i]),i}uploadTensor(e,t){if(!E().shouldTransferToMLTensor)throw Error(`Trying to upload to a MLTensor while shouldTransferToMLTensor is false`);Jt(`verbose`,()=>`[WebNN] uploadTensor {tensorId: ${e}, data: ${t.byteLength}}`),this.tensorManager.upload(e,t)}async downloadTensor(e,t){return this.tensorManager.download(e,t)}createMLTensorDownloader(e,t){return async()=>{let n=await this.tensorManager.download(e);return Bt(n,t)}}registerMLTensor(e,t,n,r){let i=un.get(n);if(!i)throw Error(`Unsupported ONNX data type: ${n}`);let a=this.tensorManager.registerTensor(e,t,i,r);return Jt(`verbose`,()=>`[WebNN] registerMLTensor {tensor: ${t}, dataType: ${i}, dimensions: ${r}} -> {tensorId: ${a}}`),a}registerGraphInput(e){this.temporaryGraphInputs.push(e)}registerGraphOutput(e){this.temporaryGraphOutputs.push(e)}isGraphInput(e,t){let n=this.sessionGraphInputs.get(e);return n?n.includes(t):!1}isGraphOutput(e,t){let n=this.sessionGraphOutputs.get(e);return n?n.includes(t):!1}isGraphInputOutputTypeSupported(e,t,n=!0){let r=un.get(kt(t)),i=this.mlOpSupportLimitsBySessionId.get(e);return typeof r>`u`?!1:n?!!i?.input.dataTypes.includes(r):!!i?.output.dataTypes.includes(r)}flush(){}}}),mn,hn,gn,_n,vn,yn,bn,xn,Sn,Cn,wn,Tn,En,Dn=l(()=>{ze(),bt(),Ot(),Lt(),ht(),vt(),zt(),mn=(e,t)=>{E()._OrtInit(e,t)!==0&&D(`Can't initialize onnxruntime.`)},hn=async e=>{mn(e.wasm.numThreads,Nt(e.logLevel))},gn=async(e,t)=>{E().asyncInit?.();let n=e.webgpu.adapter;if(t===`webgpu`){if(typeof navigator>`u`||!navigator.gpu)throw Error(`WebGPU is not supported in current environment`);if(n){if(typeof n.limits!=`object`||typeof n.features!=`object`||typeof n.requestDevice!=`function`)throw Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let t=e.webgpu.powerPreference;if(t!==void 0&&t!==`low-power`&&t!==`high-performance`)throw Error(`Invalid powerPreference setting: "${t}"`);let r=e.webgpu.forceFallbackAdapter;if(r!==void 0&&typeof r!=`boolean`)throw Error(`Invalid forceFallbackAdapter setting: "${r}"`);if(n=await navigator.gpu.requestAdapter({powerPreference:t,forceFallbackAdapter:r}),!n)throw Error(`Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.`)}}if(t===`webnn`&&(typeof navigator>`u`||!navigator.ml))throw Error(`WebNN is not supported in current environment`);if(t===`webgpu`&&E().webgpuInit(t=>{e.webgpu.device=t}),t===`webnn`){let t=new(pn(),f(ln)).WebNNBackend(e);E().webnnInit([t,()=>t.reserveTensorId(),e=>t.releaseTensorId(e),async(e,n,r,i,a)=>t.ensureTensor(e,n,r,i,a),(e,n)=>{t.uploadTensor(e,n)},async(e,n)=>t.downloadTensor(e,n),(e,n)=>t.registerMLContext(e,n),!!e.trace])}},_n=/* @__PURE__ */ new Map,vn=e=>{let t=E(),n=t.stackSave();try{let n=t.PTR_SIZE,r=t.stackAlloc(2*n);t._OrtGetInputOutputCount(e,r,r+n)!==0&&D(`Can't get session input/output count.`);let i=n===4?`i32`:`i64`;return[Number(t.getValue(r,i)),Number(t.getValue(r+n,i))]}finally{t.stackRestore(n)}},yn=(e,t)=>{let n=E(),r=n.stackSave(),i=0;try{let r=n.PTR_SIZE,a=n.stackAlloc(2*r);n._OrtGetInputOutputMetadata(e,t,a,a+r)!==0&&D(`Can't get session input/output metadata.`);let o=Number(n.getValue(a,`*`));i=Number(n.getValue(a+r,`*`));let s=n.HEAP32[i/4];if(s===0)return[o,0];let c=n.HEAPU32[i/4+1],l=[];for(let e=0;e{let t=E(),n=t._malloc(e.byteLength);if(n===0)throw Error(`Can't create a session. failed to allocate a buffer of size ${e.byteLength}.`);return t.HEAPU8.set(e,n),[n,e.byteLength]},xn=async(e,t)=>{let n,r,i=E();Array.isArray(e)?[n,r]=e:e.buffer===i.HEAPU8.buffer?[n,r]=[e.byteOffset,e.byteLength]:[n,r]=bn(e);let a=0,o=0,s=0,c=[],l=[],u=[];try{if([o,c]=await Dt(t),t?.externalData&&i.mountExternalData){let e=[];for(let n of t.externalData){let t=typeof n==`string`?n:n.path,r=typeof n==`string`?n:n.data;e.push(Rt(r).then(e=>{i.mountExternalData(t,e)}))}await Promise.all(e)}for(let e of t?.executionProviders??[])if((typeof e==`string`?e:e.name)===`webnn`){if(i.shouldTransferToMLTensor=!1,typeof e!=`string`){let t=e,n=t?.context,r=t?.gpuDevice,a=t?.deviceType,o=t?.powerPreference;i.currentContext=n||(r?await i.webnnCreateMLContext(r):await i.webnnCreateMLContext({deviceType:a,powerPreference:o}))}else i.currentContext=await i.webnnCreateMLContext();break}a=await i._OrtCreateSession(n,r,o),i.webgpuOnCreateSession?.(a),a===0&&D(`Can't create a session.`),i.jsepOnCreateSession?.(),i.currentContext&&(i.webnnRegisterMLContext(a,i.currentContext),i.currentContext=void 0,i.shouldTransferToMLTensor=!0);let[e,d]=vn(a),f=!!t?.enableGraphCapture,p=[],m=[],h=[],g=[],_=[];for(let t=0;te===`gpu-buffer`||e===`ml-tensor`||e===`ml-tensor-cpu-output`)&&(s=i._OrtCreateBinding(a),s===0&&D(`Can't create IO binding.`),v={handle:s,outputPreferredLocations:_,outputPreferredLocationsEncoded:_.map(e=>e===`ml-tensor-cpu-output`?`ml-tensor`:e).map(e=>It(e))}),_n.set(a,[a,l,u,v,f,!1]),[a,p,m,h,g]}catch(e){throw l.forEach(e=>i._OrtFree(e)),u.forEach(e=>i._OrtFree(e)),s!==0&&i._OrtReleaseBinding(s)!==0&&D(`Can't release IO binding.`),a!==0&&i._OrtReleaseSession(a)!==0&&D(`Can't release session.`),e}finally{i._free(n),o!==0&&i._OrtReleaseSessionOptions(o)!==0&&D(`Can't release session options.`),c.forEach(e=>i._free(e)),i.unmountExternalData?.()}},Sn=e=>{let t=E(),n=_n.get(e);if(!n)throw Error(`cannot release session. invalid session id: ${e}`);let[r,i,a,o,s]=n;o&&(s&&t._OrtClearBoundOutputs(o.handle)!==0&&D(`Can't clear bound outputs.`),t._OrtReleaseBinding(o.handle)!==0&&D(`Can't release IO binding.`)),t.jsepOnReleaseSession?.(e),t.webnnOnReleaseSession?.(e),t.webgpuOnReleaseSession?.(e),i.forEach(e=>t._OrtFree(e)),a.forEach(e=>t._OrtFree(e)),t._OrtReleaseSession(r)!==0&&D(`Can't release session.`),_n.delete(e)},Cn=async(e,t,n,r,i,a,o=!1)=>{if(!e){t.push(0);return}let s=E(),c=s.PTR_SIZE,l=e[0],u=e[1],d=e[3],f=d,p,m;if(l===`string`&&(d===`gpu-buffer`||d===`ml-tensor`))throw Error(`String tensor is not supported on GPU.`);if(o&&d!==`gpu-buffer`)throw Error(`External buffer must be provided for input/output index ${a} when enableGraphCapture is true.`);if(d===`gpu-buffer`){let t=e[2].gpuBuffer;m=jt(kt(l),u);{let e=s.webgpuRegisterBuffer;if(!e)throw Error(`Tensor location "gpu-buffer" is not supported without using WebGPU.`);p=e(t,r)}}else if(d===`ml-tensor`){let t=e[2].mlTensor;m=jt(kt(l),u);let n=s.webnnRegisterMLTensor;if(!n)throw Error(`Tensor location "ml-tensor" is not supported without using WebNN.`);p=n(r,t,kt(l),u)}else{let t=e[2];if(Array.isArray(t)){m=c*t.length,p=s._malloc(m),n.push(p);for(let e=0;es.setValue(g+t*c,e,c===4?`i32`:`i64`));let e=s._OrtCreateTensor(kt(l),p,m,g,u.length,It(f));e===0&&D(`Can't create tensor for input/output. session=${r}, index=${a}.`),t.push(e)}finally{s.stackRestore(h)}},wn=async(e,t,n,r,i,a)=>{let o=E(),s=o.PTR_SIZE,c=_n.get(e);if(!c)throw Error(`cannot run inference. invalid session id: ${e}`);let l=c[0],u=c[1],d=c[2],f=c[3],p=c[4],m=c[5],h=t.length,g=r.length,_=0,v=[],y=[],b=[],x=[],S=[],C=o.stackSave(),ee=o.stackAlloc(h*s),w=o.stackAlloc(h*s),te=o.stackAlloc(g*s),ne=o.stackAlloc(g*s);try{[_,v]=yt(a),De(`wasm prepareInputOutputTensor`);for(let r=0;re*t,1);u=At(a);let _=f?.outputPreferredLocations[r[t]];if(u===`string`){if(_===`gpu-buffer`||_===`ml-tensor`)throw Error(`String tensor is not supported on GPU.`);let e=[];for(let t=0;t0){let t=o.webgpuGetBuffer;if(!t)throw Error(`preferredLocation "gpu-buffer" is not supported without using WebGPU.`);let r=t(d),i=jt(a,g);if(i===void 0||!Pt(u))throw Error(`Unsupported data type: ${u}`);l=!0;{o.webgpuRegisterBuffer(r,e,d);let t=o.webgpuCreateDownloader(r,i,e);C.push([u,h,{gpuBuffer:r,download:async()=>{let e=await t();return new(Mt(u))(e)},dispose:()=>{o._OrtReleaseTensor(n)!==0&&D(`Can't release tensor.`)}},`gpu-buffer`])}}else if(_===`ml-tensor`&&g>0){let t=o.webnnEnsureTensor,r=o.webnnIsGraphInputOutputTypeSupported;if(!t||!r)throw Error(`preferredLocation "ml-tensor" is not supported without using WebNN.`);if(jt(a,g)===void 0||!Ft(u))throw Error(`Unsupported data type: ${u}`);if(!r(e,u,!1))throw Error(`preferredLocation "ml-tensor" for ${u} output is not supported by current WebNN Context.`);let i=await t(e,d,a,h,!1);l=!0,C.push([u,h,{mlTensor:i,download:o.webnnCreateMLTensorDownloader(d,u),dispose:()=>{o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n)}},`ml-tensor`])}else if(_===`ml-tensor-cpu-output`&&g>0){let e=o.webnnCreateMLTensorDownloader(d,u)(),t=C.length;l=!0,re.push((async()=>{let r=[t,await e];return o.webnnReleaseTensorId(d),o._OrtReleaseTensor(n),r})()),C.push([u,h,[],`cpu`])}else{let e=new(Mt(u))(g);new Uint8Array(e.buffer,e.byteOffset,e.byteLength).set(o.HEAPU8.subarray(d,d+e.byteLength)),C.push([u,h,e,`cpu`])}}finally{o.stackRestore(a),u===`string`&&d&&o._free(d),l||o._OrtReleaseTensor(n)}}f&&!p&&(o._OrtClearBoundOutputs(f.handle)!==0&&D(`Can't clear bound outputs.`),_n.set(e,[l,u,d,f,p,!1]));for(let[e,t]of await Promise.all(re))C[e][2]=t;return Oe(`wasm ProcessOutputTensor`),C}finally{o.webnnOnRunEnd?.(l),o.stackRestore(C),n.forEach(e=>{e&&e[3]===`gpu-buffer`&&o.webgpuUnregisterBuffer(e[2].gpuBuffer)}),i.forEach(e=>{e&&e[3]===`gpu-buffer`&&o.webgpuUnregisterBuffer(e[2].gpuBuffer)}),y.forEach(e=>o._OrtReleaseTensor(e)),b.forEach(e=>o._OrtReleaseTensor(e)),x.forEach(e=>o._free(e)),_!==0&&o._OrtReleaseRunOptions(_),v.forEach(e=>o._free(e))}},Tn=e=>{let t=E(),n=_n.get(e);if(!n)throw Error(`invalid session id`);let r=n[0],i=t._OrtEndProfiling(r);i===0&&D(`Can't get an profile file name.`),t._OrtFree(i)},En=e=>{let t=[];for(let n of e){let e=n[2];!Array.isArray(e)&&`buffer`in e&&t.push(e.buffer)}return t}}),On,kn,An,jn,Mn,Nn,Pn,Fn,In,Ln,Rn,zn,Bn,Vn,Hn,Un,Wn,Gn,Kn=l(()=>{ze(),Dn(),ht(),ot(),On=()=>!!w.wasm.proxy&&typeof document<`u`,An=!1,jn=!1,Mn=!1,Fn=/* @__PURE__ */ new Map,In=(e,t)=>{let n=Fn.get(e);n?n.push(t):Fn.set(e,[t])},Ln=()=>{if(An||!jn||Mn||!kn)throw Error(`worker not ready`)},Rn=e=>{switch(e.data.type){case`init-wasm`:An=!1,e.data.err?(Mn=!0,Pn[1](e.data.err)):(jn=!0,Pn[0]()),Nn&&=(URL.revokeObjectURL(Nn),void 0);break;case`init-ep`:case`copy-from`:case`create`:case`release`:case`run`:case`end-profiling`:{let t=Fn.get(e.data.type);e.data.err?t.shift()[1](e.data.err):t.shift()[0](e.data.out);break}}},zn=async()=>{if(!jn){if(An)throw Error(`multiple calls to 'initWasm()' detected.`);if(Mn)throw Error(`previous call to 'initWasm()' failed.`);if(An=!0,On())return new Promise((e,t)=>{kn?.terminate(),rt().then(([n,r])=>{try{kn=r,kn.onerror=e=>t(e),kn.onmessage=Rn,Pn=[e,t];let i={type:`init-wasm`,in:w};if(!i.in.wasm.wasmPaths&&n){let e=Xe();e&&(i.in.wasm.wasmPaths=e)}kn.postMessage(i),Nn=n}catch(e){t(e)}},t)});try{await mt(w.wasm),await hn(w),jn=!0}catch(e){throw Mn=!0,e}finally{An=!1}}},Bn=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`init-ep`,[t,n]);let r={type:`init-ep`,in:{epName:e,env:w}};kn.postMessage(r)});await gn(w,e)},Vn=async e=>On()?(Ln(),new Promise((t,n)=>{In(`copy-from`,[t,n]);let r={type:`copy-from`,in:{buffer:e}};kn.postMessage(r,[e.buffer])})):bn(e),Hn=async(e,t)=>{if(On()){if(t?.preferredOutputLocation)throw Error(`session option "preferredOutputLocation" is not supported for proxy.`);return Ln(),new Promise((n,r)=>{In(`create`,[n,r]);let i={type:`create`,in:{model:e,options:{...t}}},a=[];e instanceof Uint8Array&&a.push(e.buffer),kn.postMessage(i,a)})}return xn(e,t)},Un=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`release`,[t,n]);let r={type:`release`,in:e};kn.postMessage(r)});Sn(e)},Wn=async(e,t,n,r,i,a)=>{if(On()){if(n.some(e=>e[3]!==`cpu`))throw Error(`input tensor on GPU is not supported for proxy.`);if(i.some(e=>e))throw Error(`pre-allocated output tensor is not supported for proxy.`);return Ln(),new Promise((i,o)=>{In(`run`,[i,o]);let s=n,c={type:`run`,in:{sessionId:e,inputIndices:t,inputs:s,outputIndices:r,options:a}};kn.postMessage(c,En(s))})}return wn(e,t,n,r,i,a)},Gn=async e=>{if(On())return Ln(),new Promise((t,n)=>{In(`end-profiling`,[t,n]);let r={type:`end-profiling`,in:e};kn.postMessage(r)});Tn(e)}}),qn,Jn,Yn,Xn=l(()=>{ze(),Kn(),Lt(),Be(),zt(),qn=(e,t)=>{switch(e.location){case`cpu`:return[e.type,e.dims,e.data,`cpu`];case`gpu-buffer`:return[e.type,e.dims,{gpuBuffer:e.gpuBuffer},`gpu-buffer`];case`ml-tensor`:return[e.type,e.dims,{mlTensor:e.mlTensor},`ml-tensor`];default:throw Error(`invalid data location: ${e.location} for ${t()}`)}},Jn=e=>{switch(e[3]){case`cpu`:return new xe(e[0],e[2],e[1]);case`gpu-buffer`:{let t=e[0];if(!Pt(t))throw Error(`not supported data type: ${t} for deserializing GPU tensor`);let{gpuBuffer:n,download:r,dispose:i}=e[2];return xe.fromGpuBuffer(n,{dataType:t,dims:e[1],download:r,dispose:i})}case`ml-tensor`:{let t=e[0];if(!Ft(t))throw Error(`not supported data type: ${t} for deserializing MLTensor tensor`);let{mlTensor:n,download:r,dispose:i}=e[2];return xe.fromMLTensor(n,{dataType:t,dims:e[1],download:r,dispose:i})}default:throw Error(`invalid data location: ${e[3]}`)}},Yn=class{async fetchModelAndCopyToWasmMemory(e){return Vn(await Rt(e))}async loadModel(e,t){Te();let n;n=typeof e==`string`?await this.fetchModelAndCopyToWasmMemory(e):e,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await Hn(n,t),Ee()}async dispose(){return Un(this.sessionId)}async run(e,t,n){Te();let r=[],i=[];Object.entries(e).forEach(e=>{let t=e[0],n=e[1],a=this.inputNames.indexOf(t);if(a===-1)throw Error(`invalid input '${t}'`);r.push(n),i.push(a)});let a=[],o=[];Object.entries(t).forEach(e=>{let t=e[0],n=e[1],r=this.outputNames.indexOf(t);if(r===-1)throw Error(`invalid output '${t}'`);a.push(n),o.push(r)});let s=r.map((e,t)=>qn(e,()=>`input "${this.inputNames[i[t]]}"`)),c=a.map((e,t)=>e?qn(e,()=>`output "${this.outputNames[o[t]]}"`):null),l=await Wn(this.sessionId,i,s,o,c,n),u={};for(let e=0;e$n,initializeFlags:()=>Qn,wasmBackend:()=>er});var Qn,$n,er,tr=l(()=>{ze(),Kn(),Xn(),Qn=()=>{(typeof w.wasm.initTimeout!=`number`||w.wasm.initTimeout<0)&&(w.wasm.initTimeout=0);let e=w.wasm.simd;if(typeof e!=`boolean`&&e!==void 0&&e!==`fixed`&&e!==`relaxed`&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${e}". Reset it to \`false\` and ignore SIMD feature checking.`),w.wasm.simd=!1),typeof w.wasm.proxy!=`boolean`&&(w.wasm.proxy=!1),typeof w.wasm.trace!=`boolean`&&(w.wasm.trace=!1),typeof w.wasm.numThreads!=`number`||!Number.isInteger(w.wasm.numThreads)||w.wasm.numThreads<=0){if(typeof self<`u`&&!self.crossOriginIsolated)w.wasm.numThreads=1;else{let e=typeof navigator>`u`?c(`node:os`).cpus().length:navigator.hardwareConcurrency;w.wasm.numThreads=Math.min(4,Math.ceil((e||1)/2))}}},$n=class{async init(e){Qn(),await zn(),await Bn(e)}async createInferenceSessionHandler(e,t){let n=new Yn;return await n.loadModel(e,t),n}},er=new $n});ze(),ze(),ze();var nr=`1.31.0-dev.20260914-8d85527a0`,rr=Re;{let e=(tr(),f(Zn)).wasmBackend;h(`webgpu`,e,5),h(`webnn`,e,5),h(`cpu`,e,10),h(`wasm`,e,10)}Object.defineProperty(w.versions,"web",{value:nr,enumerable:!0});let ir=`warning`;Object.defineProperty({wasm:{},webgl:{},webgpu:{},versions:{common:`1.30.0`},set logLevel(e){if(e!==void 0){if(typeof e!=`string`||[`verbose`,`info`,`warning`,`error`,`fatal`].indexOf(e)===-1)throw Error(`Unsupported logging level: ${e}`);ir=e}},get logLevel(){return ir}},"logLevel",{enumerable:!0});const ar=(e,t)=>{let n=typeof document<`u`?document.createElement(`canvas`):new OffscreenCanvas(1,1);n.width=e.dims[3],n.height=e.dims[2];let r=n.getContext(`2d`);if(r!=null){let i,a;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[3]):(i=e.dims[3],a=e.dims[2]);let o=t?.format===void 0?`RGB`:t.format,s=t?.norm,c,l;s===void 0||s.mean===void 0?c=[255,255,255,255]:typeof s.mean==`number`?c=[s.mean,s.mean,s.mean,s.mean]:(c=[s.mean[0],s.mean[1],s.mean[2],0],s.mean[3]!==void 0&&(c[3]=s.mean[3])),s===void 0||s.bias===void 0?l=[0,0,0,0]:typeof s.bias==`number`?l=[s.bias,s.bias,s.bias,s.bias]:(l=[s.bias[0],s.bias[1],s.bias[2],0],s.bias[3]!==void 0&&(l[3]=s.bias[3]));let u=a*i,d=0,f=u,p=u*2,m=-1;o===`RGBA`?(d=0,f=u,p=u*2,m=u*3):o===`RGB`?(d=0,f=u,p=u*2):o===`RBG`&&(d=0,p=u,f=u*2);for(let t=0;t{let n=typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):new OffscreenCanvas(1,1).getContext(`2d`),r;if(n!=null){let i,a,o;t?.tensorLayout!==void 0&&t.tensorLayout===`NHWC`?(i=e.dims[2],a=e.dims[1],o=e.dims[3]):(i=e.dims[3],a=e.dims[2],o=e.dims[1]);let s=t===void 0||t.format===void 0?`RGB`:t.format,c=t?.norm,l,u;c===void 0||c.mean===void 0?l=[255,255,255,255]:typeof c.mean==`number`?l=[c.mean,c.mean,c.mean,c.mean]:(l=[c.mean[0],c.mean[1],c.mean[2],255],c.mean[3]!==void 0&&(l[3]=c.mean[3])),c===void 0||c.bias===void 0?u=[0,0,0,0]:typeof c.bias==`number`?u=[c.bias,c.bias,c.bias,c.bias]:(u=[c.bias[0],c.bias[1],c.bias[2],0],c.bias[3]!==void 0&&(u[3]=c.bias[3]));let d=a*i;if(t!==void 0&&(t.format!==void 0&&o===4&&t.format!==`RGBA`||o===3&&t.format!==`RGB`&&t.format!==`BGR`))throw Error(`Tensor format doesn't match input tensor dims`);let f=0,p=1,m=2,h=3,g=0,_=d,v=d*2,y=-1;s===`RGBA`?(g=0,_=d,v=d*2,y=d*3):s===`RGB`?(g=0,_=d,v=d*2):s===`RBG`&&(g=0,v=d,_=d*2),r=n.createImageData(i,a);for(let t=0;t{if(e===void 0)throw Error(`Image buffer must be defined`);if(t.height===void 0||t.width===void 0)throw Error(`Image height and width must be defined`);if(t.tensorLayout===`NHWC`)throw Error(`NHWC Tensor layout is not supported yet`);let{height:n,width:r}=t,i=t.norm??{mean:255,bias:0},a,o;a=typeof i.mean==`number`?[i.mean,i.mean,i.mean,i.mean]:[i.mean[0],i.mean[1],i.mean[2],i.mean[3]??255],o=typeof i.bias==`number`?[i.bias,i.bias,i.bias,i.bias]:[i.bias[0],i.bias[1],i.bias[2],i.bias[3]??0];let s=t.format===void 0?`RGBA`:t.format,c=t.tensorFormat===void 0||t.tensorFormat===void 0?`RGB`:t.tensorFormat,l=n*r,u=c===`RGBA`?new Float32Array(l*4):new Float32Array(l*3),d=4,f=0,p=1,m=2,h=3,g=0,_=l,v=l*2,y=-1;s===`RGB`&&(d=3,f=0,p=1,m=2,h=-1),c===`RGBA`?y=l*3:c===`RBG`?(g=0,v=l,_=l*2):c===`BGR`&&(v=0,_=l,g=l*2);for(let t=0;t{let n=typeof HTMLImageElement<`u`&&e instanceof HTMLImageElement,r=typeof ImageData<`u`&&e instanceof ImageData,i=typeof ImageBitmap<`u`&&e instanceof ImageBitmap,a=typeof e==`string`,o,s=t??{},c=()=>{if(typeof document<`u`)return document.createElement(`canvas`);if(typeof OffscreenCanvas<`u`)return new OffscreenCanvas(1,1);throw Error(`Canvas is not supported`)},l=e=>typeof HTMLCanvasElement<`u`&&e instanceof HTMLCanvasElement||e instanceof OffscreenCanvas?e.getContext(`2d`):null;if(n){let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let n=e.height,i=e.width;if(t!==void 0&&t.resizedHeight!==void 0&&t.resizedWidth!==void 0&&(n=t.resizedHeight,i=t.resizedWidth),t!==void 0){if(s=t,t.tensorFormat!==void 0)throw Error(`Image input config format must be RGBA for HTMLImageElement`);s.tensorFormat=`RGBA`,s.height=n,s.width=i}else s.tensorFormat=`RGBA`,s.height=n,s.width=i;r.drawImage(e,0,0),o=r.getImageData(0,0,i,n).data}else throw Error(`Can not access image data`)}else if(r){let n,r;if(t!==void 0&&t.resizedWidth!==void 0&&t.resizedHeight!==void 0?(n=t.resizedHeight,r=t.resizedWidth):(n=e.height,r=e.width),t!==void 0&&(s=t),s.format=`RGBA`,s.height=n,s.width=r,t!==void 0){let t=c();t.width=r,t.height=n;let i=l(t);if(i!=null)i.putImageData(e,0,0),o=i.getImageData(0,0,r,n).data;else throw Error(`Can not access image data`)}else o=e.data}else if(i){if(t===void 0)throw Error(`Please provide image config with format for Imagebitmap`);let n=c();n.width=e.width,n.height=e.height;let r=l(n);if(r!=null){let t=e.height,n=e.width;return r.drawImage(e,0,0,n,t),o=r.getImageData(0,0,n,t).data,s.height=t,s.width=n,sr(o,s)}throw Error(`Can not access image data`)}else if(a)return new Promise((t,n)=>{let r=c(),i=l(r);if(!e||!i)return n();let a=new Image;a.crossOrigin=`Anonymous`,a.src=e,a.onload=()=>{r.width=a.width,r.height=a.height,i.drawImage(a,0,0,r.width,r.height);let e=i.getImageData(0,0,r.width,r.height);s.height=r.height,s.width=r.width,t(sr(e.data,s))}});else throw Error(`Input data provided is not supported - aborted tensor creation`);if(o!==void 0)return sr(o,s);throw Error(`Input data provided is not supported - aborted tensor creation`)},lr=(e,t)=>{let{width:n,height:r,download:i,dispose:a}=t;return new yr({location:`texture`,type:`float32`,texture:e,dims:[1,r,n,4],download:i,dispose:a})},ur=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yr({location:`gpu-buffer`,type:n??`float32`,gpuBuffer:e,dims:r,download:i,dispose:a})},dr=(e,t)=>{let{dataType:n,dims:r,download:i,dispose:a}=t;return new yr({location:`ml-tensor`,type:n??`float32`,mlTensor:e,dims:r,download:i,dispose:a})},fr=(e,t,n)=>new yr({location:`cpu-pinned`,type:e,data:t,dims:n??[t.length]}),pr=/* @__PURE__ */ new Map([[`float32`,Float32Array],[`uint8`,Uint8Array],[`int8`,Int8Array],[`uint16`,Uint16Array],[`int16`,Int16Array],[`int32`,Int32Array],[`bool`,Uint8Array],[`float64`,Float64Array],[`uint32`,Uint32Array],[`int4`,Uint8Array],[`uint4`,Uint8Array]]),mr=/* @__PURE__ */ new Map([[Float32Array,`float32`],[Uint8Array,`uint8`],[Int8Array,`int8`],[Uint16Array,`uint16`],[Int16Array,`int16`],[Int32Array,`int32`],[Float64Array,`float64`],[Uint32Array,`uint32`]]);let hr=!1;const gr=()=>{if(!hr){hr=!0;let e=typeof BigInt64Array<`u`&&BigInt64Array.from,t=typeof BigUint64Array<`u`&&BigUint64Array.from,n=globalThis.Float16Array,r=n!==void 0&&n.from;e&&(pr.set(`int64`,BigInt64Array),mr.set(BigInt64Array,`int64`)),t&&(pr.set(`uint64`,BigUint64Array),mr.set(BigUint64Array,`uint64`)),r?(pr.set(`float16`,n),mr.set(n,`float16`)):pr.set(`float16`,Uint16Array)}},_r=e=>{let t=1;for(let n=0;n{switch(e.location){case`cpu`:return new yr(e.type,e.data,t);case`cpu-pinned`:return new yr({location:`cpu-pinned`,data:e.data,type:e.type,dims:t});case`texture`:return new yr({location:`texture`,texture:e.texture,type:e.type,dims:t});case`gpu-buffer`:return new yr({location:`gpu-buffer`,gpuBuffer:e.gpuBuffer,type:e.type,dims:t});case`ml-tensor`:return new yr({location:`ml-tensor`,mlTensor:e.mlTensor,type:e.type,dims:t});default:throw Error(`tensorReshape: tensor location ${e.location} is not supported`)}};var yr=class{constructor(e,t,n){gr();let r,i;if(typeof e==`object`&&`location`in e)switch(this.dataLocation=e.location,r=e.type,i=e.dims,e.location){case`cpu-pinned`:{let t=pr.get(r);if(!t)throw TypeError(`unsupported type "${r}" to create tensor from pinned buffer`);if(!(e.data instanceof t))throw TypeError(`buffer should be of type ${t.name}`);this.cpuData=e.data;break}case`texture`:if(r!==`float32`)throw TypeError(`unsupported type "${r}" to create tensor from texture`);this.gpuTextureData=e.texture,this.downloader=e.download,this.disposer=e.dispose;break;case`gpu-buffer`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from gpu buffer`);this.gpuBufferData=e.gpuBuffer,this.downloader=e.download,this.disposer=e.dispose;break;case`ml-tensor`:if(r!==`float32`&&r!==`float16`&&r!==`int32`&&r!==`int64`&&r!==`uint32`&&r!==`uint64`&&r!==`int8`&&r!==`uint8`&&r!==`bool`&&r!==`uint4`&&r!==`int4`)throw TypeError(`unsupported type "${r}" to create tensor from MLTensor`);this.mlTensorData=e.mlTensor,this.downloader=e.download,this.disposer=e.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let a,o;if(typeof e==`string`){if(r=e,o=n,e===`string`){if(!Array.isArray(t))throw TypeError(`A string tensor's data must be a string array.`);a=t}else{let n=pr.get(e);if(n===void 0)throw TypeError(`Unsupported tensor type: ${e}.`);if(Array.isArray(t)){if(e===`float16`&&n===Uint16Array||e===`uint4`||e===`int4`)throw TypeError(`Creating a ${e} tensor from number array is not supported. Please use ${n.name} as data.`);a=e===`uint64`||e===`int64`?n.from(t,BigInt):n.from(t)}else if(t instanceof n)a=t;else if(t instanceof Uint8ClampedArray){if(e===`uint8`)a=Uint8Array.from(t);else throw TypeError(`A Uint8ClampedArray tensor's data must be type of uint8`)}else if(e===`float16`&&t instanceof Uint16Array&&n!==Uint16Array)a=new globalThis.Float16Array(t.buffer,t.byteOffset,t.length);else throw TypeError(`A ${r} tensor's data must be type of ${n}`)}}else if(o=t,Array.isArray(e)){if(e.length===0)throw TypeError(`Tensor type cannot be inferred from an empty array.`);let t=typeof e[0];if(t===`string`)r=`string`,a=e;else if(t===`boolean`)r=`bool`,a=Uint8Array.from(e);else throw TypeError(`Invalid element type of data array: ${t}.`)}else if(e instanceof Uint8ClampedArray)r=`uint8`,a=Uint8Array.from(e);else{let t=mr.get(e.constructor);if(t===void 0)throw TypeError(`Unsupported type for tensor data: ${e.constructor}.`);r=t,a=e}if(o===void 0)o=[a.length];else if(!Array.isArray(o))throw TypeError(`A tensor's dims must be a number array`);i=o,this.cpuData=a,this.dataLocation=`cpu`}let a=_r(i);if(this.cpuData&&a!==this.cpuData.length&&(r!==`uint4`&&r!==`int4`||Math.ceil(a/2)!==this.cpuData.length))throw Error(`Tensor's size(${a}) does not match data length(${this.cpuData.length}).`);this.type=r,this.dims=i,this.size=a}static async fromImage(e,t){return cr(e,t)}static fromTexture(e,t){return lr(e,t)}static fromGpuBuffer(e,t){return ur(e,t)}static fromMLTensor(e,t){return dr(e,t)}static fromPinnedBuffer(e,t,n){return fr(e,t,n)}toDataURL(e){return ar(this,e)}toImageData(e){return or(this,e)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error(`The data is not stored as a WebGL texture.`);return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error(`The data is not stored as a WebGPU buffer.`);return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error(`The data is not stored as a WebNN MLTensor.`);return this.mlTensorData}async getData(e){switch(this.ensureValid(),this.dataLocation){case`cpu`:case`cpu-pinned`:return this.data;case`texture`:case`gpu-buffer`:case`ml-tensor`:if(!this.downloader)throw Error(`The current tensor is not created with a specified data downloader.`);if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);try{this.isDownloading=!0;let t=await this.downloader();return this.downloader=void 0,this.dataLocation=`cpu`,this.cpuData=t,e&&this.disposer&&(this.disposer(),this.disposer=void 0),t}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error(`The current tensor is being downloaded.`);this.disposer&&=(this.disposer(),void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation=`none`}ensureValid(){if(this.dataLocation===`none`)throw Error(`The tensor is disposed.`)}reshape(e){if(this.ensureValid(),this.downloader||this.disposer)throw Error(`Cannot reshape a tensor that owns GPU resource.`);return vr(this,e)}};const br=yr;var xr=Object.defineProperty,Sr=(e,t)=>{for(var n in t)xr(e,n,{get:t[n],enumerable:!0})},Cr={},wr={},Tr={},Er=`4.3.0`,Dr=typeof self<`u`,Or=!Qr(Cr),kr=!Qr(wr),Ar=Dr&&`caches`in self,jr=globalThis.Deno!==void 0;globalThis.Bun;var Mr=jr&&Ar&&!Or,Nr=typeof process<`u`,Pr=Nr&&process?.release?.name===`node`&&!Mr,Fr=typeof window<`u`&&window.document!==void 0,Ir=Dr&&[`DedicatedWorkerGlobalScope`,`ServiceWorkerGlobalScope`,`SharedWorkerGlobalScope`].includes(self.constructor?.name),Lr=Fr||Ir||Mr,Rr=Pr||typeof navigator<`u`&&`gpu`in navigator,zr=typeof navigator<`u`&&`ml`in navigator,Br=typeof crypto<`u`&&typeof crypto.getRandomValues==`function`,Vr=typeof chrome<`u`&&chrome.runtime!==void 0&&typeof chrome.runtime.id==`string`,Hr=typeof ServiceWorkerGlobalScope<`u`&&Dr&&self instanceof ServiceWorkerGlobalScope,Ur=(()=>{if(typeof navigator>`u`)return!1;let e=navigator.userAgent;if(!((navigator.vendor||``).indexOf(`Apple`)>-1&&!e.match(/CriOS|FxiOS|EdgiOS|OPiOS|mercury|brave/i)&&!e.includes(`Chrome`)&&!e.includes(`Android`)))return!1;let t=e.match(/Version\/(\d+)/);return t?parseInt(t[1],10)<26:!1})(),O=Object.freeze({IS_BROWSER_ENV:Fr,IS_WEBWORKER_ENV:Ir,IS_WEB_ENV:Lr,IS_SERVICE_WORKER_ENV:Hr,IS_DENO_WEB_RUNTIME:Mr,IS_WEB_CACHE_AVAILABLE:Ar,IS_WEBGPU_AVAILABLE:Rr,IS_WEBNN_AVAILABLE:zr,IS_SAFARI_BELOW_26:Ur,IS_PROCESS_AVAILABLE:Nr,IS_NODE_ENV:Pr,IS_FS_AVAILABLE:Or,IS_PATH_AVAILABLE:kr,IS_CRYPTO_AVAILABLE:Br,IS_CHROME_AVAILABLE:Vr}),Wr=Or&&kr,Gr=`./`;if(Wr){let e=import.meta.url;e?Gr=wr.dirname(wr.dirname(Tr.fileURLToPath(e))):typeof __dirname<`u`&&(Gr=wr.dirname(__dirname))}var Kr=Wr?wr.join(Gr,`/.cache/`):null,qr=`/models/`,Jr=Wr?wr.join(Gr,qr):qr,Yr=typeof globalThis.fetch==`function`?globalThis.fetch.bind(globalThis):void 0,Xr=Object.freeze({DEBUG:10,INFO:20,WARNING:30,ERROR:40,NONE:50}),Zr=Xr.WARNING,k={version:Er,backends:{onnx:{}},get logLevel(){return Zr},set logLevel(e){Zr=e,k.backends.onnx?.setLogLevel?.(e)},allowRemoteModels:!0,remoteHost:`https://huggingface.co/`,remotePathTemplate:`{model}/resolve/{revision}/`,allowLocalModels:!(Fr||Ir||Mr),localModelPath:Jr,useFS:Or,useBrowserCache:Ar,useFSCache:Or,cacheDir:Kr,useCustomCache:!1,customCache:null,useWasmCache:Ar||Or,cacheKey:`transformers-cache`,experimental_useCrossOriginStorage:!1,fetch:Yr};function Qr(e){return Object.keys(e).length===0}var $r=class{constructor(){let e=function(...t){return e._call(...t)};return Object.setPrototypeOf(e,new.target.prototype)}_call(...e){throw Error(`Must implement _call method in subclass`)}};function ei(e,t){e&&e(t)}var ti=class extends $r{constructor(e,t){super(),this.callback=e,this.files_loading=t,this.loads=/* @__PURE__ */ new Map}_call(e){if(e.status===`progress`){this.files_loading[e.file]={loaded:e.loaded,total:e.total};let t=Object.values(this.files_loading).reduce((e,t)=>e+t.loaded,0),n=Object.values(this.files_loading).reduce((e,t)=>e+t.total,0),r=n>0?t/n*100:0;this.callback({status:`progress_total`,name:e.name,progress:r,loaded:t,total:n,files:structuredClone(this.files_loading)})}this.callback(e)}};function ni(e){return Number.isInteger(e)||typeof e==`bigint`}function ri(e){return e==null||e===-1}function ii(e){let t=[],n=e;for(;Array.isArray(n);)t.push(n.length),n=n[0];return t}function ai(...e){return Array.prototype.concat.apply([],e)}function oi(...e){return e.reduce((e,t)=>e.flatMap(e=>t.map(t=>[e,t])))}function si(e,t){return Math.abs((e+t)%(2*t)-t)}function ci(e,t){return Object.assign({},...t.map(t=>{if(e[t]!==void 0)return{[t]:e[t]}}))}function li(e,t){let n=0;for(let r of e)r===t&&++n;return n}var A={error(...e){k.logLevel<=Xr.ERROR&&console.error(...e)},warn(...e){k.logLevel<=Xr.WARNING&&console.warn(...e)},info(...e){k.logLevel<=Xr.INFO&&console.log(...e)},debug(...e){k.logLevel<=Xr.DEBUG&&console.log(...e)},log(...e){this.info(...e)}},ui=class{constructor(e){this.trie=this._build_trie(e)}_build_trie(e){let t=/* @__PURE__ */ Object.create(null);for(let n of e){let e=t;for(let t=0;tr&&t.push(e.slice(r,i)),t.push(o),i+=o.length,r=i):++i}return r{try{return new RegExp(e,t)}catch(n){if(!(n instanceof SyntaxError))throw n;let r=/* @__PURE__ */ new Map,i=e.replace(/(\\[pP])\{([^}=]+)\}/g,(t,n,i,a)=>{let o=0;for(let t=a-1;t>=0&&e[t]===`\\`;--t)++o;if(o%2==1)return t;let s=r.get(i);if(s===void 0){try{RegExp(`\\p{${i}}`,`u`),s=i}catch{s=`Script=${i}`}r.set(i,s)}return`${n}{${s}}`});if(i===e)throw n;try{return new RegExp(i,t)}catch{throw n}}},pi=e=>e.replace(/ \./g,`.`).replace(/ \?/g,`?`).replace(/ \!/g,`!`).replace(/ ,/g,`,`).replace(/ \' /g,`'`).replace(/ n't/g,`n't`).replace(/ 'm/g,`'m`).replace(/ 's/g,`'s`).replace(/ 've/g,`'ve`).replace(/ 're/g,`'re`),mi=(e,t=!0)=>{if(e.Regex!==void 0)return fi(Qi(Bi(e.Regex)),`gu`);if(e.String!==void 0){let n=$i(e.String);return new RegExp(t?n:`(${n})`,`gu`)}return console.warn(`Unknown pattern type:`,e),null},hi=`\\p{Alphabetic}\\p{M}\\p{Nd}\\p{Pc}`,gi=`${hi}\\u00B2\\u00B3\\u00B9\\u00BC-\\u00BE`,_i=`[${gi}]`,vi=`[^${gi}]`,yi=`(?:(?|[:=!>])/,ji=/^\\([pPxu])\{([^}]*)\}/,Mi=/^\{(\d+(?:,\d*)?|,\d+)\}/,Ni=/^\[:(\^?)(\p{Alphabetic}+):\]/u,Pi=/^\[:\^:\]/,Fi=/^\[(?:\.[^\]]*\.\]|=[^\]]*=\])/,Ii=/^(?:\\x[0-9A-Fa-f]{2}|\\u[0-9A-Fa-f]{4}|\\c[A-Za-z])/,Li=e=>e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`,Ri=(e,t)=>String.fromCodePoint(e.codePointAt(t)),zi=e=>{if(!/^[0-9A-Fa-f]{1,8}$/.test(e))return null;let t=Number.parseInt(e,16);if(t>127)return null;let n=String.fromCharCode(t);return Li(n)?`[${n.toLowerCase()}${n.toUpperCase()}]`:null},Bi=e=>e.replace(/\[\^\(\\s\|\[([^\]]+)\]\)\]/g,`[^()|\\s$1]`),Vi=`[\\s\\S]`,Hi=256,Ui=()=>({fragment:``,alternatives:[],tail:null,contains_complex_set:!1}),Wi=e=>{throw SyntaxError(`Unsupported range with a set-valued character-class operand at index ${e}`)},Gi=(e,t,n,r=!0)=>{e.tail===`range`&&Wi(n),e.alternatives.push(t),e.tail=`set`,e.contains_complex_set=e.contains_complex_set||r},Ki=(e,t,n=!1,r=-1)=>{if(n&&e.tail===`range`&&Wi(r),e.tail===`range`){e.fragment+=t,e.tail=`complete_range`;return}e.fragment+=t,e.tail=n?`set`:`scalar`,e.contains_complex_set=e.contains_complex_set||n},qi=(e,t,n)=>{let r=ji.exec(e.slice(t));if(r){let[e,i,a]=r;return i===`P`&&a===`Word`?Gi(n,`[^${hi}]`,t):Ki(n,i===`x`?`\\u{${a}}`:i===`p`&&a===`Word`?hi:e,i===`p`||i===`P`,t),t+e.length}let i=Ii.exec(e.slice(t));if(i)return Ki(n,i[0]),t+i[0].length;if(t+1>=e.length)throw SyntaxError(`Unterminated escape in character class at index ${t}`);let a=Ri(e,t+1),o=t+1+a.length,s=Di.get(a);if(s!==void 0)return Ki(n,s),o;let c=Ei.get(a);if(c!==void 0)return Gi(n,c,t),o;let l=Ti.get(a),u,d=!1;return l===void 0?u=/[A-Za-z0-9]/.test(a)||ki.includes(a)||a===`-`?`\\${a}`:a:(u=l,d=a!==`a`&&a!==`e`),Ki(n,u,d,t),o},Ji=e=>e.length===1?e[0]:`(?:(?=(?:${e.join(`|`)}))${Vi})`,Yi=e=>Ji(e.fragment.length===0?e.alternatives:[`[${e.fragment}]`,...e.alternatives]),Xi=e=>{let t=fi(`^(?:${e})$`,`u`),n=``;for(let e=0;e<26;++e){let r=String.fromCharCode(65+e),i=String.fromCharCode(97+e),a=t.test(r);a!==t.test(i)&&(n+=a?i:r)}return n},Zi=(e,t,n,r=!0,i=1)=>{if(i>Hi)throw SyntaxError(`Maximum character-class nesting depth of ${Hi} exceeded at index ${t}`);let a=t+1,o=e[a]===`^`;o&&++a;let s=a,c=[Ui()],l=c[0],u=!1;for(;a1?SyntaxError(`Malformed character-class intersection with an empty operand at index ${a}`):SyntaxError(`Empty character class at index ${t}`);let e=c.some(e=>e.contains_complex_set);if(o&&c.length>1&&u)throw SyntaxError(`Unsupported outer-negated character-class intersection with a nested negated class containing a Unicode property, POSIX class, or shorthand at index ${t}`);let i=Yi(c[0]),d=i;if(c.length>1){let e=``;for(let t=1;t0&&(f?(p+=e,d=`[${p}]`):d=Ji([d,`[${e}]`]))}return{atom:o?f?`[^${p}]`:`(?:(?!${d})${Vi})`:d,end:a+1,negated:o,contains_complex_set:e,contains_nested_negated_complex_set:u}}if(e.startsWith(`&&`,a)){if(l.tail===null)throw SyntaxError(`Malformed character-class intersection with an empty operand at index ${a}`);l=Ui(),c.push(l),a+=2;continue}if(d===`[`){let t=e.slice(a);if(Pi.test(t))throw SyntaxError(`Malformed empty negated POSIX character class at index ${a}`);let r=Ni.exec(t);if(r){let[,e,t]=r,i=Oi.get(t);if(i===void 0)throw SyntaxError(`Unsupported POSIX character class "${t}" at index ${a}`);if(n&&e&&(t===`lower`||t===`upper`))throw SyntaxError(`Unsupported negated POSIX ${t} class inside an inline case-insensitive group`);e?Gi(l,`[^${i}]`,a):Ki(l,i,!0,a),a+=r[0].length;continue}if(Fi.test(t))throw SyntaxError(`Unsupported POSIX collating or equivalence bracket expression at index ${a}`);let o=Zi(e,a,n,!1,i+1);Gi(l,o.atom,a,o.contains_complex_set),u||=o.contains_nested_negated_complex_set||o.negated&&o.contains_complex_set,a=o.end;continue}if(d===`-`){let t=e[a+1]===`]`||e.startsWith(`&&`,a+1);l.tail===`set`&&!t&&Wi(a),l.tail===null||l.tail===`range`||l.tail===`complete_range`||t?Ki(l,`\\-`):(l.fragment+=`-`,l.tail=`range`),++a;continue}Ki(l,d===`^`&&l.fragment.length===0?`\\^`:d),a+=d.length}throw SyntaxError(`${c.length>1?`Unterminated character-class intersection`:`Unterminated character class`} at index ${t}`)},Qi=e=>{let t=``,n=-1,r=!1,i=!1,a=[],o=e=>{n=t.length,t+=e,r=!1};for(let s=0;s=e.length){t+=c;break}let a=Ri(e,s+1);if(s+=1+a.length,a===`G`)continue;let l=Di.get(a);if(l!==void 0){o(l);continue}let u=wi.get(a),d;d=u===void 0?/[A-Za-z0-9]/.test(a)||ki.includes(a)?`\\${a}`:a:u,o(d);continue}switch(c){case`[`:{let t=Zi(e,s,i);o(t.atom),s=t.end;continue}case`]`:o(`\\]`),++s;continue;case`.`:o(`[^\\n]`),++s;continue;case`^`:o(xi),++s;continue;case`$`:o(Si),++s;continue;case`(`:{let n=e.startsWith(`(?i:`,s),o=n?`(?i:`:Ai.exec(e.slice(s))?.[0]??`(`,c=n||o===`(?>`?`(?:`:o;a.push([t.length,i]),n&&(i=!0),t+=c,r=!1,s+=o.length;continue}case`)`:t+=c,[n,i]=a.pop()??[-1,!1],r=!1,++s;continue;case`|`:t+=c,n=-1,r=!1,++s;continue;case`{`:{let i=Mi.exec(e.slice(s));if(!i||n<0){o(`\\{`),++s;continue}let a=i[1].startsWith(`,`)?`0${i[1]}`:i[1];s+=i[0].length;let c=e[s];c===`+`||c===`*`?(t=`${t.slice(0,n)}(?:${t.slice(n)}{${a}})${c}`,++s):t+=`{${a}}`,r=!0;continue}case`}`:o(`\\}`),++s;continue;case`+`:if(r){++s;continue}t+=c,r=!0,++s;continue;case`*`:case`?`:t+=c,r=!0,++s;continue;default:o(i&&Li(c)?`[${c.toLowerCase()}${c.toUpperCase()}]`:c),s+=c.length;continue}}return t},$i=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),ea=(e,t,n)=>{let r=[],i=0;for(;ie>=19968&&e<=40959||e>=13312&&e<=19903||e>=131072&&e<=173791||e>=173824&&e<=177983||e>=177984&&e<=178207||e>=178208&&e<=183983||e>=63744&&e<=64255||e>=194560&&e<=195103,na=e=>Number.isInteger(e)||typeof e==`bigint`,ra=e=>{let t=0;for(let n of e)++t;return t},ia=e=>ca(e.toLowerCase()),aa=(...e)=>Array.prototype.concat.apply([],e),oa=e=>new Map(Object.entries(e)),sa=(e,t)=>{let n=[],r=0;for(let i of e.matchAll(t)){let t=i[0];r0&&n.push(t),r=i.index+t.length}return re.replace(/\p{M}/gu,``),la=(e,t,n=[])=>{if(!e||Array.isArray(e)||typeof e!=`object`)return`${t} must be a valid object`;for(let r of n)if(!(r in e))return`${t} must contain a "${r}" property`;return null},ua=e=>e.match(/\S+/g)||[],da=class{constructor(){let e=function(...t){return e._call(...t)};return Object.setPrototypeOf(e,new.target.prototype)}},fa=class extends da{constructor(e){super(),this.config=e}_call(e){return this.normalize(e)}},pa=class extends fa{tokenize_chinese_chars(e){let t=[];for(let n=0;ne.normalize(`NFKC`)).join(`~`):e.normalize(`NFKC`),e}},ha=class extends fa{constructor(e){super(e),this.normalizers=(e.normalizers??[]).map(e=>Da(e))}normalize(e){return this.normalizers.reduce((e,t)=>t?t.normalize(e):e,e)}},ga=class extends fa{constructor(e){super(e),this.pattern=mi(this.config.pattern??{})}normalize(e){return this.pattern===null?e:e.replaceAll(this.pattern,this.config.content??``)}},_a=class extends fa{constructor(){super(...arguments),this.form=`NFC`}normalize(e){return e=e.normalize(this.form),e}},va=class extends _a{constructor(){super(...arguments),this.form=`NFC`}},ya=class extends _a{constructor(){super(...arguments),this.form=`NFD`}},ba=class extends _a{constructor(){super(...arguments),this.form=`NFKC`}},xa=class extends _a{constructor(){super(...arguments),this.form=`NFKD`}},Sa=class extends fa{normalize(e){return this.config.strip_left&&this.config.strip_right?e=e.trim():(this.config.strip_left&&(e=e.trimStart()),this.config.strip_right&&(e=e.trimEnd())),e}},Ca=class extends fa{normalize(e){return ca(e)}},wa=class extends fa{normalize(e){return e.toLowerCase()}},Ta=class extends fa{normalize(e){return e=this.config.prepend+e,e}};function Ea(e){if(e===null)return null;switch(e.type){case`BertNormalizer`:return new pa(e);case`Precompiled`:return new ma(e);case`Sequence`:return new ha(e);case`Replace`:return new ga(e);case`NFC`:return new va(e);case`NFD`:return new ya(e);case`NFKC`:return new ba(e);case`NFKD`:return new xa(e);case`Strip`:return new Sa(e);case`StripAccents`:return new Ca(e);case`Lowercase`:return new wa(e);case`Prepend`:return new Ta(e);default:throw Error(`Unknown Normalizer type: ${e.type}`)}}var Da=Ea,Oa=class extends da{pre_tokenize(e,t){return(Array.isArray(e)?e.map(e=>this.pre_tokenize_text(e,t)):this.pre_tokenize_text(e,t)).flat()}_call(e,t){return this.pre_tokenize(e,t)}},ka=(()=>{let e=[...Array.from({length:94},(e,t)=>t+33),...Array.from({length:12},(e,t)=>t+161),...Array.from({length:82},(e,t)=>t+174)],t=e.slice(),n=0;for(let r=0;r<256;++r)e.includes(r)||(e.push(r),t.push(256+n),n+=1);let r=t.map(e=>String.fromCharCode(e));return Object.fromEntries(e.map((e,t)=>[e,r[t]]))})(),Aa=(e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[t,e])))(ka),ja=`\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E`,Ma=class extends Oa{constructor(e){super(),this.config=e,this.add_prefix_space=this.config.add_prefix_space??!1,this.trim_offsets=this.config.trim_offsets??!1,this.use_regex=this.config.use_regex??!0,this.pattern=/'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu,this.byte_encoder=ka,this.text_encoder=new TextEncoder}pre_tokenize_text(e,t){return this.add_prefix_space&&!e.startsWith(` `)&&(e=` `+e),(this.use_regex?e.match(this.pattern)||[]:[e]).map(e=>Array.from(this.text_encoder.encode(e),e=>this.byte_encoder[e]).join(``))}},Na=class extends Oa{pre_tokenize_text(e,t){return e.match(/\w+|[^\w\s]+/g)||[]}},Pa=class extends Oa{constructor(e){super(),this.replacement=e.replacement??`▁`,this.str_rep=e.str_rep||this.replacement,this.prepend_scheme=e.prepend_scheme??`always`}pre_tokenize_text(e,t){let{section_index:n=void 0}=t??{},r=e.replaceAll(` `,this.str_rep);return!r.startsWith(this.replacement)&&(this.prepend_scheme===`always`||this.prepend_scheme===`first`&&n===0)&&(r=this.str_rep+r),[r]}},Fa=class extends Oa{constructor(e){super(),this.config=e,this.pattern=mi(this.config.pattern??{},this.config.invert??!0)}pre_tokenize_text(e){return this.pattern===null?[]:this.config.invert?(e.match(this.pattern)||[]).filter(e=>e):this.config.behavior?.toLowerCase()===`removed`?e.split(this.pattern).filter(e=>e):sa(e,this.pattern)}},Ia=class extends Oa{constructor(e){super(),this.config=e,this.pattern=RegExp(`[^${ja}]+|[${ja}]+`,`gu`)}pre_tokenize_text(e){return e.match(this.pattern)||[]}},La=class extends Oa{constructor(e){super(),this.config=e;let t=`[^\\d]+|\\d${this.config.individual_digits?``:`+`}`;this.pattern=new RegExp(t,`gu`)}pre_tokenize_text(e){return e.match(this.pattern)||[]}},Ra=class extends Oa{constructor(){super(),this.pattern=RegExp(`[^\\s${ja}]+|[${ja}]`,`gu`)}pre_tokenize_text(e,t){return e.trim().match(this.pattern)||[]}},za=class extends Oa{constructor(e){super(),this.config=e,this.pattern=mi(this.config.pattern??{}),this.content=this.config.content??``}pre_tokenize_text(e){return this.pattern===null?[e]:[e.replaceAll(this.pattern,this.config.content??``)]}},Ba=class extends Oa{constructor(e){super(),this.tokenizers=(e.pretokenizers??[]).map(e=>Wa(e))}pre_tokenize_text(e,t){return this.tokenizers.reduce((e,n)=>n?n.pre_tokenize(e,t):e,[e])}},Va=class extends Oa{pre_tokenize_text(e){return ua(e)}},Ha=class extends Oa{constructor(e){super(),this.config=e,this._length=e.length}pre_tokenize_text(e){let t=[];for(let n=0;nthis.max_input_chars_per_word){t.push(this.unk_token);continue}let r=!1,i=0,a=[];for(;i0&&(r=this.config.continuing_subword_prefix+r),this.tokens_to_ids.has(r)){n=r;break}--t}if(n===null){r=!0;break}a.push(n),i=t}r?t.push(this.unk_token):t.push(...a)}return t}},qa=class e{constructor(e,t){this.is_leaf=e,this.children=t}static default(){return new e(!1,/* @__PURE__ */ new Map)}},Ja=class{constructor(){this.root=qa.default()}extend(e){for(let t of e)this.push(t)}push(e){let t=this.root;for(let n of e){let e=t.children.get(n);e===void 0&&(e=qa.default(),t.children.set(n,e)),t=e}t.is_leaf=!0}*common_prefix_search(e,t=0){let n=this.root;if(n===void 0)return;let r=``;for(let i=t;i[]),this.end_nodes=Array.from({length:this.len+1},()=>[]);let r=new Ya(this.bos_token_id??0,0,0,0,0),i=new Ya(this.eos_token_id??0,1,this.len,0,0);this.nodes.push(r.clone()),this.nodes.push(i.clone()),this.begin_nodes[this.len].push(i),this.end_nodes[0].push(r)}insert(e,t,n,r){let i=this.nodes.length,a=new Ya(r,i,e,t,n);this.begin_nodes[e].push(a),this.end_nodes[e+t].push(a),this.nodes.push(a)}viterbi(){let e=this.len,t=0;for(;t<=e;){if(this.begin_nodes[t].length==0)return[];for(let e of this.begin_nodes[t]){e.prev=null;let n=0,r=null;for(let i of this.end_nodes[t]){let t=i.backtrace_score+e.score;(r===null||t>n)&&(r=i.clone(),n=t)}if(r!==null)e.prev=r,e.backtrace_score=n;else return[]}++t}let n=[],r=this.begin_nodes[e][0].prev;if(r===null)return[];let i=r.clone();for(;i.prev!==null;)n.push(i.clone()),i=i.clone().prev.clone();return n.reverse(),n}piece(e){return this.chars.slice(e.pos,e.pos+e.length).join(``)}tokens(){return this.viterbi().map(e=>this.piece(e))}token_ids(){return this.viterbi().map(e=>e.token_id)}};function Za(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;r[e,t])),this.bos_token=` `,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=t,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.unk_token=this.vocab[this.unk_token_id],this.min_score=Za(this.scores)[0],this.unk_score=this.min_score-10,this.scores[this.unk_token_id]=this.unk_score,this.trie=new Ja,this.trie.extend(this.vocab),this.fuse_unk=!0}populate_nodes(e){let t=e.chars,n=0;for(;ne>t,t=1/0){this._heap=[],this._comparator=e,this._max_size=t}get size(){return this._heap.length}is_empty(){return this.size===0}peek(){return this._heap[0]}push(...e){return this.extend(e)}extend(e){for(let t of e)if(this.size0&&this._swap(0,t),this._heap.pop(),this._sift_down(),e}replace(e){let t=this.peek();return this._heap[0]=e,this._sift_down(),t}_parent(e){return(e+1>>>1)-1}_left(e){return(e<<1)+1}_right(e){return e+1<<1}_greater(e,t){return this._comparator(this._heap[e],this._heap[t])}_swap(e,t){let n=this._heap[e];this._heap[e]=this._heap[t],this._heap[t]=n}_sift_up(){this._sift_up_from(this.size-1)}_sift_up_from(e){for(;e>0&&this._greater(e,this._parent(e));)this._swap(e,this._parent(e)),e=this._parent(e)}_sift_down(){let e=0;for(;this._left(e)this.capacity&&this.cache.delete(this.cache.keys().next().value)}clear(){this.cache.clear()}},to=class extends Ga{constructor(e){super(e),this.tokens_to_ids=oa(e.vocab),this.unk_token_id=this.tokens_to_ids.get(e.unk_token),this.unk_token=e.unk_token,this.vocab=Array(this.tokens_to_ids.size);for(let[e,t]of this.tokens_to_ids)this.vocab[t]=e;let t=Array.isArray(e.merges[0]);this.merges=t?e.merges:e.merges.map(e=>e.split(` `,2)),this.bpe_ranks=new Map(this.merges.map((e,t)=>[JSON.stringify(e),t])),this.end_of_word_suffix=e.end_of_word_suffix,this.continuing_subword_suffix=e.continuing_subword_suffix??null,this.byte_fallback=this.config.byte_fallback??!1,this.byte_fallback&&(this.text_encoder=new TextEncoder),this.ignore_merges=this.config.ignore_merges??!1,this.max_length_to_cache=256,this.cache_capacity=1e4,this.cache=new eo(this.cache_capacity)}clear_cache(){this.cache.clear()}bpe(e){if(e.length===0)return[];let t=this.cache.get(e);if(t!==void 0)return t;let n=Array.from(e);this.end_of_word_suffix&&(n[n.length-1]+=this.end_of_word_suffix);let r=[];if(n.length>1){let e=new $a((e,t)=>e.score`<0x${e.toString(16).toUpperCase().padStart(2,`0`)}>`);e.every(e=>this.tokens_to_ids.has(e))?t.push(...e):this.unk_token!=null&&t.push(this.unk_token)}else this.unk_token!=null&&t.push(this.unk_token)}return t}},no=class extends Ga{constructor(e,t){super(e);let n=e.vocab;this.tokens_to_ids=oa(t.target_lang?n[t.target_lang]:n),this.bos_token=t.bos_token,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=t.eos_token,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.pad_token=t.pad_token,this.pad_token_id=this.tokens_to_ids.get(this.pad_token),this.unk_token=t.unk_token,this.unk_token_id=this.tokens_to_ids.get(this.unk_token),this.vocab=Array(this.tokens_to_ids.size);for(let[e,t]of this.tokens_to_ids)this.vocab[t]=e}encode(e){return e}};function ro(e,t){switch(e.type){case`WordPiece`:return new Ka(e);case`Unigram`:return new Qa(e,t.eos_token);case`BPE`:return new to(e);default:if(e.vocab)return Array.isArray(e.vocab)?new Qa(e,t.eos_token):Object.hasOwn(e,`continuing_subword_prefix`)&&Object.hasOwn(e,`unk_token`)?Object.hasOwn(e,`merges`)?new to(e):new Ka(e):new no(e,{target_lang:t.target_lang,bos_token:t.bos_token,eos_token:t.eos_token,pad_token:t.pad_token,unk_token:t.unk_token});throw Error(`Unknown TokenizerModel type: ${e?.type}`)}}var io=ro,ao=class extends da{constructor(e){super(),this.config=e}_call(e,...t){return this.post_process(e,...t)}},oo=class extends ao{post_process(e,t=null,n=!0){let r=t===null?this.config.single:this.config.pair,i=[],a=[];for(let o of r)`SpecialToken`in o?n&&(i.push(o.SpecialToken.id),a.push(o.SpecialToken.type_id)):`Sequence`in o&&(o.Sequence.id===`A`?(i=aa(i,e),a=aa(a,Array(e.length).fill(o.Sequence.type_id))):o.Sequence.id===`B`&&(i=aa(i,t),a=aa(a,Array(t.length).fill(o.Sequence.type_id))));return{tokens:i,token_type_ids:a}}},so=class extends ao{post_process(e,t=null){return{tokens:e,tokens_pair:t}}},co=class extends ao{constructor(e){super(e),this.sep=e.sep,this.cls=e.cls}post_process(e,t=null,n=!0){n&&(e=aa([this.cls[0]],e,[this.sep[0]]));let r=Array(e.length).fill(0);if(t){let i=[],a=n?[this.sep[0]]:[];e=aa(e,i,t,a),r=aa(r,Array(t.length+i.length+a.length).fill(1))}return{tokens:e,token_type_ids:r}}},lo=class extends ao{constructor(e){super(e),this.sep=e.sep,this.cls=e.cls}post_process(e,t,n=!0){n&&(e=aa([this.cls[0]],e,[this.sep[0]]));let r=Array(e.length).fill(0);if(t){let i=n?[this.sep[0]]:[],a=n?[this.sep[0]]:[];e=aa(e,i,t,a),r=aa(r,Array(t.length+i.length+a.length).fill(1))}return{tokens:e,token_type_ids:r}}},uo=class extends ao{constructor(e){super(e),this.processors=(e.processors??[]).map(e=>po(e))}post_process(e,t=null,n=!0){let r={tokens:e,tokens_pair:t};for(let e of this.processors)r=e.post_process(r.tokens,r.tokens_pair,n);return r}};function fo(e){if(e===null)return null;switch(e.type){case`TemplateProcessing`:return new oo(e);case`ByteLevel`:return new so(e);case`BertProcessing`:return new co(e);case`RobertaProcessing`:return new lo(e);case`Sequence`:return new uo(e);default:throw Error(`Unknown PostProcessor type: ${e.type}`)}}var po=fo,mo=class extends da{constructor(e){super(),this.config=e,this.added_tokens=[],this.end_of_word_suffix=null,this.trim_offsets=`trim_offsets`in e&&e.trim_offsets}_call(e){return this.decode(e)}decode(e){return this.decode_chain(e).join(``)}},ho=class extends mo{constructor(e){super(e),this.byte_decoder=Aa,this.text_decoder=new TextDecoder(`utf-8`,{fatal:!1,ignoreBOM:!0}),this.end_of_word_suffix=null}convert_tokens_to_string(e){let t=e.join(``),n=new Uint8Array([...t].map(e=>this.byte_decoder[e]));return this.text_decoder.decode(n)}decode_chain(e){let t=[],n=[];for(let r of e)this.added_tokens.find(e=>e.content===r)===void 0?n.push(r):(n.length>0&&(t.push(this.convert_tokens_to_string(n)),n=[]),t.push(r));return n.length>0&&t.push(this.convert_tokens_to_string(n)),t}},go=class extends mo{constructor(e){super(e),this.cleanup=e.cleanup}decode_chain(e){return e.map((e,t)=>{if(t!==0){let t=this.config.prefix;e=t&&e.startsWith(t)?e.replace(t,``):` `+e}return this.cleanup&&(e=pi(e)),e})}},_o=class extends mo{constructor(e){super(e),this.replacement=e.replacement??`▁`}decode_chain(e){let t=[];for(let n=0;nt.replaceAll(this.suffix,n===e.length-1?``:` `))}},yo=class extends mo{constructor(e){super(e),this.pad_token=e.pad_token??``,this.word_delimiter_token=e.word_delimiter_token??``,this.cleanup=e.cleanup}convert_tokens_to_string(e){if(e.length===0)return``;let t=[e[0]];for(let n=1;ne!==this.pad_token).join(``);return this.cleanup&&(n=pi(n).replaceAll(this.word_delimiter_token,` `).trim()),n}decode_chain(e){return[this.convert_tokens_to_string(e)]}},bo=class extends mo{constructor(e){super(e),this.decoders=(e.decoders??[]).map(e=>Eo(e))}decode_chain(e){return this.decoders.reduce((e,t)=>t.decode_chain(e),e)}},xo=class extends mo{constructor(e){super(e),this.pattern=mi(this.config.pattern)}decode_chain(e){let t=this.config.content??``,n=this.pattern;return n===null?e:e.map(e=>e.replaceAll(n,t))}},So=class extends mo{decode_chain(e){return[e.join(``)]}},Co=class extends mo{constructor(e){super(e),this.content=e.content??``,this.start=e.start??0,this.stop=e.stop??0}decode_chain(e){return e.map(e=>{let t=0;for(let n=0;n`)){let t=parseInt(r.slice(3,5),16);isNaN(t)||(e=t)}if(e!==null)n.push(e);else{if(n.length>0){let e=this.text_decoder.decode(Uint8Array.from(n));t.push(e),n=[]}t.push(r)}}if(n.length>0){let e=this.text_decoder.decode(Uint8Array.from(n));t.push(e),n=[]}return t}};function To(e){if(e===null)return null;switch(e.type){case`ByteLevel`:return new ho(e);case`WordPiece`:return new go(e);case`Metaspace`:return new _o(e);case`BPEDecoder`:return new vo(e);case`CTC`:return new yo(e);case`Sequence`:return new bo(e);case`Replace`:return new xo(e);case`Fuse`:return new So(e);case`Strip`:return new Co(e);case`ByteFallback`:return new wo(e);default:throw Error(`Unknown Decoder type: ${e.type}`)}}var Eo=To,Do=class{constructor(e,t){let n=la(e,`Tokenizer`,[`model`,`decoder`,`post_processor`,`pre_tokenizer`,`normalizer`]);if(n)throw Error(n);let r=la(t,`Config`);if(r)throw Error(r);this.tokenizer=e,this.config=t,this.normalizer=Da(this.tokenizer.normalizer),this.pre_tokenizer=Wa(this.tokenizer.pre_tokenizer),this.model=io(this.tokenizer.model,this.config),this.post_processor=po(this.tokenizer.post_processor),this.decoder=Eo(this.tokenizer.decoder),this.special_tokens=[],this.all_special_ids=[],this.added_tokens=[];let i=[],a=[];this.added_tokens_map=/* @__PURE__ */ new Map;for(let e of this.tokenizer.added_tokens){let t=new di(e);if(this.added_tokens.push(t),this.model.tokens_to_ids.set(t.content,t.id),this.model.vocab[t.id]=t.content,t.special&&(this.special_tokens.push(t.content),this.all_special_ids.push(t.id)),this.added_tokens_map.set(t.content,t),t.normalized&&this.normalizer!==null){let e=this.normalizer(t.content);a.push(e),this.added_tokens_map.set(e,t)}else i.push(t.content)}(this.config.additional_special_tokens??[]).forEach(e=>{this.special_tokens.includes(e)||this.special_tokens.push(e)}),this.decoder&&(this.decoder.added_tokens=this.added_tokens,this.decoder.end_of_word_suffix=this.model.end_of_word_suffix),this.splitter_unnormalized=new ui(i),this.splitter_normalized=new ui(a),this.remove_space=this.config.remove_space,this.clean_up_tokenization_spaces=this.config.clean_up_tokenization_spaces??!0,this.do_lowercase_and_remove_accent=this.config.do_lowercase_and_remove_accent??!1}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{tokens:i,token_type_ids:a}=this.tokenize_helper(e,{text_pair:t,add_special_tokens:n}),o=i.map(e=>this.added_tokens_map.get(e)?.id??this.model.tokens_to_ids.get(e)??this.model.unk_token_id),s={ids:o,tokens:i,attention_mask:Array(o.length).fill(1)};return r&&a&&(s.token_type_ids=a),s}decode(e,t={}){if(!Array.isArray(e)||e.length===0||!na(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);let n=e.map(e=>this.model.vocab[Number(e)]??this.model.unk_token);t.skip_special_tokens&&(n=n.filter(e=>!this.special_tokens.includes(e)));let r=this.decoder?this.decoder(n):n.join(` `);return this.decoder&&this.decoder.end_of_word_suffix&&(r=r.replaceAll(this.decoder.end_of_word_suffix,` `),t.skip_special_tokens&&(r=r.trim())),(t.clean_up_tokenization_spaces??this.clean_up_tokenization_spaces)&&(r=pi(r)),r}tokenize(e,{text_pair:t=null,add_special_tokens:n=!1}={}){return this.tokenize_helper(e,{text_pair:t,add_special_tokens:n}).tokens}encode_text(e){if(e===null)return null;let t=this.splitter_unnormalized.split(e);return t.forEach((e,n)=>{let r=this.added_tokens_map.get(e);r&&(r.lstrip&&n>0&&(t[n-1]=t[n-1].trimEnd()),r.rstrip&&n{if(e.length===0)return[];if(this.added_tokens_map.has(e))return[e];if(this.remove_space===!0&&(e=e.trim().split(/\s+/).join(` `)),this.do_lowercase_and_remove_accent&&(e=ia(e)),this.normalizer!==null&&(e=this.normalizer(e)),e.length===0)return[];let n=this.splitter_normalized.split(e);return n.forEach((e,t)=>{let r=this.added_tokens_map.get(e);r&&(r.lstrip&&t>0&&(n[t-1]=n[t-1].trimEnd()),r.rstrip&&t{if(e.length===0)return[];if(this.added_tokens_map.has(e))return[e];let n=this.pre_tokenizer===null?[e]:this.pre_tokenizer(e,{section_index:t});return this.model(n)})})}tokenize_helper(e,{text_pair:t=null,add_special_tokens:n=!0}){let r=this.encode_text(e),i=this.encode_text(t||null);return this.post_processor?this.post_processor(r,i,n):{tokens:aa(r??[],i??[])}}token_to_id(e){return this.model.tokens_to_ids.get(e)}id_to_token(e){return this.model.vocab[e]}get_added_tokens_decoder(){let e=/* @__PURE__ */ new Map;for(let t of this.added_tokens)e.set(t.id,t);return e}get_vocab(e=!0){let t=/* @__PURE__ */ new Map;for(let n=0;nt in e?Oo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ao=(e,t,n)=>(ko(e,typeof t==`symbol`?t:t+``,n),n),j=Object.freeze({Text:`Text`,NumericLiteral:`NumericLiteral`,StringLiteral:`StringLiteral`,Identifier:`Identifier`,Equals:`Equals`,OpenParen:`OpenParen`,CloseParen:`CloseParen`,OpenStatement:`OpenStatement`,CloseStatement:`CloseStatement`,OpenExpression:`OpenExpression`,CloseExpression:`CloseExpression`,OpenSquareBracket:`OpenSquareBracket`,CloseSquareBracket:`CloseSquareBracket`,OpenCurlyBracket:`OpenCurlyBracket`,CloseCurlyBracket:`CloseCurlyBracket`,Comma:`Comma`,Dot:`Dot`,Colon:`Colon`,Pipe:`Pipe`,CallOperator:`CallOperator`,AdditiveBinaryOperator:`AdditiveBinaryOperator`,MultiplicativeBinaryOperator:`MultiplicativeBinaryOperator`,ExponentiationBinaryOperator:`ExponentiationBinaryOperator`,ComparisonBinaryOperator:`ComparisonBinaryOperator`,UnaryOperator:`UnaryOperator`,Comment:`Comment`}),jo=class{constructor(e,t){this.value=e,this.type=t}};function Mo(e){return/\w/.test(e)}function No(e){return/[0-9]/.test(e)}function Po(e){return/\s/.test(e)}var Fo=[[`{%`,j.OpenStatement],[`%}`,j.CloseStatement],[`{{`,j.OpenExpression],[`}}`,j.CloseExpression],[`(`,j.OpenParen],[`)`,j.CloseParen],[`{`,j.OpenCurlyBracket],[`}`,j.CloseCurlyBracket],[`[`,j.OpenSquareBracket],[`]`,j.CloseSquareBracket],[`,`,j.Comma],[`.`,j.Dot],[`:`,j.Colon],[`|`,j.Pipe],[`<=`,j.ComparisonBinaryOperator],[`>=`,j.ComparisonBinaryOperator],[`==`,j.ComparisonBinaryOperator],[`!=`,j.ComparisonBinaryOperator],[`<`,j.ComparisonBinaryOperator],[`>`,j.ComparisonBinaryOperator],[`+`,j.AdditiveBinaryOperator],[`-`,j.AdditiveBinaryOperator],[`~`,j.AdditiveBinaryOperator],[`**`,j.ExponentiationBinaryOperator],[`*`,j.MultiplicativeBinaryOperator],[`//`,j.MultiplicativeBinaryOperator],[`/`,j.MultiplicativeBinaryOperator],[`%`,j.MultiplicativeBinaryOperator],[`=`,j.Equals]],Io=/* @__PURE__ */ new Map([[`n`,` -`],[`t`,` `],[`r`,`\r`],[`b`,`\b`],[`f`,`\f`],[`v`,`\v`],[`'`,`'`],[`"`,`"`],[`\\`,`\\`]]);function Lo(e,t={}){return e.endsWith(` -`)&&(e=e.slice(0,-1)),t.lstrip_blocks&&(e=e.replace(/^[ \t]*({[#%-])/gm,`$1`)),t.trim_blocks&&(e=e.replace(/([#%-]})\n/g,`$1`)),e.replace(/(\s*){%(-?)\s*(?:end)?generation\s*(-?)%}(\s*)/gs,(e,t,n,r,i)=>(n?``:t)+(r?``:i))}function Ro(e,t={}){let n=[],r=Lo(e,t),i=0,a=0,o=e=>{let t=``;for(;e(r[i]);){if(r[i]===`\\`){if(++i,i>=r.length)throw SyntaxError(`Unexpected end of input`);let e=r[i++],n=Io.get(e);if(n===void 0)throw SyntaxError(`Unexpected escaped character: ${e}`);t+=n;continue}if(t+=r[i++],i>=r.length)throw SyntaxError(`Unexpected end of input`)}return t},s=()=>{let e=n.at(-1);e&&e.type===j.Text&&(e.value=e.value.trimEnd(),e.value===``&&n.pop())},c=()=>{for(;i0){n.push(new jo(e,j.Text));continue}}if(r[i]===`{`&&r[i+1]===`#`){i+=2;let e=r[i]===`-`;e&&++i;let t=``;for(;r[i]!==`#`||r[i+1]!==`}`;){if(i+2>=r.length)throw SyntaxError(`Missing end of comment tag`);t+=r[i++]}let a=t.endsWith(`-`);a&&(t=t.slice(0,-1)),e&&s(),n.push(new jo(t,j.Comment)),i+=2,a&&c();continue}if(r.slice(i,i+3)===`{%-`){s(),n.push(new jo(`{%`,j.OpenStatement)),i+=3;continue}if(r.slice(i,i+3)===`{{-`){s(),n.push(new jo(`{{`,j.OpenExpression)),a=0,i+=3;continue}if(o(Po),r.slice(i,i+3)===`-%}`){n.push(new jo(`%}`,j.CloseStatement)),i+=3,c();continue}if(r.slice(i,i+3)===`-}}`){n.push(new jo(`}}`,j.CloseExpression)),i+=3,c();continue}let t=r[i];if(t===`-`||t===`+`){let e=n.at(-1)?.type;if(e===j.Text||e===void 0)throw SyntaxError(`Unexpected character: ${t}`);switch(e){case j.Identifier:case j.NumericLiteral:case j.StringLiteral:case j.CloseParen:case j.CloseSquareBracket:break;default:{++i;let e=o(No);if(e.length>0&&r[i]===`.`&&No(r[i+1])){++i;let t=o(No);e=`${e}.${t}`}n.push(new jo(`${t}${e}`,e.length>0?j.NumericLiteral:j.UnaryOperator));continue}}}for(let[e,t]of Fo)if(!(e===`}}`&&a>0)&&r.slice(i,i+e.length)===e){n.push(new jo(e,t)),t===j.OpenExpression?a=0:t===j.OpenCurlyBracket?++a:t===j.CloseCurlyBracket&&--a,i+=e.length;continue main}if(t===`'`||t===`"`){++i;let e=o(e=>e!==t);n.push(new jo(e,j.StringLiteral)),++i;continue}if(No(t)){let e=o(No);if(n.at(-1)?.type!==j.Dot&&r[i]===`.`&&No(r[i+1])){++i;let t=o(No);e=`${e}.${t}`}n.push(new jo(e,j.NumericLiteral));continue}if(Mo(t)){let e=o(Mo);n.push(new jo(e,j.Identifier));continue}throw SyntaxError(`Unexpected character: ${t}`)}return n}var zo=class{type=`Statement`},Bo=class extends zo{constructor(e){super(),this.body=e}type=`Program`},Vo=class extends zo{constructor(e,t,n){super(),this.test=e,this.body=t,this.alternate=n}type=`If`},Ho=class extends zo{constructor(e,t,n,r){super(),this.loopvar=e,this.iterable=t,this.body=n,this.defaultBlock=r}type=`For`},Uo=class extends zo{type=`Break`},Wo=class extends zo{type=`Continue`},Go=class extends zo{constructor(e,t,n){super(),this.assignee=e,this.value=t,this.body=n}type=`Set`},Ko=class extends zo{constructor(e,t,n){super(),this.name=e,this.args=t,this.body=n}type=`Macro`},qo=class extends zo{constructor(e){super(),this.value=e}type=`Comment`},Jo=class extends zo{type=`Expression`},Yo=class extends Jo{constructor(e,t,n){super(),this.object=e,this.property=t,this.computed=n}type=`MemberExpression`},Xo=class extends Jo{constructor(e,t){super(),this.callee=e,this.args=t}type=`CallExpression`},Zo=class extends Jo{constructor(e){super(),this.value=e}type=`Identifier`},Qo=class extends Jo{constructor(e){super(),this.value=e}type=`Literal`},$o=class extends Qo{type=`IntegerLiteral`},es=class extends Qo{type=`FloatLiteral`},ts=class extends Qo{type=`StringLiteral`},ns=class extends Qo{type=`ArrayLiteral`},rs=class extends Qo{type=`TupleLiteral`},is=class extends Qo{type=`ObjectLiteral`},as=class extends Jo{constructor(e,t,n){super(),this.operator=e,this.left=t,this.right=n}type=`BinaryExpression`},os=class extends Jo{constructor(e,t){super(),this.operand=e,this.filter=t}type=`FilterExpression`},ss=class extends zo{constructor(e,t){super(),this.filter=e,this.body=t}type=`FilterStatement`},cs=class extends Jo{constructor(e,t){super(),this.lhs=e,this.test=t}type=`SelectExpression`},ls=class extends Jo{constructor(e,t,n){super(),this.operand=e,this.negate=t,this.test=n}type=`TestExpression`},us=class extends Jo{constructor(e,t){super(),this.operator=e,this.argument=t}type=`UnaryExpression`},ds=class extends Jo{constructor(e=void 0,t=void 0,n=void 0){super(),this.start=e,this.stop=t,this.step=n}type=`SliceExpression`},fs=class extends Jo{constructor(e,t){super(),this.key=e,this.value=t}type=`KeywordArgumentExpression`},ps=class extends Jo{constructor(e){super(),this.argument=e}type=`SpreadExpression`},ms=class extends Jo{constructor(e){super(),this.argument=e}type=`KeywordSpreadExpression`},hs=class extends zo{constructor(e,t,n){super(),this.call=e,this.callerArgs=t,this.body=n}type=`CallStatement`},gs=class extends Jo{constructor(e,t,n){super(),this.condition=e,this.trueExpr=t,this.falseExpr=n}type=`Ternary`};function _s(e){let t=new Bo([]),n=0;function r(t,r){let i=e[n++];if(!i||i.type!==t)throw Error(`Parser Error: ${r}. ${i.type} !== ${t}.`);return i}function i(e){if(!c(e))throw SyntaxError(`Expected ${e}`);++n}function a(){switch(e[n].type){case j.Comment:return new qo(e[n++].value);case j.Text:return l();case j.OpenStatement:return u();case j.OpenExpression:return d();default:throw SyntaxError(`Unexpected token type: ${e[n].type}`)}}function o(...t){return n+t.length<=e.length&&t.every((t,r)=>t===e[n+r].type)}function s(...t){return e[n]?.type===j.OpenStatement&&e[n+1]?.type===j.Identifier&&t.includes(e[n+1]?.value)}function c(...t){return n+t.length<=e.length&&t.every((t,r)=>e[n+r].type===`Identifier`&&t===e[n+r].value)}function l(){return new ts(r(j.Text,`Expected text token`).value)}function u(){if(r(j.OpenStatement,`Expected opening statement token`),e[n].type!==j.Identifier)throw SyntaxError(`Unknown statement, got ${e[n].type}`);let t=e[n].value,c;switch(t){case`set`:++n,c=f();break;case`if`:++n,c=p(),r(j.OpenStatement,`Expected {% token`),i(`endif`),r(j.CloseStatement,`Expected %} token`);break;case`macro`:++n,c=m(),r(j.OpenStatement,`Expected {% token`),i(`endmacro`),r(j.CloseStatement,`Expected %} token`);break;case`for`:++n,c=g(),r(j.OpenStatement,`Expected {% token`),i(`endfor`),r(j.CloseStatement,`Expected %} token`);break;case`call`:{++n;let e=null;o(j.OpenParen)&&(e=te(`parameters`));let t=ue();if(t.type!==`Identifier`)throw SyntaxError(`Expected identifier following call statement`);let l=te(`call`);r(j.CloseStatement,`Expected closing statement token`);let u=[];for(;!s(`endcall`);)u.push(a());r(j.OpenStatement,`Expected '{%'`),i(`endcall`),r(j.CloseStatement,`Expected closing statement token`),c=new hs(new Xo(t,l),e,u);break}case`break`:++n,r(j.CloseStatement,`Expected closing statement token`),c=new Uo;break;case`continue`:++n,r(j.CloseStatement,`Expected closing statement token`),c=new Wo;break;case`filter`:{++n;let e=ue();e instanceof Zo&&o(j.OpenParen)&&(e=w(e)),r(j.CloseStatement,`Expected closing statement token`);let t=[];for(;!s(`endfilter`);)t.push(a());r(j.OpenStatement,`Expected '{%'`),i(`endfilter`),r(j.CloseStatement,`Expected '%}'`),c=new ss(e,t);break}default:throw SyntaxError(`Unknown statement type: ${t}`)}return c}function d(){r(j.OpenExpression,`Expected opening expression token`);let e=_();return r(j.CloseExpression,`Expected closing expression token`),e}function f(){let e=h(),t=null,c=[];if(o(j.Equals))++n,t=h();else{for(r(j.CloseStatement,`Expected %} token`);!s(`endset`);)c.push(a());r(j.OpenStatement,`Expected {% token`),i(`endset`)}return r(j.CloseStatement,`Expected closing statement token`),new Go(e,t,c)}function p(){let e=_();r(j.CloseStatement,`Expected closing statement token`);let t=[],i=[];for(;!s(`elif`,`else`,`endif`);)t.push(a());if(s(`elif`)){++n,++n;let e=p();i.push(e)}else if(s(`else`))for(++n,++n,r(j.CloseStatement,`Expected closing statement token`);!s(`endif`);)i.push(a());return new Vo(e,t,i)}function m(){let e=ue();if(e.type!==`Identifier`)throw SyntaxError(`Expected identifier following macro statement`);let t=te(`parameters`);r(j.CloseStatement,`Expected closing statement token`);let n=[];for(;!s(`endmacro`);)n.push(a());return new Ko(e,t,n)}function h(e=!1){let t=e?ue:_,r=[t()],i=o(j.Comma);for(;i&&(++n,r.push(t()),o(j.Comma)););return i?new rs(r):r[0]}function g(){let e=h(!0);if(!(e instanceof Zo||e instanceof rs))throw SyntaxError(`Expected identifier/tuple for the loop variable, got ${e.type} instead`);if(!c(`in`))throw SyntaxError("Expected `in` keyword following loop variable");++n;let t=_();r(j.CloseStatement,`Expected closing statement token`);let i=[];for(;!s(`endfor`,`else`);)i.push(a());let o=[];if(s(`else`))for(++n,++n,r(j.CloseStatement,`Expected closing statement token`);!s(`endfor`);)o.push(a());return new Ho(e,t,i,o)}function _(){return v()}function v(){let e=y();if(c(`if`)){++n;let t=y();return c(`else`)?(++n,new gs(t,e,v())):new cs(e,t)}return e}function y(){let t=b();for(;c(`or`);){let r=e[n];++n;let i=b();t=new as(r,t,i)}return t}function b(){let t=x();for(;c(`and`);){let r=e[n];++n;let i=x();t=new as(r,t,i)}return t}function x(){let t;for(;c(`not`);){let r=e[n];++n,t=new us(r,x())}return t??S()}function S(){let t=C();for(;;){let r;if(c(`not`,`in`))r=new jo(`not in`,j.Identifier),n+=2;else if(c(`in`))r=e[n++];else if(o(j.ComparisonBinaryOperator))r=e[n++];else break;let i=C();t=new as(r,t,i)}return t}function C(){let t=ae();for(;o(j.AdditiveBinaryOperator);){let r=e[n];++n;let i=ae();t=new as(r,t,i)}return t}function ee(){let e=ie(ue());return o(j.OpenParen)?w(e):e}function w(e){let t=new Xo(e,te(`call`));return t=ie(t),o(j.OpenParen)&&(t=w(t)),t}function te(e){r(j.OpenParen,`Expected opening parenthesis for arguments list`);let t=ne(e);return r(j.CloseParen,`Expected closing parenthesis for arguments list`),t}function ne(t){let r=[],i=/* @__PURE__ */ new Set,a=!1,s=!1;for(;!o(j.CloseParen);){let c=o(j.ExponentiationBinaryOperator),l=o(j.MultiplicativeBinaryOperator)&&e[n].value===`*`;if(t===`parameters`&&(c||l))throw SyntaxError(`Argument unpacking is not allowed in parameter declarations`);if(c){if(++n,r.push(new ms(_())),o(j.Comma)&&++n,!o(j.CloseParen))throw SyntaxError("Expected closing parenthesis: `**` must be applied to the final argument");break}let u;if(l){if(s)throw SyntaxError("Only one `*` argument unpacking is allowed");s=!0,++n,u=new ps(_())}else{if(u=_(),o(j.Equals)){if(++n,!(u instanceof Zo))throw SyntaxError(t===`parameters`?`Expected identifier for parameter declaration`:`Expected identifier for keyword argument`);let e=_();u=new fs(u,e)}if(t===`parameters`){if(!(u instanceof Zo||u instanceof fs))throw SyntaxError(`Expected identifier for parameter declaration`);let e=u instanceof Zo?u.value:u.key.value;if(i.has(e))throw SyntaxError(`Duplicate parameter name: ${e}`);i.add(e)}if(u instanceof fs)a=!0;else if(a)throw SyntaxError(t===`call`?`Positional arguments must come before keyword arguments`:`Non-default argument follows default argument`);else if(s)throw SyntaxError("Positional arguments must not follow `*` argument unpacking")}r.push(u),o(j.Comma)&&++n}return r}function re(){let e=[],t=!1;for(;!o(j.CloseSquareBracket);)o(j.Colon)?(e.push(void 0),++n,t=!0):(e.push(_()),o(j.Colon)&&(++n,t=!0));if(e.length===0)throw SyntaxError(`Expected at least one argument for member/slice expression`);if(t){if(e.length>3)throw SyntaxError(`Expected 0-3 arguments for slice expression`);return new ds(...e)}return e[0]}function ie(t){for(;o(j.Dot)||o(j.OpenSquareBracket);){let i=e[n];++n;let a,o=i.type===j.OpenSquareBracket;if(o)a=re(),r(j.CloseSquareBracket,`Expected closing square bracket`);else if(a=ue(),a.type!==`Identifier`&&a.type!==`IntegerLiteral`)throw SyntaxError(`Expected identifier or integer following dot operator`);t=new Yo(t,a,o)}return t}function ae(){let t=oe();for(;o(j.MultiplicativeBinaryOperator);){let r=e[n++],i=oe();t=new as(r,t,i)}return t}function oe(){let t=se();for(;o(j.ExponentiationBinaryOperator);){let r=e[n++],i=se();t=new as(r,t,i)}return t}function se(){let e=ce();for(;c(`is`);){++n;let t=c(`not`);t&&++n;let r=ue();if(!(r instanceof Zo))throw SyntaxError(`Expected identifier for the test`);e=new ls(e,t,r)}return e}function ce(){let e=le();for(;o(j.Pipe);){++n;let t=ue();if(!(t instanceof Zo))throw SyntaxError(`Expected identifier for the filter`);o(j.OpenParen)&&(t=w(t)),e=new os(e,t)}return e}function le(){let t=e[n];if(t&&(t.type===j.UnaryOperator||t.type===j.AdditiveBinaryOperator)&&(t.value===`-`||t.value===`+`)){let t=e[n++];return new us(t,le())}return ee()}function ue(){let t=e[n++];switch(t.type){case j.NumericLiteral:{let e=t.value;return e.includes(`.`)?new es(Number(e)):new $o(Number(e))}case j.StringLiteral:{let r=t.value;for(;o(j.StringLiteral);)r+=e[n++].value;return new ts(r)}case j.Identifier:return new Zo(t.value);case j.OpenParen:{let e=h();return r(j.CloseParen,"Expected closing parenthesis, got ${tokens[current].type} instead."),e}case j.OpenSquareBracket:{let e=[];for(;!o(j.CloseSquareBracket);)e.push(_()),o(j.Comma)&&++n;return++n,new ns(e)}case j.OpenCurlyBracket:{let e=/* @__PURE__ */ new Map;for(;!o(j.CloseCurlyBracket);){let t=_();r(j.Colon,`Expected colon between key and value in object literal`);let i=_();e.set(t,i),o(j.Comma)&&++n}return++n,new is(e)}default:throw SyntaxError(`Unexpected token: ${t.type}`)}}for(;n0)for(let i=e;it;i+=n)r.push(i);return r}function ys(e,t,n,r=1){let i=Math.sign(r);i>=0?(t=(t??=0)<0?Math.max(e.length+t,0):Math.min(t,e.length),n=(n??=e.length)<0?Math.max(e.length+n,0):Math.min(n,e.length)):(t=(t??=e.length-1)<0?Math.max(e.length+t,-1):Math.min(t,e.length-1),n=(n??=-1)<-1?Math.max(e.length+n,-1):Math.min(n,e.length-1));let a=[];for(let o=t;i*oe.toUpperCase())}function xs(e){return Ss(/* @__PURE__ */ new Date,e)}function Ss(e,t){let n=new Intl.DateTimeFormat(void 0,{month:`long`}),r=new Intl.DateTimeFormat(void 0,{month:`short`}),i=e=>e<10?`0`+e:e.toString();return t.replace(/%[YmdbBHM%]/g,t=>{switch(t){case`%Y`:return e.getFullYear().toString();case`%m`:return i(e.getMonth()+1);case`%d`:return i(e.getDate());case`%b`:return r.format(e);case`%B`:return n.format(e);case`%H`:return i(e.getHours());case`%M`:return i(e.getMinutes());case`%%`:return`%`;default:return t}})}function Cs(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function ws(e,t,n,r){if(r===0)return e;let i=r==null||r<0?1/0:r,a=t.length===0?/* @__PURE__ */ RegExp(`(?=)`,`gu`):new RegExp(Cs(t),`gu`);return e.replaceAll(a,e=>i>0?(--i,n):e)}var Ts=class extends Error{},Es=class extends Error{},Ds=/* @__PURE__ */ new Map,Os=class{type=`RuntimeValue`;value;get builtins(){return Ds}constructor(e=void 0){this.value=e}__bool__(){return new F(!!this.value)}toString(){return String(this.value)}},M=class extends Os{type=`IntegerValue`},N=class extends Os{type=`FloatValue`;toString(){return Object.is(this.value,-0)?`-0.0`:this.value%1==0?this.value.toFixed(1):this.value.toString()}},P=class extends Os{type=`StringValue`;_builtins;get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`upper`,new L(()=>new P(this.value.toUpperCase()))],[`lower`,new L(()=>new P(this.value.toLowerCase()))],[`strip`,new L(()=>new P(this.value.trim()))],[`title`,new L(()=>new P(bs(this.value)))],[`capitalize`,new L(()=>new P(this.value.charAt(0).toUpperCase()+this.value.slice(1)))],[`length`,new M(this.value.length)],[`rstrip`,new L(()=>new P(this.value.trimEnd()))],[`lstrip`,new L(()=>new P(this.value.trimStart()))],[`startswith`,new L(e=>{if(e.length===0)throw Error(`startswith() requires at least one argument`);let t=e[0];if(t instanceof P)return new F(this.value.startsWith(t.value));if(t instanceof I){for(let e of t.value){if(!(e instanceof P))throw Error(`startswith() tuple elements must be strings`);if(this.value.startsWith(e.value))return new F(!0)}return new F(!1)}throw Error(`startswith() argument must be a string or tuple of strings`)})],[`endswith`,new L(e=>{if(e.length===0)throw Error(`endswith() requires at least one argument`);let t=e[0];if(t instanceof P)return new F(this.value.endsWith(t.value));if(t instanceof I){for(let e of t.value){if(!(e instanceof P))throw Error(`endswith() tuple elements must be strings`);if(this.value.endsWith(e.value))return new F(!0)}return new F(!1)}throw Error(`endswith() argument must be a string or tuple of strings`)})],[`split`,new L(e=>{let t=e[0]??new R;if(!(t instanceof P||t instanceof R))throw Error(`sep argument must be a string or null`);let n=e[1]??new M(-1);if(!(n instanceof M))throw Error(`maxsplit argument must be a number`);let r=[];if(t instanceof R){let e=this.value.trimStart();for(let{0:t,index:i}of e.matchAll(/\S+/g)){if(n.value!==-1&&r.length>=n.value&&i!==void 0){r.push(t+e.slice(i+t.length));break}r.push(t)}}else{if(t.value===``)throw Error(`empty separator`);r=this.value.split(t.value),n.value!==-1&&r.length>n.value&&r.push(r.splice(n.value).join(t.value))}return new I(r.map(e=>new P(e)))})],[`replace`,new L(e=>{if(e.length<2)throw Error(`replace() requires at least two arguments`);let t=e[0],n=e[1];if(!(t instanceof P&&n instanceof P))throw Error(`replace() arguments must be strings`);let r;if(r=e.length>2?e[2].type===`KeywordArgumentsValue`?e[2].value.get(`count`)??new R:e[2]:new R,!(r instanceof M||r instanceof R))throw Error(`replace() count argument must be a number or null`);return new P(ws(this.value,t.value,n.value,r.value))})]])}},F=class extends Os{type=`BooleanValue`},ks=/[\x7f-\uffff]/g;function As(e){return e.replace(ks,e=>`\\u`+e.charCodeAt(0).toString(16).padStart(4,`0`))}function js(e,t={},n=0,r=!0){let{indent:i=null,ensureAscii:a=!1,separators:o=null,sortKeys:s=!1}=t,c,l;switch(o?[c,l]=o:i?(c=`,`,l=`: `):(c=`, `,l=`: `),e.type){case`NullValue`:return`null`;case`UndefinedValue`:return r?`null`:`undefined`;case`IntegerValue`:case`FloatValue`:case`BooleanValue`:return JSON.stringify(e.value);case`StringValue`:{let t=JSON.stringify(e.value);return a&&(t=As(t)),t}case`ArrayValue`:case`NamespaceValue`:case`ObjectValue`:{let o=i?` `.repeat(i):``,u=` -`+o.repeat(n),d=u+o;if(e.type===`ArrayValue`){let a=e.value.map(e=>js(e,t,n+1,r));return i?`[${d}${a.join(`${c}${d}`)}${u}]`:`[${a.join(c)}]`}{let o=Array.from(e.value.entries());s&&(o=o.sort(([e],[t])=>e.localeCompare(t)));let f=o.map(([e,o])=>{let s=JSON.stringify(e);a&&(s=As(s));let c=`${s}${l}${js(o,t,n+1,r)}`;return i?`${d}${c}`:c});return i?`{${f.join(c)}${u}}`:`{${f.join(c)}}`}}default:throw Error(`Cannot convert to JSON: ${e.type}`)}}var Ms=class extends Os{type=`ObjectValue`;_builtins;__bool__(){return new F(this.value.size>0)}get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`get`,new L(([e,t])=>{if(!(e instanceof P))throw Error(`Object key must be a string: got ${e.type}`);return this.value.get(e.value)??t??new R})],[`items`,new L(()=>this.items())],[`keys`,new L(()=>this.keys())],[`values`,new L(()=>this.values())],[`dictsort`,new L(e=>{let t=/* @__PURE__ */ new Map,n=e.filter(e=>e instanceof Ns?(t=e.value,!1):!0),r=n.at(0)??t.get(`case_sensitive`)??new F(!1);if(!(r instanceof F))throw Error(`case_sensitive must be a boolean`);let i=n.at(1)??t.get(`by`)??new P(`key`);if(!(i instanceof P))throw Error(`by must be a string`);if(![`key`,`value`].includes(i.value))throw Error(`by must be either 'key' or 'value'`);let a=n.at(2)??t.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);return new I(Array.from(this.value.entries()).map(([e,t])=>new I([new P(e),t])).sort((e,t)=>{let n=i.value===`key`?0:1,o=e.value[n],s=t.value[n],c=Ws(o,s,r.value);return a.value?-c:c}))})]])}items(){return new I(Array.from(this.value.entries()).map(([e,t])=>new I([new P(e),t])))}keys(){return new I(Array.from(this.value.keys()).map(e=>new P(e)))}values(){return new I(Array.from(this.value.values()))}toString(){return js(this,{},0,!1)}},Ns=class extends Ms{type=`KeywordArgumentsValue`},Ps=class extends Os{type=`NamespaceValue`;toString(){return js(this,{},0,!1)}},I=class extends Os{type=`ArrayValue`;_builtins;get builtins(){return this._builtins??=/* @__PURE__ */ new Map([[`length`,new M(this.value.length)]])}__bool__(){return new F(this.value.length>0)}toString(){return js(this,{},0,!1)}},Fs=class extends I{type=`TupleValue`},L=class extends Os{type=`FunctionValue`},R=class extends Os{type=`NullValue`},z=class extends Os{type=`UndefinedValue`};function Is(e){let t;if(e instanceof I?t=e.value:e instanceof P&&(t=Array.from(e.value,e=>new P(e))),!t||t.length!==2)throw Error(`namespace expected an object or an iterable of [key, value] pairs`);let[n,r]=t;if(!(n instanceof P))throw Error(`namespace keys must be strings`);return[n,r]}var Ls=class{constructor(e){this.parent=e}variables=/* @__PURE__ */ new Map([[`namespace`,new L(e=>{let t=e.slice(),n;if(t.at(-1)instanceof Ns&&(n=t.pop()),t.length>1)throw Error(`namespace expected at most 1 argument, got ${t.length}`);let r=/* @__PURE__ */ new Map;if(t.length===1){let e=t[0];if(e instanceof Ms)for(let[t,n]of e.value)r.set(t,n);else if(e instanceof I)for(let t of e.value){let[e,n]=Is(t);r.set(e.value,n)}else throw Error(`'${e.type}' object is not iterable`)}if(n)for(let[e,t]of n.value)r.set(e,t);return new Ps(r)})]]);tests=Ls.TESTS;set(e,t){return this.declareVariable(e,Ys(t))}declareVariable(e,t){if(this.variables.has(e))throw SyntaxError(`Variable already declared: ${e}`);return this.variables.set(e,t),t}setVariable(e,t){return this.variables.set(e,t),t}resolve(e){if(this.variables.has(e))return this;if(this.parent)return this.parent.resolve(e);throw Error(`Unknown variable: ${e}`)}lookupVariable(e){try{return this.resolve(e).variables.get(e)??new z}catch{return new z}}},Rs=Ls;Ao(Rs,`TESTS`,/* @__PURE__ */ new Map([[`boolean`,e=>e.type===`BooleanValue`],[`callable`,e=>e instanceof L],[`odd`,e=>{if(!(e instanceof M))throw Error(`cannot odd on ${e.type}`);return e.value%2!=0}],[`even`,e=>{if(!(e instanceof M))throw Error(`cannot even on ${e.type}`);return e.value%2==0}],[`false`,e=>e.type===`BooleanValue`&&!e.value],[`true`,e=>e.type===`BooleanValue`&&e.value],[`none`,e=>e.type===`NullValue`],[`string`,e=>e.type===`StringValue`],[`number`,e=>e instanceof M||e instanceof N],[`integer`,e=>e instanceof M],[`iterable`,e=>e.type===`ArrayValue`||e.type===`StringValue`],[`mapping`,e=>e instanceof Ms],[`sequence`,e=>e instanceof I||e instanceof Ms||e instanceof P],[`lower`,e=>{let t=e.value;return e.type===`StringValue`&&t===t.toLowerCase()}],[`upper`,e=>{let t=e.value;return e.type===`StringValue`&&t===t.toUpperCase()}],[`none`,e=>e.type===`NullValue`],[`defined`,e=>e.type!==`UndefinedValue`],[`undefined`,e=>e.type===`UndefinedValue`],[`equalto`,(e,t)=>e.value===t.value],[`eq`,(e,t)=>e.value===t.value]]));function zs(e){e.set(`false`,!1),e.set(`true`,!0),e.set(`none`,null),e.set(`raise_exception`,e=>{throw Error(e)}),e.set(`range`,vs),e.set(`strftime_now`,xs),e.set(`True`,!0),e.set(`False`,!1),e.set(`None`,null)}function Bs(e){return e instanceof Ms||e instanceof Ps}function Vs(e){return e instanceof M||e instanceof N||e instanceof F}function Hs(e){return e instanceof F?Number(e.value):e.value}function Us(e,t){let n=t.split(`.`),r=e;for(let e of n)if(Bs(r))r=r.value.get(e)??new z;else if(r instanceof I){let t=parseInt(e,10);if(!isNaN(t)&&t>=0&&tr)}if(e.type!==t.type)throw Error(`Cannot compare different types: ${e.type} and ${t.type}`);switch(e.type){case`StringValue`:{let r=e.value,i=t.value;return n||(r=r.toLowerCase(),i=i.toLowerCase()),ri)}default:throw Error(`Cannot compare type: ${e.type}`)}}function Gs(e){if(e.type===`Identifier`)return{name:e.value};let t=e;return{name:t.key.value,defaultValue:t.value}}function Ks(e){return e===`kwargs`||e===`varargs`}function qs(e,t){let n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set,i=e=>{Ks(e)&&n.add(e)},a=e=>{if(e.type===`Identifier`)i(e.value);else if(e.type===`TupleLiteral`)for(let t of e.value)a(t)},o=e=>{i(Gs(e).name)},s=e=>{for(let t of e){let e=Gs(t);e.defaultValue&&l(e.defaultValue)}},c=e=>{e.type===`CallExpression`&&l(e.args)},l=e=>{if(Array.isArray(e)){for(let t of e)l(t);return}if(e instanceof Map){for(let[t,n]of e)l(t),l(n);return}if(e instanceof zo)switch(e.type){case`For`:{let t=e;if(a(t.loopvar),t.iterable.type===`SelectExpression`){let e=t.iterable;l(e.lhs),l(t.body),l(t.defaultBlock),l(e.test);return}l(t.iterable),l(t.body),l(t.defaultBlock);return}case`Set`:{let t=e;a(t.assignee),l(t.value),l(t.body);return}case`Macro`:{let t=e;for(let e of t.args)o(e);s(t.args),l(t.body);return}case`CallStatement`:{let t=e;l(t.call);for(let e of t.callerArgs??[])o(e);s(t.callerArgs??[]),l(t.body);return}case`FilterStatement`:{let t=e;l(t.body),c(t.filter);return}case`Identifier`:{let t=e.value;Ks(t)&&!n.has(t)&&r.add(t);return}case`MemberExpression`:{let t=e;l(t.object),t.computed&&l(t.property);return}case`FilterExpression`:{let t=e;l(t.operand),c(t.filter);return}case`TestExpression`:l(e.operand);return;case`SelectExpression`:{let t=e;l(t.test),l(t.lhs);return}case`KeywordArgumentExpression`:l(e.value);return;default:for(let t of Object.values(e))l(t)}};for(let t of e)o(t);return l(t),r}var Js=class{global;constructor(e){this.global=e??new Rs}run(e){return this.evaluate(e,this.global)}evaluateBinaryExpression(e,t){let n=this.evaluate(e.left,t);switch(e.operator.value){case`and`:return n.__bool__().value?this.evaluate(e.right,t):n;case`or`:return n.__bool__().value?n:this.evaluate(e.right,t)}let r=this.evaluate(e.right,t);switch(e.operator.value){case`==`:return new F(n.value==r.value);case`!=`:return new F(n.value!=r.value)}if(n instanceof z||r instanceof z){if(r instanceof z&&[`in`,`not in`].includes(e.operator.value))return new F(e.operator.value===`not in`);throw Error(`Cannot perform operation ${e.operator.value} on undefined values`)}if(n instanceof R||r instanceof R)throw Error(`Cannot perform operation on null values`);if(e.operator.value===`~`)return new P(n.value.toString()+r.value.toString());if(e.operator.value===`**`&&Vs(n)&&Vs(r)){let e=Hs(n),t=Hs(r);if(e===0&&t<0)throw Error(`0.0 cannot be raised to a negative power`);let i=e**t;if(!Number.isFinite(i))throw Error(`Exponentiation result is not a finite real number`);return n instanceof N||r instanceof N||t<0?new N(i):new M(i)}if((n instanceof M||n instanceof N)&&(r instanceof M||r instanceof N)){let t=n.value,i=r.value;switch(e.operator.value){case`+`:case`-`:case`*`:{let a=e.operator.value===`+`?t+i:e.operator.value===`-`?t-i:t*i;return n instanceof N||r instanceof N?new N(a):new M(a)}case`/`:return new N(t/i);case`//`:{let e=Math.floor(t/i);return n instanceof N||r instanceof N?new N(e):new M(e)}case`%`:{let e=t%i;return n instanceof N||r instanceof N?new N(e):new M(e)}case`<`:return new F(t`:return new F(t>i);case`>=`:return new F(t>=i);case`<=`:return new F(t<=i)}}else if(n instanceof I&&r instanceof I)switch(e.operator.value){case`+`:return new I(n.value.concat(r.value))}else if(r instanceof I){let t=r.value.find(e=>e.value===n.value)!==void 0;switch(e.operator.value){case`in`:return new F(t);case`not in`:return new F(!t)}}if(n instanceof P||r instanceof P)switch(e.operator.value){case`+`:return new P(n.value.toString()+r.value.toString())}if(n instanceof P&&r instanceof P)switch(e.operator.value){case`in`:return new F(r.value.includes(n.value));case`not in`:return new F(!r.value.includes(n.value))}if(n instanceof P&&r instanceof Ms)switch(e.operator.value){case`in`:return new F(r.value.has(n.value));case`not in`:return new F(!r.value.has(n.value))}throw SyntaxError(`Unknown operator "${e.operator.value}" between ${n.type} and ${r.type}`)}evaluateArguments(e,t){let n=[],r=/* @__PURE__ */ new Map,i=(e,t)=>{if(r.has(e))throw Error(`Got multiple values for keyword argument '${e}'`);r.set(e,t)};for(let r of e)if(r.type===`SpreadExpression`){let e=r,i=this.evaluate(e.argument,t);if(!(i instanceof I))throw Error(`Cannot unpack non-iterable type: ${i.type}`);for(let e of i.value)n.push(e)}else r.type!==`KeywordArgumentExpression`&&r.type!==`KeywordSpreadExpression`&&n.push(this.evaluate(r,t));for(let n of e)if(n.type===`KeywordArgumentExpression`){let e=n;i(e.key.value,this.evaluate(e.value,t))}else if(n.type===`KeywordSpreadExpression`){let e=n,r=this.evaluate(e.argument,t);if(!(r instanceof Ms))throw Error(`Argument after ** must be a mapping, not ${r.type}`);for(let[e,t]of r.value)i(e,t)}return[n,r]}applyFilter(e,t,n){if(t.type===`Identifier`){let r=t;if(r.value===`safe`)return e;if(r.value===`tojson`)return new P(js(e,{}));if(e instanceof I)switch(r.value){case`list`:return e;case`first`:return e.value[0];case`last`:return e.value[e.value.length-1];case`length`:return new M(e.value.length);case`reverse`:return new I(e.value.slice().reverse());case`sort`:return new I(e.value.slice().sort((e,t)=>Ws(e,t,!1)));case`join`:return new P(e.value.map(e=>e.value).join(``));case`string`:return new P(js(e,{},0,!1));case`unique`:{let t=/* @__PURE__ */ new Set,n=[];for(let r of e.value)t.has(r.value)||(t.add(r.value),n.push(r));return new I(n)}default:throw Error(`Unknown ArrayValue filter: ${r.value}`)}else if(e instanceof P)switch(r.value){case`length`:case`upper`:case`lower`:case`title`:case`capitalize`:{let t=e.builtins.get(r.value);if(t instanceof L)return t.value([],n);if(t instanceof M)return t;throw Error(`Unknown StringValue filter: ${r.value}`)}case`trim`:return new P(e.value.trim());case`indent`:return new P(e.value.split(` -`).map((e,t)=>t===0||e.length===0?e:` `+e).join(` -`));case`join`:case`string`:return e;case`int`:{let t=parseInt(e.value,10);return new M(isNaN(t)?0:t)}case`float`:{let t=parseFloat(e.value);return new N(isNaN(t)?0:t)}default:throw Error(`Unknown StringValue filter: ${r.value}`)}else if(e instanceof M||e instanceof N)switch(r.value){case`abs`:return e instanceof M?new M(Math.abs(e.value)):new N(Math.abs(e.value));case`int`:return new M(Math.floor(e.value));case`float`:return new N(e.value);case`string`:return new P(e.toString());default:throw Error(`Unknown NumericValue filter: ${r.value}`)}else if(e instanceof Ms)switch(r.value){case`items`:return new I(Array.from(e.value.entries()).map(([e,t])=>new I([new P(e),t])));case`length`:return new M(e.value.size);default:{let t=e.builtins.get(r.value);if(t)return t instanceof L?t.value([],n):t;throw Error(`Unknown ObjectValue filter: ${r.value}`)}}else if(e instanceof F)switch(r.value){case`bool`:return new F(e.value);case`int`:return new M(+!!e.value);case`float`:return new N(+!!e.value);case`string`:return new P(e.value?`true`:`false`);default:throw Error(`Unknown BooleanValue filter: ${r.value}`)}throw Error(`Cannot apply filter "${r.value}" to type: ${e.type}`)}if(t.type===`CallExpression`){let r=t;if(r.callee.type!==`Identifier`)throw Error(`Unknown filter: ${r.callee.type}`);let i=r.callee.value;if(i===`tojson`){let[,t]=this.evaluateArguments(r.args,n),i=t.get(`indent`)??new R;if(!(i instanceof M||i instanceof R))throw Error(`If set, indent must be a number`);let a=t.get(`ensure_ascii`)??new F(!1);if(!(a instanceof F))throw Error(`If set, ensure_ascii must be a boolean`);let o=t.get(`sort_keys`)??new F(!1);if(!(o instanceof F))throw Error(`If set, sort_keys must be a boolean`);let s=t.get(`separators`)??new R,c=null;if(s instanceof I||s instanceof Fs){if(s.value.length!==2)throw Error(`separators must be a tuple of two strings`);let[e,t]=s.value;if(!(e instanceof P)||!(t instanceof P))throw Error(`separators must be a tuple of two strings`);c=[e.value,t.value]}else if(!(s instanceof R))throw Error(`If set, separators must be a tuple of two strings`);return new P(js(e,{indent:i.value,ensureAscii:a.value,sortKeys:o.value,separators:c}))}if(i===`join`){let t;if(e instanceof P)t=Array.from(e.value);else if(e instanceof I)t=e.value.map(e=>e.value);else throw Error(`Cannot apply filter "${i}" to type: ${e.type}`);let[a,o]=this.evaluateArguments(r.args,n),s=a.at(0)??o.get(`separator`)??new P(``);if(!(s instanceof P))throw Error(`separator must be a string`);return new P(t.join(s.value))}if(i===`int`||i===`float`){let[t,a]=this.evaluateArguments(r.args,n),o=t.at(0)??a.get(`default`)??(i===`int`?new M(0):new N(0));if(e instanceof P){let t=i===`int`?parseInt(e.value,10):parseFloat(e.value);return isNaN(t)?o:i===`int`?new M(t):new N(t)}if(e instanceof M||e instanceof N)return e;if(e instanceof F)return i===`int`?new M(+!!e.value):new N(+!!e.value);throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}if(i==="default"){let[t,i]=this.evaluateArguments(r.args,n),a=t[0]??new P(``),o=t[1]??i.get(`boolean`)??new F(!1);if(!(o instanceof F))throw Error("`default` filter flag must be a boolean");return e instanceof z||o.value&&!e.__bool__().value?a:e}if(e instanceof I){switch(i){case`sort`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`reverse`)??new F(!1);if(!(a instanceof F))throw Error(`reverse must be a boolean`);let o=t.at(1)??i.get(`case_sensitive`)??new F(!1);if(!(o instanceof F))throw Error(`case_sensitive must be a boolean`);let s=t.at(2)??i.get(`attribute`)??new R;if(!(s instanceof P||s instanceof M||s instanceof R))throw Error(`attribute must be a string, integer, or null`);let c=e=>s instanceof R?e:Us(e,s instanceof M?String(s.value):s.value);return new I(e.value.slice().sort((e,t)=>{let n=Ws(c(e),c(t),o.value);return a.value?-n:n}))}case`selectattr`:case`rejectattr`:{let t=i===`selectattr`;if(e.value.some(e=>!Bs(e)))throw Error(`\`${i}\` can only be applied to array of objects`);if(r.args.some(e=>e.type!==`StringLiteral`))throw Error(`arguments of \`${i}\` must be strings`);let[a,o,s]=r.args.map(e=>this.evaluate(e,n)),c;if(o){let e=n.tests.get(o.value);if(!e)throw Error(`Unknown test: ${o.value}`);c=e}else c=(...e)=>e[0].__bool__().value;return new I(e.value.filter(e=>{let n=e.value.get(a.value),r=n?c(n,s):!1;return t?r:!r}))}case`map`:{let[,t]=this.evaluateArguments(r.args,n);if(t.has(`attribute`)){let n=t.get(`attribute`);if(!(n instanceof P))throw Error(`attribute must be a string`);let r=t.get(`default`);return new I(e.value.map(e=>{if(!Bs(e))throw Error(`items in map must be an object`);let t=Us(e,n.value);return t instanceof z?r??new z:t}))}throw Error("`map` expressions without `attribute` set are not currently supported.")}}throw Error(`Unknown ArrayValue filter: ${i}`)}if(e instanceof P){switch(i){case`indent`:{let[t,i]=this.evaluateArguments(r.args,n),a=t.at(0)??i.get(`width`)??new M(4);if(!(a instanceof M))throw Error(`width must be a number`);let o=t.at(1)??i.get(`first`)??new F(!1),s=t.at(2)??i.get(`blank`)??new F(!1),c=e.value.split(` -`),l=` `.repeat(a.value);return new P(c.map((e,t)=>!o.value&&t===0||!s.value&&e.length===0?e:l+e).join(` -`))}case`replace`:{let t=e.builtins.get(`replace`);if(!(t instanceof L))throw Error(`replace filter not available`);let[i,a]=this.evaluateArguments(r.args,n);return t.value([...i,new Ns(a)],n)}}throw Error(`Unknown StringValue filter: ${i}`)}if(e instanceof Ms){let t=e.builtins.get(i);if(t&&t instanceof L){let[e,i]=this.evaluateArguments(r.args,n);return i.size>0&&e.push(new Ns(i)),t.value(e,n)}throw Error(`Unknown ObjectValue filter: ${i}`)}throw Error(`Cannot apply filter "${i}" to type: ${e.type}`)}throw Error(`Unknown filter: ${t.type}`)}evaluateFilterExpression(e,t){let n=this.evaluate(e.operand,t);return this.applyFilter(n,e.filter,t)}evaluateTestExpression(e,t){let n=this.evaluate(e.operand,t),r=t.tests.get(e.test.value);if(!r)throw Error(`Unknown test: ${e.test.value}`);let i=r(n);return new F(e.negate?!i:i)}evaluateSelectExpression(e,t){return this.evaluate(e.test,t).__bool__().value?this.evaluate(e.lhs,t):new z}evaluateUnaryExpression(e,t){let n=this.evaluate(e.argument,t);switch(e.operator.value){case`not`:return new F(!n.value);case`+`:case`-`:{let t=e.operator.value===`-`?-1:1;if(n instanceof M||n instanceof N||n instanceof F){let e=t*(n instanceof F?+!!n.value:n.value);return n instanceof N?new N(e):new M(e)}throw SyntaxError(`Unknown operator "${e.operator.value}" for ${n.type}`)}default:throw SyntaxError(`Unknown operator: ${e.operator.value}`)}}evaluateTernaryExpression(e,t){return this.evaluate(e.condition,t).__bool__().value?this.evaluate(e.trueExpr,t):this.evaluate(e.falseExpr,t)}evalProgram(e,t){return this.evaluateBlock(e.body,t)}evaluateBlock(e,t){let n=``;for(let r of e){let e=this.evaluate(r,t);e.type!==`NullValue`&&e.type!==`UndefinedValue`&&(n+=e.toString())}return new P(n)}evaluateIdentifier(e,t){return t.lookupVariable(e.value)}evaluateCallExpression(e,t){let[n,r]=this.evaluateArguments(e.args,t);r.size>0&&n.push(new Ns(r));let i=this.evaluate(e.callee,t);if(i.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${i.type}`);return i.value(n,t)}evaluateSliceExpression(e,t,n){if(!(e instanceof I||e instanceof P))throw Error(`Slice object must be an array or string`);let r=this.evaluate(t.start,n),i=this.evaluate(t.stop,n),a=this.evaluate(t.step,n);if(!(r instanceof M||r instanceof z))throw Error(`Slice start must be numeric or undefined`);if(!(i instanceof M||i instanceof z))throw Error(`Slice stop must be numeric or undefined`);if(!(a instanceof M||a instanceof z))throw Error(`Slice step must be numeric or undefined`);return e instanceof I?new I(ys(e.value,r.value,i.value,a.value)):new P(ys(Array.from(e.value),r.value,i.value,a.value).join(``))}evaluateMemberExpression(e,t){let n=this.evaluate(e.object,t),r;if(e.computed){if(e.property.type===`SliceExpression`)return this.evaluateSliceExpression(n,e.property,t);r=this.evaluate(e.property,t)}else r=e.property.type===`IntegerLiteral`?new M(e.property.value):new P(e.property.value);let i;if(Bs(n)){if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.value.get(r.value)??(n instanceof Ms?n.builtins.get(r.value):void 0)}else if(n instanceof I||n instanceof P){if(r instanceof M)i=n.value.at(r.value),n instanceof P&&(i=new P(n.value.at(r.value)));else if(r instanceof P)i=n.builtins.get(r.value);else throw Error(`Cannot access property with non-string/non-number: got ${r.type}`)}else{if(!(r instanceof P))throw Error(`Cannot access property with non-string: got ${r.type}`);i=n.builtins.get(r.value)}return i instanceof Os?i:new z}evaluateSet(e,t){let n=e.value?this.evaluate(e.value,t):this.evaluateBlock(e.body,t);if(e.assignee.type===`Identifier`){let r=e.assignee.value;t.setVariable(r,n)}else if(e.assignee.type===`TupleLiteral`){let r=e.assignee;if(!(n instanceof I))throw Error(`Cannot unpack non-iterable type in set: ${n.type}`);let i=n.value;if(i.length!==r.value.length)throw Error(`Too ${r.value.length>i.length?`few`:`many`} items to unpack in set`);for(let e=0;et.setVariable(e.loopvar.value,c);else if(e.loopvar.type===`TupleLiteral`){let t=e.loopvar;if(c.type!==`ArrayValue`)throw Error(`Cannot unpack non-iterable type: ${c.type}`);let n=c;if(t.value.length!==n.value.length)throw Error(`Too ${t.value.length>n.value.length?`few`:`many`} items to unpack`);l=e=>{for(let r=0;r0?a[t-1]:new z],[`nextitem`,t0)throw Error(`macro ${e} takes no keyword argument '${o.keys().next().value}'`);if(n.has(`varargs`))i.setVariable(`varargs`,new I(a.slice(t.length)));else if(a.length>t.length)throw Error(`macro ${e} takes not more than ${t.length} argument(s)`);for(let[e,t]of s)i.setVariable(e,this.evaluate(t,i))}evaluateMacro(e,t){let n=qs(e.args,e.body);return t.setVariable(e.name.value,new L((t,r)=>{let i=new Rs(r);return this.bindMacroArguments(`'${e.name.value}'`,e.args,n,t,i),this.evaluateBlock(e.body,i)})),new R}evaluateCallStatement(e,t){let n=e.callerArgs??[],r=qs(n,e.body),i=new L(i=>{let a=new Rs(t);return this.bindMacroArguments(`None`,n,r,i,a),this.evaluateBlock(e.body,a)}),[a,o]=this.evaluateArguments(e.call.args,t);a.push(new Ns(o));let s=this.evaluate(e.call.callee,t);if(s.type!==`FunctionValue`)throw Error(`Cannot call something that is not a function: got ${s.type}`);let c=new Rs(t);return c.setVariable(`caller`,i),s.value(a,c)}evaluateFilterStatement(e,t){let n=this.evaluateBlock(e.body,t);return this.applyFilter(n,e.filter,t)}evaluate(e,t){if(!e)return new z;switch(e.type){case`Program`:return this.evalProgram(e,t);case`Set`:return this.evaluateSet(e,t);case`If`:return this.evaluateIf(e,t);case`For`:return this.evaluateFor(e,t);case`Macro`:return this.evaluateMacro(e,t);case`CallStatement`:return this.evaluateCallStatement(e,t);case`Break`:throw new Ts;case`Continue`:throw new Es;case`IntegerLiteral`:return new M(e.value);case`FloatLiteral`:return new N(e.value);case`StringLiteral`:return new P(e.value);case`ArrayLiteral`:return new I(e.value.map(e=>this.evaluate(e,t)));case`TupleLiteral`:return new Fs(e.value.map(e=>this.evaluate(e,t)));case`ObjectLiteral`:{let n=/* @__PURE__ */ new Map;for(let[r,i]of e.value){let e=this.evaluate(r,t);if(!(e instanceof P))throw Error(`Object keys must be strings: got ${e.type}`);n.set(e.value,this.evaluate(i,t))}return new Ms(n)}case`Identifier`:return this.evaluateIdentifier(e,t);case`CallExpression`:return this.evaluateCallExpression(e,t);case`MemberExpression`:return this.evaluateMemberExpression(e,t);case`UnaryExpression`:return this.evaluateUnaryExpression(e,t);case`BinaryExpression`:return this.evaluateBinaryExpression(e,t);case`FilterExpression`:return this.evaluateFilterExpression(e,t);case`FilterStatement`:return this.evaluateFilterStatement(e,t);case`TestExpression`:return this.evaluateTestExpression(e,t);case`SelectExpression`:return this.evaluateSelectExpression(e,t);case`Ternary`:return this.evaluateTernaryExpression(e,t);case`Comment`:return new R;default:throw SyntaxError(`Unknown node type: ${e.type}`)}}};function Ys(e){switch(typeof e){case`number`:return Number.isInteger(e)?new M(e):new N(e);case`string`:return new P(e);case`boolean`:return new F(e);case`undefined`:return new z;case`object`:return e===null?new R:Array.isArray(e)?new I(e.map(Ys)):new Ms(new Map(Object.entries(e).map(([e,t])=>[e,Ys(t)])));case`function`:return new L((t,n)=>Ys(e(...t.map(e=>e.value))??null));default:throw Error(`Cannot convert to runtime value: ${e}`)}}var Xs=` -`,Zs=`{%- `,Qs=` -%}`,$s=Object.freeze({CONDITIONAL:0,LOGICAL_OR:1,LOGICAL_AND:2,LOGICAL_NOT:3,COMPARISON:4,ADDITIVE:5,MULTIPLICATIVE:6,EXPONENTIATION:7,TEST:8,FILTER:9,UNARY_SIGN:10,ATOM:11});function ec(e){switch(e.operator.type){case`ExponentiationBinaryOperator`:return $s.EXPONENTIATION;case`MultiplicativeBinaryOperator`:return $s.MULTIPLICATIVE;case`AdditiveBinaryOperator`:return $s.ADDITIVE;case`ComparisonBinaryOperator`:return $s.COMPARISON;case`Identifier`:return e.operator.value===`and`?$s.LOGICAL_AND:e.operator.value===`in`||e.operator.value===`not in`?$s.COMPARISON:$s.LOGICAL_OR}return $s.LOGICAL_OR}function tc(e){switch(e.type){case`SelectExpression`:case`Ternary`:return $s.CONDITIONAL;case`BinaryExpression`:return ec(e);case`UnaryExpression`:return e.operator.value===`not`?$s.LOGICAL_NOT:$s.UNARY_SIGN;case`TestExpression`:return $s.TEST;case`FilterExpression`:return $s.FILTER;default:return $s.ATOM}}function nc(e,t){let n=B(e);return tc(e)sc(e,t,n)).join(Xs)}function oc(e){return e.map(e=>B(e)).join(`, `)}function sc(e,t,n){let r=n.repeat(t);switch(e.type){case`Program`:return ac(e.body,t,n);case`If`:return cc(e,t,n);case`For`:return lc(e,t,n);case`Set`:return uc(e,t,n);case`Macro`:return dc(e,t,n);case`Break`:return r+ic(`break`);case`Continue`:return r+ic(`continue`);case`CallStatement`:return fc(e,t,n);case`FilterStatement`:return pc(e,t,n);case`Comment`:return r+`{# `+e.value+` #}`;default:return r+`{{- `+B(e)+` -}}`}}function cc(e,t,n){let r=n.repeat(t),i=[],a=e;for(;a&&(i.push({test:a.test,body:a.body}),a.alternate.length===1&&a.alternate[0].type===`If`);)a=a.alternate[0];let o=r+ic(`if`,B(i[0].test))+Xs+ac(i[0].body,t+1,n);for(let e=1;e0&&(o+=Xs+r+ic(`else`)+Xs+ac(a.alternate,t+1,n)),o+=Xs+r+ic(`endif`),o}function lc(e,t,n){let r=n.repeat(t),i=``;if(e.iterable.type===`SelectExpression`){let t=e.iterable;i=`${B(t.lhs)} if ${B(t.test)}`}else i=B(e.iterable);let a=r+ic(`for`,B(e.loopvar),`in`,i)+Xs+ac(e.body,t+1,n);return e.defaultBlock.length>0&&(a+=Xs+r+ic(`else`)+Xs+ac(e.defaultBlock,t+1,n)),a+=Xs+r+ic(`endfor`),a}function uc(e,t,n){let r=n.repeat(t),i=B(e.assignee),a=e.value?B(e.value):``,o=r+ic(`set`,`${i}${e.value?` = `+a:``}`);return e.body.length===0?o:o+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endset`)}function dc(e,t,n){let r=n.repeat(t),i=oc(e.args);return r+ic(`macro`,`${e.name.value}(${i})`)+Xs+ac(e.body,t+1,n)+Xs+r+ic(`endmacro`)}function fc(e,t,n){let r=n.repeat(t),i=e.callerArgs&&e.callerArgs.length>0?`(${oc(e.callerArgs)})`:``,a=B(e.call),o=r+ic(`call${i}`,a)+Xs;return o+=ac(e.body,t+1,n)+Xs,o+=r+ic(`endcall`),o}function pc(e,t,n){let r=n.repeat(t),i=r+ic(`filter`,e.filter.type===`Identifier`?e.filter.value:B(e.filter))+Xs;return i+=ac(e.body,t+1,n)+Xs,i+=r+ic(`endfilter`),i}function B(e){switch(e.type){case`SpreadExpression`:return`*${B(e.argument)}`;case`KeywordSpreadExpression`:return`**${B(e.argument)}`;case`Identifier`:return e.value;case`IntegerLiteral`:return`${e.value}`;case`FloatLiteral`:{let t=e.value;return Object.is(t,-0)?`-0.0`:t%1==0?t.toFixed(1):t.toString()}case`StringLiteral`:return JSON.stringify(e.value);case`BinaryExpression`:{let t=e,n=ec(t),r=nc(t.left,n),i=nc(t.right,n+1);return`${r} ${t.operator.value} ${i}`}case`UnaryExpression`:{let t=e,n=t.argument.type===`UnaryExpression`?tc(t):$s.ATOM;return t.operator.value+(t.operator.value===`not`?` `:``)+nc(t.argument,n)}case`CallExpression`:{let t=e,n=oc(t.args);return`${B(t.callee)}(${n})`}case`MemberExpression`:{let t=e,n=nc(t.object,$s.ATOM),r=B(t.property);return!t.computed&&t.property.type!==`Identifier`&&t.property.type!==`IntegerLiteral`&&(r=`(${r})`),t.computed?`${n}[${r}]`:`${n}.${r}`}case`FilterExpression`:{let t=e,n=nc(t.operand,$s.FILTER);return t.filter.type===`CallExpression`?`${n} | ${B(t.filter)}`:`${n} | ${t.filter.value}`}case`SelectExpression`:{let t=e;return`${nc(t.lhs,$s.LOGICAL_OR)} if ${nc(t.test,$s.LOGICAL_OR)}`}case`TestExpression`:{let t=e;return`${nc(t.operand,$s.TEST)} is${t.negate?` not`:``} ${t.test.value}`}case`ArrayLiteral`:case`TupleLiteral`:{let t=oc(e.value),n=e.type===`ArrayLiteral`?`[]`:`()`;return`${n[0]}${t}${n[1]}`}case`ObjectLiteral`:return`{${Array.from(e.value.entries()).map(([e,t])=>`${B(e)}: ${B(t)}`).join(`, `)}}`;case`SliceExpression`:{let t=e;return`${t.start?B(t.start):``}:${t.stop?B(t.stop):``}${t.step?`:${B(t.step)}`:``}`}case`KeywordArgumentExpression`:{let t=e;return`${t.key.value}=${B(t.value)}`}case`Ternary`:{let t=e;return`${nc(t.trueExpr,$s.LOGICAL_OR)} if ${nc(t.condition,$s.LOGICAL_OR)} else ${nc(t.falseExpr,$s.CONDITIONAL)}`}default:throw Error(`Unknown expression type: ${e.type}`)}}var mc=class{parsed;constructor(e){let t=Ro(e,{lstrip_blocks:!0,trim_blocks:!0});this.parsed=_s(t)}render(e){let t=new Rs;if(zs(t),e)for(let[n,r]of Object.entries(e))t.set(n,r);return new Js(t).run(this.parsed).value}format(e){return rc(this.parsed,e?.indent||` `)}},hc={txt:`text/plain`,html:`text/html`,css:`text/css`,js:`text/javascript`,json:`application/json`,png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`},gc=class e{constructor(e){if(this.filePath=e,this.headers=new Headers,this.exists=Cr.existsSync(e),this.exists){this.status=200,this.statusText=`OK`;let t=Cr.statSync(e);this.headers.set(`content-length`,t.size.toString()),this.updateContentType();let n=Cr.createReadStream(e);this.body=new ReadableStream({start(e){n.on(`data`,t=>e.enqueue(t)),n.on(`end`,()=>e.close()),n.on(`error`,t=>e.error(t))},cancel(){n.destroy()}})}else this.status=404,this.statusText=`Not Found`,this.body=null}updateContentType(){let e=this.filePath.toString().split(`.`).pop().toLowerCase();this.headers.set(`content-type`,hc[e]??`application/octet-stream`)}clone(){let t=new e(this.filePath);return t.exists=this.exists,t.status=this.status,t.statusText=this.statusText,t.headers=new Headers(this.headers),t}async arrayBuffer(){return(await Cr.promises.readFile(this.filePath)).buffer}async blob(){let e=await Cr.promises.readFile(this.filePath);return new Blob([e],{type:this.headers.get(`content-type`)})}async text(){return await Cr.promises.readFile(this.filePath,`utf8`)}async json(){return JSON.parse(await this.text())}},_c=class{constructor(e){this._mt=/* @__PURE__ */ new Uint32Array(624),this._idx=625,this._gauss_next=null,this._random_fn=this.random.bind(this),this.seed(e)}seed(e){if(e==null){if(O.IS_CRYPTO_AVAILABLE){let t=/* @__PURE__ */ new Uint32Array(1);crypto.getRandomValues(t),e=t[0]}else e=Date.now()>>>0}let t=this._mt,n=(e,t)=>Math.imul(e,t)>>>0,r=[];for(let t=e||0;t>0;t=Math.floor(t/4294967296))r.push(t&4294967295);r.length||r.push(0),t[0]=19650218;for(let e=1;e<624;++e)t[e]=n(1812433253,t[e-1]^t[e-1]>>>30)+e>>>0;let i=1,a=0;for(let e=Math.max(624,r.length);e>0;--e,++i,++a)i>=624&&(t[0]=t[623],i=1),a>=r.length&&(a=0),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1664525))+r[a]+a>>>0;for(let e=623;e>0;--e,++i)i>=624&&(t[0]=t[623],i=1),t[i]=(t[i]^n(t[i-1]^t[i-1]>>>30,1566083941))-i>>>0;t[0]=2147483648,this._idx=624,this._gauss_next=null}_int32(){let e=this._mt;if(this._idx>=624){for(let t=0;t<624;++t){let n=e[t]&2147483648|e[(t+1)%624]&2147483647;e[t]=(e[(t+397)%624]^n>>>1^(n&1?2567483615:0))>>>0}this._idx=0}let t=e[this._idx++];return t^=t>>>11,t^=t<<7&2636928640,t^=t<<15&4022730752,t^=t>>>18,t>>>0}random(){return((this._int32()>>>5)*67108864+(this._int32()>>>6))/9007199254740992}gauss(e=0,t=1){let n=this._gauss_next;if(this._gauss_next=null,n===null){let e=this.random()*2*Math.PI,t=Math.sqrt(-2*Math.log(1-this.random()));n=Math.cos(e)*t,this._gauss_next=Math.sin(e)*t}return e+n*t}shuffle(e){for(let t=e.length-1;t>0;--t){let n=32-Math.clz32(t+1),r=this._int32()>>>32-n;for(;r>t;)r=this._int32()>>>32-n;let i=e[t];e[t]=e[r],e[r]=i}}choices(e,t){return e[vc(this._random_fn,t)]}};function vc(e,t){let n=0;for(let e=0;evc(bc.random,e),Sc=new _c,Cc=class{constructor(e){this.path=e}async match(e){let t=new gc(wr.join(this.path,e));if(t.exists)return t}async put(e,t,n=void 0){let r=wr.join(this.path,e),i=r+`.tmp.${O.IS_PROCESS_AVAILABLE?process.pid:Date.now()}.${Sc._int32().toString(36)}`;try{let e=t.headers.get(`Content-Length`),a=parseInt(e??`0`),o=0;await Cr.promises.mkdir(wr.dirname(r),{recursive:!0});let s=Cr.createWriteStream(i),c=t.body.getReader();for(;;){let{done:e,value:t}=await c.read();if(e)break;await new Promise((e,n)=>{s.write(t,t=>{if(t){n(t);return}e()})}),o+=t.length;let r=a?o/a*100:0;n?.({progress:r,loaded:o,total:a})}await new Promise((e,t)=>{s.close(n=>n?t(n):e())}),await Cr.promises.rename(i,r)}catch(e){try{await Cr.promises.unlink(i)}catch{}throw e}}async delete(e){let t=wr.join(this.path,e);try{return await Cr.promises.unlink(t),!0}catch{return!1}}},wc={400:`Bad request error occurred while trying to load file`,401:`Unauthorized access to file`,403:`Forbidden access to file`,404:`Could not locate file`,408:`Request timeout error occurred while trying to load file`,500:`Internal server error error occurred while trying to load file`,502:`Bad gateway error occurred while trying to load file`,503:`Service unavailable error occurred while trying to load file`,504:`Gateway timeout error occurred while trying to load file`},Tc=100,Ec=/^(\b[\w\-.]+\b\/)?\b[\w\-.]{1,96}\b$/;function Dc(...e){return e=e.map((t,n)=>(n&&(t=t.replace(/* @__PURE__ */ RegExp(`^/`),``)),n!==e.length-1&&(t=t.replace(/* @__PURE__ */ RegExp(`/$`),``)),t)),e.join(`/`)}function Oc(e,t=null,n=null){let r;try{r=new URL(e)}catch{return!1}return!(t&&!t.includes(r.protocol)||n&&!n.includes(r.hostname))}function kc(e){return!(!Ec.test(e)||e.includes(`..`)||e.includes(`--`)||e.endsWith(`.git`)||e.endsWith(`.ipynb`))}function Ac(e,t={},...n){return JSON.stringify([e,t.revision??`main`,t.cache_dir??null,t.local_files_only??!1,...n])}var jc=class extends Error{constructor(e,{status:t=null}={}){super(e),this.name=`ModelFileNotFoundError`,this.status=t}},Mc=/* @__PURE__ */ new Set([401,403,404]);function Nc(e,t,n){if(!n)return null;let r=`${wc[e]??`Error (${e}) occurred while trying to load file`}: "${t}".`;throw Mc.has(e)?new jc(r,{status:e}):Error(r)}async function Pc(e,t,n){let r=e.headers.get(`Content-Length`),i=r?parseInt(r,10):n??0;r===null&&!n&&A.warn(`Unable to determine content-length from response headers. Will expand buffer when needed.`);let a=new Uint8Array(i),o=0,s=e.body.getReader();async function c(){let{done:e,value:n}=await s.read();if(e)return;let r=o+n.length;if(r>i){i=r;let e=new Uint8Array(i);e.set(a),a=e}return a.set(n,o),o=r,t({progress:o/i*100,loaded:o,total:i}),c()}return await c(),a}function Fc(e){return Oc(e,[`blob:`])}function Ic(e,{allowUnresolved:t=!1}={}){let n;if(typeof location<`u`&&location.href)n=location.href;else if(import.meta.url)n=import.meta.url;else return e;try{return new URL(e,n).href}catch(n){if(!t)throw n;return e}}var Lc=`SHA-256`,Rc=`experimental_transformers-hash-cache`,zc=e=>({algorithm:Lc,value:e}),Bc=class{#e=null;_getHashCache=()=>(this.#e??=caches.open(Rc),this.#e);static isAvailable=()=>typeof navigator<`u`&&`crossOriginStorage`in navigator;match=async e=>{let t=await this._getFileHash(e);if(t)try{let e=await(await navigator.crossOriginStorage.requestFileHandle(zc(t))).getFile();return new Response(e,{headers:{"Content-Length":String(e.size)}})}catch{return}};put=async(e,t)=>{let n=await this._getFileHash(e);if(n){let e=await t.blob();await this._storeBlobInCOS(e,n)}else this._processAndStore(e,t.body)};_storeBlobInCOS=async(e,t)=>{let n=await(await navigator.crossOriginStorage.requestFileHandle(zc(t),{create:!0,origins:`*`})).createWritable();await n.write(e),await n.close()};_processAndStore=async(e,t)=>{try{let n=[];for await(let e of t)n.push(e);let r=new Blob(n),i=await this._getBlobHash(r);await this._storeBlobInCOS(r,i);try{await(await this._getHashCache()).put(e,new Response(i))}catch{}}catch{}};delete=async e=>{try{return await(await this._getHashCache()).delete(e)}catch{return!1}};_getFileHash=async e=>{try{let t=await this._getHashCache(),n=await t.match(e);if(n)return n.text();let r=await this._getLfsFileHash(e);return r?(await t.put(e,new Response(r)),r):null}catch{return null}};_getLfsFileHash=async e=>{if(!e.includes(`/resolve/`))return null;let t=e.replace(`/resolve/`,`/raw/`);try{let e=(await fetch(t).then(e=>e.text())).match(/^oid sha256:([0-9a-f]+)$/m);return e?e[1]:null}catch{return null}};_getBlobHash=async e=>{let t=await e.arrayBuffer(),n=await crypto.subtle.digest(Lc,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}};async function Vc(e=null){let t=null;if(k.useCustomCache){if(!k.customCache)throw Error("`env.useCustomCache=true`, but `env.customCache` is not defined.");if(!k.customCache.match||!k.customCache.put)throw Error("`env.customCache` must be an object which implements the `match` and `put` functions of the Web Cache API. For more information, see https://developer.mozilla.org/en-US/docs/Web/API/Cache");t=k.customCache}if(!t&&k.experimental_useCrossOriginStorage&&Bc.isAvailable()&&(t=new Bc),!t&&k.useBrowserCache){if(typeof caches>`u`)throw Error(`Browser cache is not available in this environment.`);try{t=await caches.open(k.cacheKey)}catch(e){A.warn(`An error occurred while opening the browser cache:`,e)}}if(!t&&k.useFSCache){if(!O.IS_FS_AVAILABLE)throw Error(`File System Cache is not available in this environment.`);t=new Cc(e??k.cacheDir)}return t}async function Hc(e,...t){for(let n of t)try{let t=await e.match(n);if(t)return t}catch{continue}}var Uc=new class{#e;#t;constructor(e){this.#e=e,this.#t=/* @__PURE__ */ new Map}get(e){if(!this.#t.has(e))return;let t=this.#t.get(e);return this.#t.delete(e),this.#t.set(e,t),t}put(e,t){this.#t.has(e)&&this.#t.delete(e),this.#t.set(e,t),this.#t.size>this.#e&&this.#t.delete(this.#t.keys().next().value)}delete(e){return this.#t.delete(e)}clear(){this.#t.clear()}}(100);function Wc(e,t){let n=Uc.get(e);if(n!==void 0)return n;let r=t().then(e=>e,t=>(Uc.delete(e),Promise.reject(t)));return Uc.put(e,r),r}async function Gc(e){if(!Oc(e,[`http:`,`https:`]))return null;let t=Yc(e);return t.set(`Range`,`bytes=0-0`),k.fetch(e,{method:`GET`,headers:t,cache:`no-store`})}function Kc(e,t,n={}){return Wc(Ac(e,n,t),()=>qc(e,t,n))}async function qc(e,t,n){let r=await Vc(n?.cache_dir),{localPath:i,remoteURL:a,proposedCacheKey:o,validModelId:s}=Xc(e,t,n,r),c=await Zc(r,i,o);if(c!==void 0&&typeof c!=`string`){let e=c.headers.get(`content-length`),t=c.headers.get(`content-type`);return{exists:!0,size:e?parseInt(e,10):void 0,contentType:t||void 0,fromCache:!0}}if(k.allowLocalModels&&!Oc(i,[`http:`,`https:`]))try{let e=await Jc(i);if(typeof e!=`string`&&e.status!==404){let t=e.headers.get(`content-length`),n=e.headers.get(`content-type`);return{exists:!0,size:t?parseInt(t,10):void 0,contentType:n||void 0,fromCache:!1}}}catch{}if(k.allowRemoteModels&&!n.local_files_only&&s){let e=await Gc(a);if(e&&e.status>=200&&e.status<300){let t,n=e.headers.get(`content-type`);if(e.status===206){let n=e.headers.get(`content-range`);if(n){let e=n.match(/bytes \d+-\d+\/(\d+)/);e&&(t=parseInt(e[1],10))}}else if(e.status===200)try{await e.body?.cancel()}catch{}if(t===void 0){let n=e.headers.get(`content-length`);t=n?parseInt(n,10):void 0}return{exists:!0,size:t,contentType:n||void 0,fromCache:!1}}e&&e.status!==404&&e.status!==416&&Nc(e.status,a,!0)}return{exists:!1,fromCache:!1}}async function Jc(e){return k.useFS&&!Oc(e,[`http:`,`https:`,`blob:`])?new gc(e instanceof URL?e.protocol===`file:`?e.pathname:e.toString():e):k.fetch(e,{headers:Yc(e)})}function Yc(e){let t=typeof process<`u`&&process?.release?.name===`node`,n=new Headers;if(t){let t=!!{}.TESTING_REMOTELY,r=k.version;if(n.set(`User-Agent`,`transformers.js/${r}; is_ci/${t};`),Oc(e,[`http:`,`https:`],[`huggingface.co`,`hf.co`])){let e={}.HF_TOKEN??{}.HF_ACCESS_TOKEN;e&&n.set(`Authorization`,`Bearer ${e}`)}}return n}function Xc(e,t,n={},r=null){let i=n.revision??`main`,a=Dc(e,t),o=kc(e),s=o?Dc(k.localModelPath,a):a,c=Dc(k.remoteHost,k.remotePathTemplate.replaceAll(`{model}`,e).replaceAll(`{revision}`,encodeURIComponent(i)),t);return{requestURL:a,localPath:s,remoteURL:c,proposedCacheKey:r instanceof Cc?i===`main`?a:Dc(e,i,t):c,validModelId:o}}async function Zc(e,t,n){if(e)return await Hc(e,t,n)}async function Qc(e,t,n,r,i,a,o={}){if(await n.match(r)===void 0&&!(typeof Cache<`u`&&n instanceof Cache&&!Oc(Ic(r,{allowUnresolved:!0}),[`http:`,`https:`]))){if(!a){let a=o.progress_callback?n=>ei(o.progress_callback,{status:`progress`,name:e,file:t,...n}):void 0;await n.put(r,i,a)}else if(typeof i!=`string`){let e=new Headers(i.headers);e.set(`content-length`,a.byteLength.toString()),await n.put(r,new Response(a,{headers:e})).catch(e=>{A.warn(`Unable to add response to browser cache: ${e}.`)})}}}async function $c(e,t,n=!0,r={},i=!1,a=null){let{requestURL:o,localPath:s,remoteURL:c,proposedCacheKey:l,validModelId:u}=Xc(e,t,r,a),d,f=!1,p;p=await Zc(a,s,l);let m=p!==void 0;if(m)d=l;else{if(k.allowLocalModels){if(!Oc(o,[`http:`,`https:`]))try{p=await Jc(s),d=s}catch(e){A.warn(`Unable to load from local path "${s}": "${e}"`)}else if(r.local_files_only)throw Error(`\`local_files_only=true\`, but attempted to load a remote file from: ${o}.`);else if(!k.allowRemoteModels)throw Error(`\`env.allowRemoteModels=false\`, but attempted to load a remote file from: ${o}.`)}if(p===void 0||typeof p!=`string`&&p.status===404){if(r.local_files_only||!k.allowRemoteModels){if(n)throw new jc(`\`local_files_only=true\` or \`env.allowRemoteModels=false\` and file was not found locally at "${s}".`);return null}if(!u)throw new jc(`Local file missing at "${s}" and download aborted due to invalid model ID "${e}".`);if(p=await Jc(c),p.status!==200)return Nc(p.status,c,n);d=l}f=a&&typeof Response<`u`&&p instanceof Response&&p.status===200}ei(r.progress_callback,{status:`download`,name:e,file:t});let h;if(!(O.IS_NODE_ENV&&i)){let n;if(typeof p!=`string`){if(!r.progress_callback)n=new Uint8Array(await p.arrayBuffer());else if(m&&typeof navigator<`u`&&/firefox/i.test(navigator.userAgent))n=new Uint8Array(await p.arrayBuffer()),ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n.length,total:n.length});else{let i,a=p.headers.get(`content-length`);if(a)i=parseInt(a,10);else try{let n=await Kc(e,t,r);n.size&&(i=n.size)}catch{}n=await Pc(p,n=>{ei(r.progress_callback,{status:`progress`,name:e,file:t,...n})},i)}}h=n}if(f&&d&&typeof p!=`string`&&await Qc(e,t,a,d,p,h,r),O.IS_NODE_ENV&&i&&r.progress_callback&&typeof p!=`string`){let n=parseInt(p.headers.get(`content-length`),10)||0;ei(r.progress_callback,{status:`progress`,name:e,file:t,progress:100,loaded:n,total:n})}if(ei(r.progress_callback,{status:`done`,name:e,file:t}),h){if(!O.IS_NODE_ENV&&i)throw Error(`Cannot return path in a browser environment.`);return h}if(p instanceof gc)return p.filePath;let g=await a?.match(d);if(g instanceof gc)return g.filePath;if(g instanceof Response)return new Uint8Array(await g.arrayBuffer());if(typeof g==`string`)return g;throw Error(`Unable to get model file path or buffer.`)}var el=/* @__PURE__ */ new Map;async function tl(e,t,n=!0,r={},i=!1){if(!k.allowLocalModels){if(r.local_files_only)throw Error("Invalid configuration detected: local models are disabled (`env.allowLocalModels=false`) but you have requested to only use local models (`local_files_only=true`).");if(!k.allowRemoteModels)throw Error("Invalid configuration detected: both local and remote models are disabled. Fix by setting `env.allowLocalModels` or `env.allowRemoteModels` to `true`.")}let a=Ac(e,r,t,n,i),{progress_callback:o}=r,s=o instanceof ti?o.loads:el,c=s.get(a);return c||(ei(o,{status:`initiate`,name:e,file:t}),c=Vc(r.cache_dir).then(a=>$c(e,t,n,r,i,a)),s===el&&(c=c.finally(()=>el.delete(a))),s.set(a,c)),await c}async function nl(e,t,n=!0,r={}){let i=await tl(e,t,n,r,!1);return i===null?null:new TextDecoder(`utf-8`).decode(i)}async function rl(e,t,n=!0,r={}){let i=await nl(e,t,n,r);return i===null?{}:JSON.parse(i)}function il(e,[t,n,r],[i,a],o=`bilinear`,s=!1){let c=a/r,l=i/n,u=new e.constructor(i*a*t),d=n*r,f=i*a;for(let o=0;o=0;--e)i[e]=a,r[e]=t[n[e]],a*=r[e];let a=n.map((e,t)=>i[n.indexOf(t)]),o=new e.constructor(e.length);for(let n=0;n=0;--e)r+=i%t[e]*a[e],i=Math.floor(i/t[e]);o[r]=e[n]}return[o,r]}function ol(e){let t=ll(e)[0],n=e.map(e=>Math.exp(e-t)),r=n.reduce((e,t)=>e+t,0);return n.map(e=>e/r)}function sl(e){let t=ll(e)[0],n=0;for(let r=0;re-t-r)}function cl(e){if(e.length===0)throw Error(`Array must not be empty`);let t=e[0],n=0;for(let r=1;rt&&(t=e[r],n=r);return[t,n]}function ul(e){return e>0&&!(e&e-1)}var dl=class{constructor(e){if(this.size=e|0,this.size<=1||!ul(this.size))throw Error(`FFT size must be a power of two larger than 1`);this._csize=e<<1,this.table=new Float64Array(this.size*2);for(let e=0;ee;e<<=1)++t;this._width=t%2==0?t-1:t,this._bitrev=new Int32Array(1<>>t&3)<>>1);for(let t=0;t>>1]=e[t];return n}toComplexArray(e,t){let n=t||this.createComplexArray();for(let t=0;t>>1],n[t+1]=0;return n}transform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,1)}realTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._realTransform4(e,t,1)}inverseTransform(e,t){if(e===t)throw Error(`Input and output buffers must be different`);this._transform4(e,t,-1);for(let t=0;t>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>2;for(o=0;o>>1,i>>>1)}else for(o=0,s=0;o>>1,i>>>1,n)}let l=this.table;for(i>>=2;i>=2;i>>=2){a=r/i<<1;let t=a>>>1,s=t>>>1,c=s>>>1;for(o=0;o>>1;for(let t=2;t>1;++t){let n=(t+1-e)**2/2,r=Math.sqrt(s**2+c**2)**n,o=n*Math.atan2(c,s),l=2*t;i[l]=r*Math.cos(o),i[l+1]=r*Math.sin(o),a[l]=i[l],a[l+1]=-i[l+1]}this._slicedChirpBuffer=i.subarray(t,n),this._f=new dl(r>>1),this._f.transform(this._chirpBuffer,a)}_transform(e,t,n){let r=this._buffer1,i=this._buffer2,a=this._outBuffer1,o=this._outBuffer2,s=this._chirpBuffer,c=this._slicedChirpBuffer,l=this._a;if(n)for(let e=0;e>1];r[e]=i*c[e],r[n]=i*c[n]}else for(let e=0;e=e.length&&(i=2*(e.length-1)-i),r[a++]=e[i]}r.sort(),n[t]=r[i]}return n}function hl(e,t){let n=10**t;return Math.round(e*n)/n}function gl(e){let t=Math.round(e);return Math.abs(e)%1==.5?t%2==0?t:t-1:t}function _l(e){let t=e.length,n=e[0].length,r=[t+1,n+1],i=Array.from({length:r[0]},()=>Array(r[1]).fill(1/0));i[0][0]=0;let a=Array.from({length:r[0]},()=>Array(r[1]).fill(-1));for(let t=1;t0||s>0;)switch(c.push(o-1),l.push(s-1),a[o][s]){case 0:--o,--s;break;case 1:--o;break;case 2:--s;break;default:throw Error(`Internal error in dynamic time warping. Unexpected trace[${o}, ${s}]. Please file a bug report.`)}return c.reverse(),l.reverse(),[c,l]}var vl=/* @__PURE__ */ (function(){let e=null;return function(t){if(!e){e=/* @__PURE__ */ new Float32Array(65536);let t=/* @__PURE__ */ new ArrayBuffer(4),n=new Uint32Array(t),r=new Float32Array(t);for(let t=0;t>10,s=t&1023;if(o===31)i=a|2139095040|s<<13;else if(o===0){if(s===0)i=a;else{let e=113;for(;!(s&1024);)s<<=1,--e;s&=-1025,i=a|e<<23|s<<13}}else i=a|o+112<<23|s<<13;n[0]=i,e[t]=r[0]}}let n=t.length,r=e,i=new Float32Array(n);for(let e=0;e[`webgpu`,`cuda`,`dml`,`webnn-gpu`].includes(e))}if(El.includes(e))return[Cl[e]??e];throw Error(`Unsupported device: "${e}". Should be one of: ${El.join(`, `)}.`)}var Ml=Promise.resolve(),Nl=null;async function Pl(){if(Nl)return Nl;if(!(k.useWasmCache&&typeof zl?.wasm?.wasmPaths==`object`&&zl?.wasm?.wasmPaths?.wasm&&zl?.wasm?.wasmPaths?.mjs)){if(O.IS_DENO_WEB_RUNTIME)throw Error(`env.useWasmCache=false is not supported in Deno's web runtime. Remove the useWasmCache override.`);return Nl=Promise.resolve(),Nl}return Nl=(async()=>{let e=zl.wasm.wasmPaths,t=!1;await Promise.all([e.wasm&&!Fc(e.wasm)?(async()=>{try{let n=await xl(Ic(e.wasm));n&&(zl.wasm.wasmBinary=n,t=!0)}catch(e){A.warn(`Failed to pre-load WASM binary:`,e)}})():Promise.resolve(),e.mjs&&!Fc(e.mjs)?(async()=>{try{let t=await Sl(Ic(e.mjs));t&&(zl.wasm.wasmPaths.mjs=t)}catch(e){A.warn(`Failed to pre-load WASM factory:`,e)}})():Promise.resolve()]),t||(zl.wasm.wasmPaths.mjs=e.mjs)})(),Nl}async function Fl(e,t,n){await Pl();let r=wl(k.logLevel??Xr.WARNING),i=()=>Al.create(e,{logSeverityLevel:r,...t}),a=await(O.IS_WEB_ENV?Ml=Ml.then(i):i());return a.config=n,a}var Il=Promise.resolve();async function Ll(e,t){let n=()=>e.run(t);return O.IS_WEB_ENV?Il=Il.then(n):n()}function Rl(e){return e instanceof Ol.Tensor}var zl=Ol?.env;function Bl(){return zl?.wasm?.proxy}if(zl){let e=function(e){zl.logLevel=Tl[wl(e)]};if(zl.wasm){if(!(typeof ServiceWorkerGlobalScope<`u`&&self instanceof ServiceWorkerGlobalScope)&&zl.versions?.web&&!zl.wasm.wasmPaths){let e=`https://cdn.jsdelivr.net/npm/onnxruntime-web@${zl.versions.web}/dist/`,t=`.asyncify`;O.IS_SAFARI_BELOW_26&&!O.IS_WEBGPU_AVAILABLE&&(t=``),zl.wasm.wasmPaths={mjs:`${e}ort-wasm-simd-threaded${t}.mjs`,wasm:`${e}ort-wasm-simd-threaded${t}.wasm`}}zl.wasm.proxy=!1}zl.webgpu&&(zl.webgpu.powerPreference=`high-performance`),e(k.logLevel??Xr.WARNING),k.backends.onnx={...zl,setLogLevel:e}}var Vl=async(e,t,n)=>{let r=await Fl(new Uint8Array(e),t);return(async e=>{let t=Bl(),i=Object.fromEntries(Object.entries(e).map(([e,n])=>[e,(t?n.clone():n).ort_tensor])),a=await Ll(r,i);return Array.isArray(n)?n.map(e=>new V(a[e])):new V(a[n])})},Hl=class{static session_options={};static get nearest_interpolate_4d(){return this._nearest_interpolate_4d||=Vl([8,10,18,0,58,129,1,10,41,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,18,10,4,109,111,100,101,34,7,110,101,97,114,101,115,116,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,21],this.session_options,`y`),this._nearest_interpolate_4d}static get bilinear_interpolate_4d(){return this._bilinear_interpolate_4d||=Vl([8,9,18,0,58,128,1,10,40,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,17,10,4,109,111,100,101,34,6,108,105,110,101,97,114,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bilinear_interpolate_4d}static get bicubic_interpolate_4d(){return this._bicubic_interpolate_4d||=Vl([8,9,18,0,58,127,10,39,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,16,10,4,109,111,100,101,34,5,99,117,98,105,99,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,`y`),this._bicubic_interpolate_4d}static get matmul(){return this._matmul||=Vl([8,9,18,0,58,55,10,17,10,1,97,10,1,98,18,1,99,34,6,77,97,116,77,117,108,18,1,114,90,9,10,1,97,18,4,10,2,8,1,90,9,10,1,98,18,4,10,2,8,1,98,9,10,1,99,18,4,10,2,8,1,66,2,16,20],this.session_options,`c`),this._matmul}static get stft(){return this._stft||=Vl([8,7,18,0,58,148,1,10,38,10,1,115,10,1,106,10,1,119,10,1,108,18,1,111,34,4,83,84,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,115,90,26,10,1,115,18,21,10,19,8,1,18,15,10,3,18,1,98,10,3,18,1,115,10,3,18,1,99,90,11,10,1,106,18,6,10,4,8,7,18,0,90,16,10,1,119,18,11,10,9,8,1,18,5,10,3,18,1,119,90,11,10,1,108,18,6,10,4,8,7,18,0,98,31,10,1,111,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,102,10,3,18,1,100,10,3,18,1,99,66,2,16,17],this.session_options,`o`),this._stft}static get rfft(){return this._rfft||=Vl([8,9,58,93,10,33,10,1,120,10,0,10,1,97,18,1,121,34,3,68,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,100,90,19,10,1,120,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,1,90,11,10,1,97,18,6,10,4,8,7,18,0,98,19,10,1,121,18,14,10,12,8,1,18,8,10,0,10,0,10,2,8,2,66,2,16,20],this.session_options,`y`),this._rfft}static get top_k(){return this._top_k||=Vl([8,10,18,0,58,73,10,18,10,1,120,10,1,107,18,1,118,18,1,105,34,4,84,111,112,75,18,1,116,90,9,10,1,120,18,4,10,2,8,1,90,15,10,1,107,18,10,10,8,8,7,18,4,10,2,8,1,98,9,10,1,118,18,4,10,2,8,1,98,9,10,1,105,18,4,10,2,8,7,66,2,16,21],this.session_options,[`v`,`i`]),this._top_k}static get slice(){return this._slice||=Vl([8,7,18,0,58,96,10,25,10,1,120,10,1,115,10,1,101,10,1,97,10,1,116,18,1,121,34,5,83,108,105,99,101,18,1,114,90,9,10,1,120,18,4,10,2,8,1,90,9,10,1,115,18,4,10,2,8,7,90,9,10,1,101,18,4,10,2,8,7,90,9,10,1,97,18,4,10,2,8,7,90,9,10,1,116,18,4,10,2,8,7,98,9,10,1,121,18,4,10,2,8,1,66,2,16,13],this.session_options,`y`),this._slice}},Ul=Object.freeze({auto:`auto`,gpu:`gpu`,cpu:`cpu`,wasm:`wasm`,webgpu:`webgpu`,cuda:`cuda`,dml:`dml`,coreml:`coreml`,webnn:`webnn`,"webnn-npu":`webnn-npu`,"webnn-gpu":`webnn-gpu`,"webnn-cpu":`webnn-cpu`}),Wl=O.IS_NODE_ENV?`cpu`:`wasm`;function Gl(e,t,{warn:n}={}){return e?typeof e==`string`?e:e.hasOwnProperty(t)?e[t]:(n&&n(`device not specified for "${t}". Using the default device (${Wl}).`),Wl):Wl}var Kl=/* @__PURE__ */ (function(){let e;return async function(){if(e===void 0){if(!O.IS_WEBGPU_AVAILABLE)e=!1;else try{e=(await navigator.gpu.requestAdapter()).features.has(`shader-f16`)}catch{e=!1}}return e}})(),ql=Object.freeze({auto:`auto`,fp32:`fp32`,fp16:`fp16`,q8:`q8`,int8:`int8`,uint8:`uint8`,q4:`q4`,bnb4:`bnb4`,q4f16:`q4f16`,q2:`q2`,q2f16:`q2f16`,q1:`q1`,q1f16:`q1f16`}),Jl=ql.fp32,Yl=Object.freeze({[Ul.wasm]:ql.q8}),Xl=Object.freeze({[ql.fp32]:``,[ql.fp16]:`_fp16`,[ql.int8]:`_int8`,[ql.uint8]:`_uint8`,[ql.q8]:`_quantized`,[ql.q4]:`_q4`,[ql.q2]:`_q2`,[ql.q1]:`_q1`,[ql.q4f16]:`_q4f16`,[ql.q2f16]:`_q2f16`,[ql.q1f16]:`_q1f16`,[ql.bnb4]:`_bnb4`});function Zl(e,t,n,{configDtype:r=null,warn:i}={}){let a,o=!1;e&&typeof e!=`string`?e.hasOwnProperty(t)?a=e[t]:(a=null,o=!0):a=e;let s;if(a===ql.auto){if(r){let e=typeof r==`string`?r:r?.[t];if(e&&e!==ql.auto&&ql.hasOwnProperty(e))return e}s=Yl[n]??Jl}else s=a&&ql.hasOwnProperty(a)?a:Yl[n]??Jl;return o&&i&&i(`dtype not specified for "${t}". Using the default dtype (${s}) for this device (${n}).`),s}var Ql=Object.freeze({float32:Float32Array,float16:typeof Float16Array<`u`?Float16Array:Uint16Array,float64:Float64Array,string:Array,int8:Int8Array,uint8:Uint8Array,int16:Int16Array,uint16:Uint16Array,int32:Int32Array,uint32:Uint32Array,int64:BigInt64Array,uint64:BigUint64Array,bool:Uint8Array,uint4:Uint8Array,int4:Int8Array}),V=class e{get dims(){return this.ort_tensor.dims}set dims(e){this.ort_tensor.dims=e}get type(){return this.ort_tensor.type}get data(){return this.ort_tensor.data}get size(){return this.ort_tensor.size}get location(){return this.ort_tensor.location}ort_tensor;constructor(...e){return this.ort_tensor=Rl(e[0])?e[0]:new br(e[0],e[1],e[2]),new Proxy(this,{get:(e,t)=>{if(typeof t==`string`){let n=Number(t);if(Number.isInteger(n))return e._getitem(n)}return e[t]},set:(e,t,n)=>e[t]=n})}dispose(){this.ort_tensor.dispose()}*[Symbol.iterator](){let[e,...t]=this.dims;if(t.length>0){let n=t.reduce((e,t)=>e*t);for(let r=0;r0){let e=r.reduce((e,t)=>e*t);return this._subarray(t,e,r)}return new e(this.type,[this.data[t]],r)}_subarray(t,n,r){let i=t*n,a=(t+1)*n,o=`subarray`in this.data?this.data.subarray(i,a):this.data.slice(i,a);return new e(this.type,o,r)}item(){let e=this.data;if(e.length!==1)throw Error(`a Tensor with ${e.length} elements cannot be converted to Scalar`);return e[0]}tolist(){return $l(this.data,this.dims)}sigmoid(){return this.clone().sigmoid_()}sigmoid_(){let e=this.data;for(let t=0;t0||r>0&&n<0?r+n:r}return this}clone(){return new e(this.type,this.data.slice(),this.dims.slice())}slice(...t){let n=[],r=[];for(let e=0;ea)throw Error(`Invalid slice: ${i}`);let o=[Math.max(t,0),Math.min(a,this.dims[e])];r.push(o),n.push(o[1]-o[0])}else throw Error(`Invalid slice: ${i}`)}let i=r.map(([e,t])=>t-e),a=i.reduce((e,t)=>e*t),o=this.data,s=new o.constructor(a),c=this.stride(),l=!0;for(let e=1;e=0;--n){let e=i[n];t+=(a%e+r[n][0])*c[n],a=Math.floor(a/e)}s[e]=o[t]}return new e(this.type,s,n)}permute(...e){return eu(this,e)}transpose(...e){return this.permute(...e)}sum(e=null,t=!1){return this.norm(1,e,t)}norm(t=`fro`,n=null,r=!1){if(t===`fro`)t=2;else if(typeof t==`string`)throw Error(`Unsupported norm: ${t}`);let i=this.data,a=i instanceof BigInt64Array||i instanceof BigUint64Array;if(a&&t!==1)throw Error(`Expected a floating point tensor as input. Got ${this.type}`);let o,s;if(a?(o=(e,t)=>e+t,s=0n):(o=(e,n)=>e+n**t,s=0),n===null){let n=i.reduce(o,s);return t!==1&&(n**=1/t),new e(this.type,[n],[])}let[c,l,u]=fu(o,this,n,r);if(t!==1)for(let e=0;e=0;--r){let e=this.dims[r];if(r!==t){let t=i%e;n+=t*a,a*=this.dims[r]}i=Math.floor(i/e)}r[e]/=i[n]}return this}normalize(e=2,t=1){return this.clone().normalize_(e,t)}stride(){return hu(this.dims)}squeeze(t=null){return new e(this.type,this.data,cu(this.dims,t))}squeeze_(e=null){return this.dims=cu(this.dims,e),this}unsqueeze(t){return new e(this.type,this.data,lu(this.dims,t))}unsqueeze_(e){return this.dims=lu(this.dims,e),this}flatten_(e=0,t=-1){t=(t+this.dims.length)%this.dims.length;let n=this.dims.slice(0,e),r=this.dims.slice(e,t+1),i=this.dims.slice(t+1);return this.dims=[...n,r.reduce((e,t)=>e*t,1),...i],this}flatten(e=0,t=-1){return this.clone().flatten_(e,t)}view(...t){let n=-1;for(let e=0;er===n?e:e*t,1);t[n]=r.length/e}return new e(this.type,r,t)}neg_(){let e=this.data;for(let t=0;tt);return new e(`bool`,n,this.dims)}lt(t){let n=new Uint8Array(this.data.length),r=this.data;for(let e=0;eMath.min(e,t),this,t,n,1/0);return new e(r,i,a)}max(t=null,n=!1){if(t===null){let t=ll(this.data)[0];return new e(this.type,[t],[])}let[r,i,a]=fu((e,t)=>Math.max(e,t),this,t,n,-1/0);return new e(r,i,a)}argmin(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=cl(this.data)[1];return new e(`int64`,[BigInt(r)],[])}argmax(t=null,n=!1){if(t!==null)throw Error("`dim !== null` not yet implemented.");let r=ll(this.data)[1];return new e(`int64`,[BigInt(r)],[])}repeat(...t){if(t.lengthe===1)){if(t.length===this.dims.length)return this.clone();let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims);return new e(this.type,this.data.slice(),r)}let n=t.length-this.dims.length,r=Array(n).fill(1).concat(this.dims),i=r.map((e,n)=>e*t[n]),a=i.reduce((e,t)=>e*t,1),o=this.data,s=new o.constructor(a),c=hu(r),l=hu(i);for(let e=0;eBigInt(Math.floor(e)):BigInt;else if(this.type===`float16`&&t==`float32`&&this.data instanceof Uint16Array)return new e(t,vl(this.data),this.dims);return new e(t,Ql[t].from(this.data,n),this.dims)}};function $l(e,t){let n=e.length;if(n!==(t.length===0?1:t.reduce((e,t)=>e*t)))throw Error(`cannot reshape array of size ${n} into shape (${t})`);let r=e;for(let e=t.length-1;e>=0;e--)r=r.reduce((n,r)=>{let i=n[n.length-1];return i.lengthnew V(`int64`,e,[e.length]);async function ou(e,t,n,r,i){return await(await Hl.slice)({x:e,s:au(t),e:au(n),a:au(r),t:au(i??Array(r.length).fill(1))})}function su(e,t){let n=e.data,r=t.data,i=[e.dims[0],e.dims[2]],a=new n.constructor(i[0]*i[1]),[o,s,c]=e.dims,l=0;for(let e=0;ee!==1):typeof t==`number`?e[t]===1&&e.splice(t,1):Array.isArray(t)&&(e=e.filter((e,n)=>e!==1||!t.includes(n))),e}function lu(e,t){return t=uu(t,e.length+1),e=e.slice(),e.splice(t,0,1),e}function uu(e,t,n=null,r=!0){if(e<-t||e>=t){if(r)throw Error(`IndexError: index ${e} is out of bounds for dimension${n===null?``:` `+n} with size ${t}`);return e<-t?0:t}return e<0&&(e=(e%t+t)%t),e}function H(e,t=0){t=uu(t,e[0].dims.length);let n=e[0].dims.slice();n[t]=e.reduce((e,n)=>e+n.dims[t],0);let r=n.reduce((e,t)=>e*t,1),i=new e[0].data.constructor(r),a=e[0].type;if(t===0){let t=0;for(let n of e){let e=n.data;i.set(e,t),t+=e.length}}else{let r=0;for(let a=0;a=0;--i){let e=s[i],l=o%e;i===t&&(l+=r),a+=l*c,c*=n[i],o=Math.floor(o/e)}i[a]=o[e]}r+=s[t]}}return new V(a,i,n)}function du(e,t=0){return H(e.map(e=>e.unsqueeze(t)),t)}function fu(e,t,n,r=!1,i=null){let a=t.data,o=t.dims;n=uu(n,o.length);let s=o.slice();s[n]=1;let c=new a.constructor(a.length/o[n]);i!==null&&c.fill(i);for(let t=0;t=0;--e){let t=o[e];if(e!==n){let n=i%t;r+=n*a,a*=s[e]}i=Math.floor(i/t)}c[r]=e(c[r],a[t],t,r)}return r||s.splice(n,1),[t.type,c,s]}function pu(e,t=null,n=1,r=!1){let i=e.data,a=e.dims;if(t===null){let t=i.reduce((e,t)=>e+t,0)/i.length,r=Math.sqrt(i.reduce((e,n)=>e+(n-t)**2,0)/(i.length-n)),a=new V(e.type,[t],[]);return[new V(e.type,[r],[]),a]}t=uu(t,a.length);let o=mu(e,t,r),s=o.data,[c,l,u]=fu((e,t,n,r)=>e+(t-s[r])**2,e,t,r);for(let e=0;ee+t,0);return new V(e.type,[t/i.length],[])}t=uu(t,r.length);let[a,o,s]=fu((e,t)=>e+t,e,t,n);if(r[t]!==1)for(let e=0;e=0;--n)t[n]=r,r*=e[n];return t}function gu(e,t,n,r){return new V(n,new r(e.reduce((e,t)=>e*t,1)).fill(t),e)}function _u(e,t){let n,r;if(typeof t==`number`)n=`float32`,r=Float32Array;else if(typeof t==`bigint`)n=`int64`,r=BigInt64Array;else if(typeof t==`boolean`)n=`bool`,r=Uint8Array;else throw Error(`Unsupported data type: ${typeof t}`);return gu(e,t,n,r)}function vu(e,t){return _u(e.dims,t)}function yu(e){return gu(e,1n,`int64`,BigInt64Array)}function bu(e){return yu(e.dims)}function xu(e){return gu(e,0n,`int64`,BigInt64Array)}function Su(e){return xu(e.dims)}function Cu(e){let t=e.reduce((e,t)=>e*t,1);return new V(`float32`,Float32Array.from({length:t},()=>bc.gauss()),e)}function wu(e,t){if(e.dims.length!==2)throw Error(`The tensor must have 2 dimensions`);if(e.dims.at(-1)%8!=0)throw Error(`The last dimension of the tensor must be a multiple of 8`);if(![`binary`,`ubinary`].includes(t))throw Error(`The precision must be either 'binary' or 'ubinary'`);let n=t===`binary`,r=n?`int8`:`uint8`,i=n?Int8Array:Uint8Array,a=e.data,o=new i(a.length/8);for(let e=0;e0),r=Math.floor(e/8),i=e%8;o[r]|=t<<7-i,n&&i===0&&(o[r]-=128)}return new V(r,o,[e.dims[0],e.dims[1]/8])}async function Tu(e){if(!e)throw Error(`modelId is required for get_tokenizer_files`);return(await Kc(e,`tokenizer_config.json`,{})).exists?[`tokenizer.json`,`tokenizer_config.json`]:[]}async function Eu(e,t){let n=await Tu(e);return await Promise.all(n.map(n=>rl(e,n,!0,t)))}function Du(e){let t=e.dims;switch(t.length){case 1:return e.tolist();case 2:if(t[0]!==1)throw Error("Unable to decode tensor with `batch size !== 1`. Use `tokenizer.batch_decode(...)` for batched inputs.");return e.tolist()[0];default:throw Error(`Expected tensor to have 1-2 dimensions, got ${t.length}.`)}}var Ou=[`bos_token`,`eos_token`,`unk_token`,`sep_token`,`pad_token`,`cls_token`,`mask_token`];function ku(e,t,n,r){for(let i of Object.keys(e)){let a=t-e[i].length,o=n(i),s=Array(a).fill(o);e[i]=r===`right`?ai(e[i],s):ai(s,e[i])}}function Au(e,t){for(let n of Object.keys(e))e[n].length=t}function ju(e,...t){for(let n of t){if(!Object.hasOwn(e,n))continue;let t=e[n];if(t){if(typeof t==`object`){if(t.__type===`AddedToken`)return t.content;throw Error(`Unknown token: ${t}`)}return t}}return null}function Mu(e){let t=[];for(let n of e.get_added_tokens_decoder().values())n.special&&t.push(n);return t}var U=class extends $r{return_token_type_ids=!1;padding_side=`right`;constructor(e,t){if(super(),this._tokenizerJSON=e,this._tokenizerConfig=t,this._tokenizer=new Do(e,t),this.config=t,this.padding_side=t.padding_side??this.padding_side,this.mask_token=ju(t,`mask_token`),this.mask_token_id=this._tokenizer.token_to_id(this.mask_token),this.pad_token=ju(t,`pad_token`,`eos_token`),this.pad_token_id=this._tokenizer.token_to_id(this.pad_token),this.sep_token=ju(t,`sep_token`),this.sep_token_id=this._tokenizer.token_to_id(this.sep_token),this.unk_token=ju(t,`unk_token`),this.unk_token_id=this._tokenizer.token_to_id(this.unk_token),this.bos_token=ju(t,`bos_token`),this.bos_token_id=this._tokenizer.token_to_id(this.bos_token),this.eos_token=ju(t,`eos_token`),this.eos_token_id=this._tokenizer.token_to_id(this.eos_token),this.chat_template=t.chat_template??null,Array.isArray(this.chat_template)){let e=/* @__PURE__ */ Object.create(null);for(let{name:t,template:n}of this.chat_template){if(typeof t!=`string`||typeof n!=`string`)throw Error(`Chat template must be a list of objects with "name" and "template" properties`);e[t]=n}this.chat_template=e}this._compiled_template_cache=/* @__PURE__ */ new Map;let n=Mu(this._tokenizer);this.all_special_ids=n.map(e=>e.id),this.all_special_tokens=n.map(e=>e.content)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let o=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a});return new this(...o)}get_vocab(){return this._tokenizer.get_vocab()}get model_max_length(){return this._tokenizerConfig.model_max_length??1/0}get add_eos_token(){return this._tokenizerConfig.add_eos_token}get add_bos_token(){return this._tokenizerConfig.add_bos_token}convert_tokens_to_ids(e){return typeof e==`string`?this._tokenizer.token_to_id(e):e.map(e=>this._tokenizer.token_to_id(e))}_call(e,t={}){let{text_pair:n=null,add_special_tokens:r=!0,padding:i=!1,return_token_type_ids:a=null}=t,{truncation:o=null,max_length:s=null}=t,c=t.return_tensor??!0,l=Array.isArray(e),u;if(l){if(e.length===0)throw Error(`text array must be non-empty`);if(n!==null){if(!Array.isArray(n))throw Error(`text_pair must also be an array`);if(e.length!==n.length)throw Error(`text and text_pair must have the same length`);u=e.map((e,t)=>this._encode_plus(e,{text_pair:n[t],add_special_tokens:r,return_token_type_ids:a}))}else u=e.map(e=>this._encode_plus(e,{add_special_tokens:r,return_token_type_ids:a}))}else{if(e==null)throw Error(`text may not be null or undefined`);if(Array.isArray(n))throw Error("When specifying `text_pair`, since `text` is a string, `text_pair` must also be a string (i.e., not an array).");u=[this._encode_plus(e,{text_pair:n,add_special_tokens:r,return_token_type_ids:a})]}if(s===null?s=this.model_max_length:o===null&&(i===!0?(A.warn("`max_length` is ignored when `padding: true` and there is no truncation strategy. To pad to max length, use `padding: 'max_length'`."),s=this.model_max_length):i===!1&&(A.warn("Truncation was not explicitly activated but `max_length` is provided a specific value, please use `truncation: true` to explicitly truncate examples to max length."),o=!0)),i===!0&&(s=Math.min(ll(u.map(e=>e.input_ids.length))[0],s??1/0)),s=Math.min(s,this.model_max_length??1/0),i||o)for(let e=0;es?o&&Au(u[e],s):i&&ku(u[e],s,e=>e===`input_ids`?this.pad_token_id:0,this.padding_side);let d={};if(c){if(!(i&&o)&&u.some(e=>{for(let t of Object.keys(e))if(e[t].length!==u[0][t]?.length)return!0;return!1}))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=true' and 'truncation=true' to have batched tensors with the same length.`);let e=[u.length,u[0].input_ids.length];for(let t of Object.keys(u[0]))d[t]=new V(`int64`,BigInt64Array.from(u.flatMap(e=>e[t]).map(BigInt)),e)}else{for(let e of Object.keys(u[0]))d[e]=u.map(t=>t[e]);if(!l)for(let e of Object.keys(d))d[e]=d[e][0]}return d}_encode_text(e){return e===null?null:this._tokenizer.encode(e).tokens}_encode_plus(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){let{ids:i,attention_mask:a,token_type_ids:o}=this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r??this.return_token_type_ids});return{input_ids:i,attention_mask:a,...o?{token_type_ids:o}:{}}}tokenize(e,{pair:t=null,add_special_tokens:n=!1}={}){return this._tokenizer.tokenize(e,{text_pair:t,add_special_tokens:n})}encode(e,{text_pair:t=null,add_special_tokens:n=!0,return_token_type_ids:r=null}={}){return this._tokenizer.encode(e,{text_pair:t,add_special_tokens:n,return_token_type_ids:r}).ids}batch_decode(e,t={}){return e instanceof V&&(e=e.tolist()),e.map(e=>this.decode(e,t))}decode(e,t={}){if(e instanceof V&&(e=Du(e)),!Array.isArray(e)||e.length===0||!ni(e[0]))throw Error(`token_ids must be a non-empty array of integers.`);return this.decode_single(e,t)}decode_single(e,{skip_special_tokens:t=!1,clean_up_tokenization_spaces:n=null}){return this._tokenizer.decode(e,{skip_special_tokens:t,clean_up_tokenization_spaces:n})}get_chat_template({chat_template:e=null,tools:t=null}={}){if(this.chat_template&&typeof this.chat_template==`object`){let n=this.chat_template;if(e!==null&&Object.hasOwn(n,e))e=n[e];else if(e===null){if(t!==null&&`tool_use`in n)e=n.tool_use;else if(`default`in n)e=n.default;else throw Error(`This model has multiple chat templates with no default specified! Please either pass a chat template or the name of the template you wish to use to the 'chat_template' argument. Available template names are ${Object.keys(n).sort()}.`)}}else if(e===null){if(this.chat_template)e=this.chat_template;else throw Error(`Cannot use apply_chat_template() because tokenizer.chat_template is not set and no template argument was passed! For information about writing templates and setting the tokenizer.chat_template attribute, please see the documentation at https://huggingface.co/docs/transformers/main/en/chat_templating`)}return e}apply_chat_template(e,t={}){let{tools:n=null,documents:r=null,chat_template:i=null,add_generation_prompt:a=!1,tokenize:o=!0,padding:s=!1,truncation:c=!1,max_length:l=null,return_tensor:u=!0,return_dict:d=!0,tokenizer_kwargs:f={},...p}=t;if(i=this.get_chat_template({chat_template:i,tools:n}),typeof i!=`string`)throw Error(`chat_template must be a string, but got ${typeof i}`);let m=this._compiled_template_cache.get(i);m===void 0&&(m=new mc(i),this._compiled_template_cache.set(i,m));let h=/* @__PURE__ */ Object.create(null);for(let e of Ou){let t=ju(this.config,e);t&&(h[e]=t)}let g=m.render({messages:e,add_generation_prompt:a,tools:n,documents:r,...h,...p});if(o){let e=this._call(g,{add_special_tokens:!1,padding:s,truncation:c,max_length:l,return_tensor:u,...f});return d?e:e.input_ids}return g}};function Nu(e,t,n,r){if(!(`language_codes`in e)||!Array.isArray(e.language_codes))throw Error("Tokenizer must have `language_codes` attribute set and it should be an array of language ids.");if(!(`languageRegex`in e)||!(e.languageRegex instanceof RegExp))throw Error("Tokenizer must have `languageRegex` attribute set and it should be a regular expression.");if(!(`lang_to_token`in e)||typeof e.lang_to_token!=`function`)throw Error("Tokenizer must have `lang_to_token` attribute set and it should be a function.");let i=r.src_lang,a=r.tgt_lang;if(!e.language_codes.includes(a))throw Error(`Target language code "${a}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);if(i!==void 0){if(!e.language_codes.includes(i))throw Error(`Source language code "${i}" is not valid. Must be one of: {${e.language_codes.join(`, `)}}`);let t=e._tokenizer.post_processor?.config;if(t&&`single`in t){for(let n of t.single)if(`SpecialToken`in n&&e.languageRegex.test(n.SpecialToken.id)){n.SpecialToken.id=e.lang_to_token(i);break}}}return r.forced_bos_token_id=e._tokenizer.token_to_id(e.lang_to_token(a)),e._call(t,n)}var Pu={};Sr(Pu,{AlbertTokenizer:()=>Fu,AutoTokenizer:()=>W,BartTokenizer:()=>Iu,BertTokenizer:()=>Lu,BlenderbotSmallTokenizer:()=>Ru,BlenderbotTokenizer:()=>zu,BloomTokenizer:()=>Bu,CLIPTokenizer:()=>Hu,CamembertTokenizer:()=>Vu,CodeGenTokenizer:()=>Wu,CodeLlamaTokenizer:()=>Uu,CohereAsrTokenizer:()=>Ku,CohereTokenizer:()=>Gu,ConvBertTokenizer:()=>qu,DebertaTokenizer:()=>Yu,DebertaV2Tokenizer:()=>Ju,DistilBertTokenizer:()=>Xu,ElectraTokenizer:()=>Zu,EsmTokenizer:()=>Qu,FalconTokenizer:()=>$u,GPT2Tokenizer:()=>nd,GPTNeoXTokenizer:()=>td,GemmaTokenizer:()=>ed,HerbertTokenizer:()=>rd,LlamaTokenizer:()=>id,M2M100Tokenizer:()=>ad,MBart50Tokenizer:()=>cd,MBartTokenizer:()=>sd,MPNetTokenizer:()=>dd,MarianTokenizer:()=>od,MgpstrTokenizer:()=>ld,MobileBertTokenizer:()=>ud,NllbTokenizer:()=>fd,NougatTokenizer:()=>pd,PreTrainedTokenizer:()=>U,Qwen2Tokenizer:()=>md,RoFormerTokenizer:()=>gd,RobertaTokenizer:()=>hd,SiglipTokenizer:()=>_d,SpeechT5Tokenizer:()=>vd,SqueezeBertTokenizer:()=>yd,T5Tokenizer:()=>bd,TokenizersBackend:()=>U,VitsTokenizer:()=>Sd,Wav2Vec2CTCTokenizer:()=>Cd,WhisperTokenizer:()=>Ad,XLMRobertaTokenizer:()=>jd,XLMTokenizer:()=>Md});var Fu=class extends U{return_token_type_ids=!0},Iu=class extends U{},Lu=class extends U{return_token_type_ids=!0},Ru=class extends U{},zu=class extends U{},Bu=class extends U{},Vu=class extends U{},Hu=class extends U{},Uu=class extends U{},Wu=class extends U{},Gu=class extends U{},Ku=class extends U{},qu=class extends U{return_token_type_ids=!0},Ju=class extends U{return_token_type_ids=!0},Yu=class extends U{return_token_type_ids=!0},Xu=class extends U{},Zu=class extends U{return_token_type_ids=!0},Qu=class extends U{},$u=class extends U{},ed=class extends U{},td=class extends U{},nd=class extends U{},rd=class extends U{return_token_type_ids=!0},id=class extends U{padding_side=`left`},ad=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^__[a-z]{2,3}__$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e.slice(2,-2)),this.lang_to_token=e=>`__${e}__`}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},od=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^(>>\w+<<)\s*/g,this.supported_language_codes=Array.from(this.get_vocab().keys()).filter(e=>this.languageRegex.test(e)),A.warn('WARNING: `MarianTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}_encode_text(e){if(e===null)return null;let[t,...n]=e.trim().split(this.languageRegex);if(n.length===0)return super._encode_text(t);if(n.length===2){let[e,t]=n;return this.supported_language_codes.includes(e)||A.warn(`Unsupported language code "${e}" detected, which may lead to unexpected behavior. Should be one of: ${JSON.stringify(this.supported_language_codes)}`),ai([e],super._encode_text(t))}}},sd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{2}_[A-Z]{2}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)).map(e=>e),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},cd=class extends sd{},ld=class extends U{},ud=class extends U{return_token_type_ids=!0},dd=class extends U{},fd=class extends U{constructor(e,t){super(e,t),this.languageRegex=/^[a-z]{3}_[A-Z][a-z]{3}$/,this.language_codes=this.all_special_tokens.filter(e=>this.languageRegex.test(e)),this.lang_to_token=e=>e}_build_translation_inputs(e,t,n){return Nu(this,e,t,n)}},pd=class extends U{},md=class extends U{},hd=class extends U{},gd=class extends U{return_token_type_ids=!0},_d=class extends U{},vd=class extends U{},yd=class extends U{return_token_type_ids=!0},bd=class extends U{},xd=class extends mo{decode_chain(e){let t=``;for(let n=1;n[t,e]),[`burmese`,`my`],[`valencian`,`ca`],[`flemish`,`nl`],[`haitian`,`ht`],[`letzeburgesch`,`lb`],[`pushto`,`ps`],[`panjabi`,`pa`],[`moldavian`,`ro`],[`moldovan`,`ro`],[`sinhalese`,`si`],[`castilian`,`es`]]);function Dd(e){e=e.toLowerCase();let t=Ed.get(e);if(t===void 0){let n=e.match(/^<\|([a-z]{2})\|>$/);if(n&&(e=n[1]),Td.has(e))t=e;else{let t=e.length===2?Td.keys():Td.values();throw Error(`Language "${e}" is not supported. Must be one of: ${JSON.stringify(Array.from(t))}`)}}return t}var Od=/* @__PURE__ */ RegExp(`^[\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E]+$`,`gu`),kd=.1,Ad=class extends U{get timestamp_begin(){return this._tokenizer.token_to_id(`<|notimestamps|>`)+1}_decode_asr(e,{return_timestamps:t=!1,return_language:n=!1,time_precision:r=null,force_full_sequences:i=!0}={}){if(r===null)throw Error(`Must specify time_precision`);let a=null,o=t===`word`;function s(){return{language:a,timestamp:[null,null],text:``}}let c=[],l=s(),u=0,d=this.timestamp_begin,f=d+1500,p=[],m=[],h=!1,g=null,_=new Set(this.all_special_ids);for(let n of e){let e=n.tokens,i=o?n.token_timestamps:null,v=null,y=d;if(`stride`in n){let[t,i,a]=n.stride;if(u-=i,g=t-a,i&&(y=i/r+d),a)for(let t=e.length-1;t>=0;--t){let n=Number(e[t]);if(n>=d){if(v!==null&&(n-d)*r=d&&g<=f){let e=hl((g-d)*r+u,2);if(v!==null&&g>=v)h=!0;else if(h||p.length>0&&g0&&l.timestamp[1]!==null))for(let e of l.words)e.timestamp[1]>l.timestamp[1]&&l.timestamp[1]>=e.timestamp[0]&&(e.timestamp[1]=l.timestamp[1]);c.push(l),p=[],b=[],m=[],x=[],l=s()}}else if(b.push(g),o){let e=hl(i[n]+u,2),t;if(n+10?(p.push(b),o&&m.push(x)):p.every(e=>e.length===0)&&(l=s(),p=[],b=[],m=[],x=[])}if(p.length>0){if(i&&t)throw Error(`Whisper did not predict an ending timestamp, which can happen if audio is cut off in the middle of a word. Also make sure WhisperTimeStampLogitsProcessor was used during generation.`);let[e,n]=this.findLongestCommonSequence(p,m),r=this.decode(e);l.text=r,o&&(l.words=this.collateWordTimestamps(e,n,a)),c.push(l)}let v=/* @__PURE__ */ Object.create(null),y=c.map(e=>e.text).join(``);if(t||n){for(let e=0;e0,o=a?[]:null,s=a?t[0]:null;for(let c=1;ce===g[n]&&s[i+n][0]-kd<=t[c][m+n][0]).length:p.filter((e,t)=>e===g[t]).length;let v=e/1e4,y=_/e+v;_>1&&y>u&&(u=y,d=[i,o,m,h])}let[p,m,h,g]=d,_=Math.floor((m+p)/2),v=Math.floor((g+h)/2);if(a&&u===0&&r>0){let e=s[r-1][0],n=t[c].findIndex(t=>t[0]>=e);v=n===-1?l.length:n}i.push(...n.slice(0,_)),n=l.slice(v),r=n.length,a&&(o.push(...s.slice(0,_)),s=t[c].slice(v))}return i.push(...n),a?(o.push(...s),[i,o]):[i,[]]}collateWordTimestamps(e,t,n){let[r,i,a]=this.combineTokensIntoWords(e,n),o=[];for(let e=0;e=r){let e=((t-r)*n).toFixed(2);i.push(`<|${e}|>`),i.push([])}else i[i.length-1].push(t);return i=i.map(e=>typeof e==`string`?e:super.decode(e,t)),i.join(``)}splitTokensOnUnicode(e){let t=this.decode(e,{decode_with_timestamps:!0}),n=[],r=[],i=[],a=[],o=[],s=0;for(let c=0;c=this._tokenizer.token_to_id(`<|endoftext|>`),d=s.startsWith(` `),f=s.trim(),p=Od.test(f);if(u||d||p||i.length===0)i.push(s),a.push(c),o.push(l);else{let e=i.length-1;i[e]+=s,a[e].push(...c),o[e].push(...l)}}return[i,a,o]}mergePunctuations(e,t,n,r,i){let a=structuredClone(e),o=structuredClone(t),s=structuredClone(n),c=a.length-2,l=a.length-1;for(;c>=0;)a[c].startsWith(` `)&&r.includes(a[c].trim())?(a[l]=a[c]+a[l],o[l]=ai(o[c],o[l]),s[l]=ai(s[c],s[l]),a[c]=``,o[c]=[],s[c]=[]):l=c,--c;for(c=0,l=1;le),o.filter(e=>e.length>0),s.filter(e=>e.length>0)]}},jd=class extends U{},Md=class extends U{return_token_type_ids=!0;constructor(e,t){super(e,t),A.warn('WARNING: `XLMTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}},W=class{static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`}={}){let[o,s]=await Eu(e,{progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a}),c=s.tokenizer_class?.replace(/Fast$/,``)??`PreTrainedTokenizer`,l=Pu[c];return l||=(A.warn(`Unknown tokenizer class "${c}", attempting to construct from base class.`),U),new l(o,s)}},Nd=`https://github.com/huggingface/transformers.js/issues/new/choose`,Pd=`preprocessor_config.json`,Fd=`preprocessor_config.json`,Id=`processor_config.json`,Ld=`chat_template.jinja`,G=class extends $r{static classes=[`image_processor_class`,`tokenizer_class`,`feature_extractor_class`];static uses_processor_config=!1;static uses_chat_template_file=!1;constructor(e,t,n){super(),this.config=e,this.components=t,this.chat_template=n}get image_processor(){return this.components.image_processor}get tokenizer(){return this.components.tokenizer}get feature_extractor(){return this.components.feature_extractor}apply_chat_template(e,t={}){if(!this.tokenizer)throw Error(`Unable to apply chat template without a tokenizer.`);return this.tokenizer.apply_chat_template(e,{tokenize:!1,chat_template:this.chat_template??void 0,...t})}batch_decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.batch_decode(...e)}decode(...e){if(!this.tokenizer)throw Error(`Unable to decode without a tokenizer.`);return this.tokenizer.decode(...e)}async _call(e,...t){for(let n of[this.image_processor,this.feature_extractor,this.tokenizer])if(n)return n(e,...t);throw Error(`No image processor, feature extractor, or tokenizer found.`)}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([this.uses_processor_config?rl(e,Id,!0,t):{},Promise.all(this.classes.filter(e=>e in this).map(async n=>{let r=await this[n].from_pretrained(e,t);return[n.replace(/_class$/,``),r]})).then(Object.fromEntries),this.uses_chat_template_file?nl(e,Ld,!0,t):null]);return new this(n,r,i)}};Sr({},{ChatterboxProcessor:()=>Mf,CohereAsrProcessor:()=>Pf,Florence2Processor:()=>Sm,Gemma3Processor:()=>Cm,Gemma3nProcessor:()=>wm,Gemma4Processor:()=>Tm,Glm46VProcessor:()=>Dm,GraniteSpeechProcessor:()=>Om,GroundingDinoProcessor:()=>Am,Idefics3Processor:()=>Pm,JinaCLIPProcessor:()=>Im,Lfm2VlProcessor:()=>Lm,LlavaProcessor:()=>Rm,MgpstrProcessor:()=>Bm,MoonshineProcessor:()=>Vm,OwlViTProcessor:()=>Hm,PaliGemmaProcessor:()=>Gm,Phi3VProcessor:()=>Jm,PixtralProcessor:()=>Ym,Processor:()=>G,PyAnnoteProcessor:()=>Xm,Qwen2VLProcessor:()=>Em,Qwen2_5_VLProcessor:()=>Zm,Qwen3VLProcessor:()=>Qm,Sam2Processor:()=>eh,Sam2VideoProcessor:()=>th,SamProcessor:()=>$m,SmolVLMProcessor:()=>Pm,SpeechT5Processor:()=>nh,UltravoxProcessor:()=>rh,VLChatProcessor:()=>Fm,VoxtralProcessor:()=>ch,VoxtralRealtimeProcessor:()=>mh,Wav2Vec2Processor:()=>hh,Wav2Vec2ProcessorWithLM:()=>gh,WhisperProcessor:()=>_h});var Rd=class extends $r{constructor(e){super(),this.config=e}static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t);return new this(n)}};function zd(e,t){if(!(e instanceof Float32Array||e instanceof Float64Array))throw Error(`${t} expects input to be a Float32Array or a Float64Array, but got ${e?.constructor?.name??typeof e} instead. If using the feature extractor directly, remember to use \`load_audio(url, sampling_rate)\` to obtain the raw audio data of the file/url.`)}var Bd={};Sr(Bd,{ASTFeatureExtractor:()=>df,ChatterboxFeatureExtractor:()=>pf,ClapFeatureExtractor:()=>mf,CohereAsrFeatureExtractor:()=>_f,DacFeatureExtractor:()=>vf,EncodecFeatureExtractor:()=>ff,FeatureExtractor:()=>Rd,Gemma3nAudioFeatureExtractor:()=>yf,Gemma4AudioFeatureExtractor:()=>bf,GraniteSpeechFeatureExtractor:()=>xf,MoonshineFeatureExtractor:()=>Sf,ParakeetFeatureExtractor:()=>gf,PyAnnoteFeatureExtractor:()=>Cf,SeamlessM4TFeatureExtractor:()=>wf,SnacFeatureExtractor:()=>Tf,SpeechT5FeatureExtractor:()=>Ef,VoxtralRealtimeFeatureExtractor:()=>kf,Wav2Vec2FeatureExtractor:()=>Df,WeSpeakerFeatureExtractor:()=>Of,WhisperFeatureExtractor:()=>Af});var Vd={fromWeb:()=>{}};async function Hd(e,t){if(O.IS_BROWSER_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save a file from a Web Worker.`);let n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e,r.click(),r.remove(),URL.revokeObjectURL(n)}else if(O.IS_FS_AVAILABLE){let n=t.stream();Vd.fromWeb(n),Cr.createWriteStream(e),await void 0}else throw Error(`Unable to save because filesystem is disabled in this environment.`)}async function Ud(e,t){if(typeof AudioContext>`u`)throw Error("Unable to load audio from path/URL since `AudioContext` is not available in your environment. Instead, audio data should be passed directly to the pipeline/processor. For more information and some example code, see https://huggingface.co/docs/transformers.js/guides/node-audio-processing.");let n=await(await Jc(e)).arrayBuffer(),r=new AudioContext({sampleRate:t});t===void 0&&A.warn(`No sampling rate provided, using default of ${r.sampleRate}Hz.`);let i=await r.decodeAudioData(n),a;if(i.numberOfChannels===2){let e=Math.sqrt(2),t=i.getChannelData(0),n=i.getChannelData(1);a=new Float32Array(t.length);for(let r=0;r2595*Math.log10(1+e/700),kaldi:e=>1127*Math.log(1+e/700),slaney:(e,t=1e3,n=15,r=27/Math.log(6.4))=>e>=t?n+Math.log(e/t)*r:3*e/200};function Yd(e,t=`htk`){let n=Jd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}var Xd={htk:e=>700*(10**(e/2595)-1),kaldi:e=>700*(Math.exp(e/1127)-1),slaney:(e,t=1e3,n=15,r=Math.log(6.4)/27)=>e>=n?t*Math.exp(r*(e-n)):200*e/3};function Zd(e,t=`htk`){let n=Xd[t];if(!n)throw Error(`mel_scale should be one of "htk", "slaney" or "kaldi".`);return typeof e==`number`?n(e):e.map(e=>n(e))}function Qd(e,t){let n=Float64Array.from({length:t.length-1},(e,n)=>t[n+1]-t[n]),r=Array.from({length:e.length},()=>Array(t.length));for(let n=0;nArray(e.length));for(let t=0;te+r*n)}function ef(e,t,n,r,i,a=null,o=`htk`,s=!1){if(a!==null&&a!==`slaney`)throw Error(`norm must be one of null or "slaney"`);if(e<2)throw Error(`Require num_frequency_bins: ${e} >= 2`);if(n>r)throw Error(`Require min_frequency: ${n} <= max_frequency: ${r}`);let c=$d(Yd(n,o),Yd(r,o),t+2),l=Zd(c,o),u;if(s){let t=i/((e-1)*2);u=Yd(Float64Array.from({length:e},(e,n)=>n*t),o),l=c}else u=$d(0,Math.floor(i/2),e);let d=Qd(u,l);if(a!==null&&a===`slaney`)for(let n=0;ni)throw Error(`frame_length (${n}) may not be larger than fft_length (${i})`);if(w!==n)throw Error(`Length of the window (${w}) must equal frame_length (${n})`);if(r<=0)throw Error(`hop_length must be greater than zero`);if(a===null&&d!==null)throw Error("You have provided `mel_filters` but `power` is `None`. Mel spectrogram computation is not yet supported for complex-valued spectrogram. Specify `power` to fix this issue.");if(!u)throw Error("`preemphasis_htk_flavor=false` is not currently supported.");if(o){let t=Math.floor(n/2);switch(s){case`reflect`:e=tf(e,t,t);break;case`constant`:{let n=new e.constructor(e.length+2*t);n.set(e,t),e=n;break}case`semicausal`:{let n=new e.constructor(e.length+t);n.set(e,t),e=n;break}default:throw Error(`pad_mode="${s}" not implemented yet.`)}}let te=Math.floor(1+Math.floor((e.length-n)/r));y!==null&&tete?x&&(ie=b):ie=re=b);let ae=new pl(i),oe=new Float64Array(i),se=new Float64Array(ae.outputBufferSize),ce=new Float32Array(ne*ie);for(let i=0;i=1;--e)oe[e]-=l*oe[e-1];oe[0]*=1-l}for(let e=0;ee**.85);break;default:throw Error(`Unknown window type ${t}.`)}if(n&&(o=o.subarray(0,e)),r===null||e===r)return o;if(e>r)throw Error(`Length of the window (${e}) may not be larger than frame_length (${r})`);let s=new Float64Array(r),c=i?Math.floor((r-e)/2):0;return s.set(o,c),s}function cf(e,t){let n=e.reduce((e,t)=>e+t.length,0),r=/* @__PURE__ */ new ArrayBuffer(44),i=new DataView(r);return lf(i,0,`RIFF`),i.setUint32(4,36+n*4,!0),lf(i,8,`WAVE`),lf(i,12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,3,!0),i.setUint16(22,1,!0),i.setUint32(24,t,!0),i.setUint32(28,t*4,!0),i.setUint16(32,4,!0),i.setUint16(34,32,!0),lf(i,36,`data`),i.setUint32(40,n*4,!0),new Blob([r,...e.map(e=>e.buffer instanceof ArrayBuffer?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e.slice())],{type:`audio/wav`})}function lf(e,t,n){for(let r=0;re+t.length,0),t=new Float32Array(e),n=0;for(let e of this.audio)t.set(e,n),n+=e.length;return t}return this.audio}toBlob(){let e=this.audio;return e instanceof Float32Array&&(e=[e]),cf(e,this.sampling_rate)}async save(e){return Hd(e,this.toBlob())}},df=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hann`,{periodic:!1}),this.mean=this.config.mean,this.std=this.config.std}async _extract_fbank_features(e,t){return of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e){zd(e,`ASTFeatureExtractor`);let t=await this._extract_fbank_features(e,this.config.max_length);if(this.config.do_normalize){let e=this.std*2,n=t.data;for(let t=0;t0){if(n===`rand_trunc`){let n=Math.floor(bc.random()*(a+1));e=e.subarray(n,n+t),i=await this._extract_fbank_features(e,this.mel_filters_slaney,this.config.nb_max_samples)}else throw Error(`Truncation strategy "${n}" not implemented`)}else{if(a<0){let n=new Float64Array(t);if(n.set(e),r===`repeat`)for(let r=e.length;r=1;--n)e[n]-=t*e[n-1];return await of(e,this.window,this.window.length,this.config.hop_length,{fft_length:this.config.n_fft,power:2,mel_filters:this.config.mel_filters,log_mel:`log`,mel_floor:-1/0,pad_mode:`constant`,center:!0,transpose:!0,mel_offset:2**-24})}async _call(e){zd(e,`ParakeetFeatureExtractor`);let t=await this._extract_fbank_features(e),n=Math.floor((e.length+Math.floor(this.config.n_fft/2)*2-this.config.n_fft)/this.config.hop_length),r=t.data;r.fill(0,n*t.dims[1]);let[i,a]=t.dims,o=new Float64Array(a),s=new Float64Array(a);for(let e=0;e1?n-1:1;for(let e=0;e=l){s.push(e.slice(c,l));break}let t=Math.max(c,c+a-o),n=Math.min(c+a,l),i;i=n<=t?c+a:this._find_split_point_energy(e,t,n,r),i=Math.max(c+1,Math.min(i,l)),s.push(e.slice(c,i)),c=i}return s}_find_split_point_energy(e,t,n,r){let i=n-t;if(i<=r)return Math.floor((t+n)/2);let a=1/0,o=t,s=i-r;for(let n=0;n<=s;n+=r){let i=0;for(let a=0;at&&(e=e.slice(0,t)),r&&e.length%i!==0){let t=i-e.length%i,n=new Float64Array(e.length+t);n.set(e),this.config.padding_value!==0&&n.fill(this.config.padding_value,e.length),e=n}let a=await this._extract_fbank_features(e,this.config.max_length),o=_u([1,a.dims[0]],!0);return{input_features:a.unsqueeze_(0),input_features_mask:o}}},bf=class extends yf{async _extract_fbank_features(e,t){let{frame_length:n,hop_length:r,fft_length:i}=this.config,a=Math.floor(n/2),o=Math.floor((e.length+a-(n+1))/r)+1;return of(e,this.window,n,r,{fft_length:i,center:!0,pad_mode:`semicausal`,onesided:!0,preemphasis:this.config.preemphasis,preemphasis_htk_flavor:this.config.preemphasis_htk_flavor,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:this.config.mel_floor,mel_floor_mode:`add`,remove_dc_offset:!1,transpose:!0,max_num_frames:o})}async _call(e,t={}){zd(e,`Gemma4AudioFeatureExtractor`);let n=e.length,r=await super._call(e,t),{input_features:i}=r,[,a,o]=i.dims,{frame_length:s,hop_length:c}=this.config,l=Math.floor(s/2),u=s+1,d=new Uint8Array(n+l+(t.pad_to_multiple_of??128));d.fill(1,l,l+n);let f=new Uint8Array(a);for(let e=0;e({id:e,start:t*n,end:r*n,confidence:i/(r-t)})))}return r}},wf=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`povey`,{periodic:!1})}async _extract_fbank_features(e,t){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,max_num_frames:t,transpose:!0})}async _call(e,{padding:t=!0,pad_to_multiple_of:n=2,do_normalize_per_mel_bins:r=!0,return_attention_mask:i=!0}={}){zd(e,`SeamlessM4TFeatureExtractor`);let a=await this._extract_fbank_features(e,this.config.max_length);if(r){let[e,t]=a.dims,n=a.data;for(let r=0;r0){let n=new Float32Array(t*(e+s));n.set(r),n.fill(this.config.padding_value,r.length);let c=e+s;a=new V(a.type,n,[c,t]),i&&(o=new V(`int64`,new BigInt64Array(c),[1,c]),o.data.fill(1n,0,e))}}let[s,c]=a.dims,l=this.config.stride;if(s%l!==0)throw Error(`The number of frames (${s}) must be a multiple of the stride (${l}).`);let u=a.view(1,Math.floor(s/l),c*l),d={input_features:u};if(i){let e=u.dims[1],t=new BigInt64Array(e);if(o){let e=o.data;for(let n=1,r=0;ne+t,0)/e.length,n=e.reduce((e,n)=>e+(n-t)**2,0)/e.length;return e.map(e=>(e-t)/Math.sqrt(n+1e-7))}async _call(e){zd(e,`Wav2Vec2FeatureExtractor`),e instanceof Float64Array&&(e=new Float32Array(e));let t=e;this.config.do_normalize&&(t=this._zero_mean_unit_var_norm(t));let n=[1,t.length];return{input_values:new V(`float32`,t,n),attention_mask:new V(`int64`,new BigInt64Array(t.length).fill(1n),n)}}},Of=class extends Rd{constructor(e){super(e);let t=this.config.sampling_rate,n=ef(257,this.config.num_mel_bins,20,Math.floor(t/2),t,null,`kaldi`,!0);this.mel_filters=n,this.window=sf(400,`hamming`,{periodic:!1}),this.min_num_frames=this.config.min_num_frames}async _extract_fbank_features(e){return e=e.map(e=>e*32768),of(e,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:.97,mel_filters:this.mel_filters,log_mel:`log`,mel_floor:1.192092955078125e-7,remove_dc_offset:!0,transpose:!0,min_num_frames:this.min_num_frames})}async _call(e){zd(e,`WeSpeakerFeatureExtractor`);let t=(await this._extract_fbank_features(e)).unsqueeze_(0);if(this.config.fbank_centering_span===null){let e=t.mean(1).data,n=t.data,[r,i,a]=t.dims;for(let t=0;tr?(e.length>this.config.n_samples&&A.warn("Attempting to extract features for audio longer than 30 seconds. If using a pipeline to extract transcript from a long audio clip, remember to specify `chunk_length_s` and/or `stride_length_s`."),n=e.slice(0,r)):(n=new Float32Array(r),n.set(e)),{input_features:(await this._extract_fbank_features(n)).unsqueeze_(0)}}},jf=class{static async from_pretrained(e,t={}){let n=await rl(e,Pd,!0,t),r=n.feature_extractor_type,i=Bd[r];if(!i)throw Error(`Unknown feature_extractor_type: '${r}'. Please report this at ${Nd}.`);return new i(n)}},Mf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;async _call(e,t=null){let n=this.tokenizer(e),r=t?await this.feature_extractor(t):{};return{...n,...r}}},Nf=/* @__PURE__ */ new Set([`ja`,`zh`]),Pf=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;get_decoder_prompt_ids(e=`en`){let t=[`▁`,`<|startofcontext|>`,`<|startoftranscript|>`,`<|emo:undefined|>`,`<|${e}|>`,`<|${e}|>`,`<|pnc|>`,`<|noitn|>`,`<|notimestamp|>`,`<|nodiarize|>`];return this.tokenizer.convert_tokens_to_ids(t)}static join_chunks(e,t=`en`){let n=e.filter(e=>e&&e.trim());if(n.length===0)return``;let r=Nf.has(t)?``:` `;return[n[0].trimEnd(),...n.slice(1).map(e=>e.trim())].join(r)}async _call(e){return await this.feature_extractor(e)}},Ff={},If,Lf,Rf;if(O.IS_WEB_ENV)If=(e,t)=>{if(!self.OffscreenCanvas)throw Error(`OffscreenCanvas not supported by this environment.`);return new self.OffscreenCanvas(e,t)},Rf=self.createImageBitmap,Lf=self.ImageData;else if(Ff)Rf=async e=>{let t=(await e.metadata()).channels,{data:n,info:r}=await e.rotate().raw().toBuffer({resolveWithObject:!0}),i=new Vf(new Uint8ClampedArray(n),r.width,r.height,r.channels);return t!==void 0&&t!==r.channels&&i.convert(t),i};else throw Error(`Unable to load image processing library.`);var zf={0:`nearest`,1:`lanczos`,2:`bilinear`,3:`bicubic`,4:`box`,5:`hamming`},Bf=/* @__PURE__ */ new Map([[`png`,`image/png`],[`jpg`,`image/jpeg`],[`jpeg`,`image/jpeg`],[`gif`,`image/gif`]]),Vf=class e{constructor(e,t,n,r){this.data=e,this.width=t,this.height=n,this.channels=r}get size(){return[this.width,this.height]}static async read(t){if(t instanceof e)return t;if(typeof t==`string`||t instanceof URL)return await this.fromURL(t);if(t instanceof Blob)return await this.fromBlob(t);if(typeof HTMLCanvasElement<`u`&&t instanceof HTMLCanvasElement||typeof OffscreenCanvas<`u`&&t instanceof OffscreenCanvas)return this.fromCanvas(t);throw Error(`Unsupported input type: ${typeof t}`)}static fromCanvas(t){if(!O.IS_WEB_ENV)throw Error(`fromCanvas() is only supported in browser environments.`);let n=t.getContext(`2d`).getImageData(0,0,t.width,t.height).data;return new e(n,t.width,t.height,4)}static async fromURL(e){let t=await Jc(e);if(t.status!==200)throw Error(`Unable to read image from "${e}" (${t.status} ${t.statusText})`);let n=await t.blob();return this.fromBlob(n)}static async fromBlob(e){if(O.IS_WEB_ENV){let t=await Rf(e),n=If(t.width,t.height).getContext(`2d`);return n.drawImage(t,0,0),new this(n.getImageData(0,0,t.width,t.height).data,t.width,t.height,4)}{let t=Ff(await e.arrayBuffer());return await Rf(t)}}static fromTensor(t,n=`CHW`){if(t.dims.length!==3)throw Error(`Tensor should have 3 dimensions, but has ${t.dims.length} dimensions.`);if(n===`CHW`)t=t.permute(1,2,0);else if(n!==`HWC`)throw Error(`Unsupported channel format: ${n}`);if(!(t.data instanceof Uint8ClampedArray||t.data instanceof Uint8Array))throw Error(`Unsupported tensor type: ${t.type}`);switch(t.dims[2]){case 1:case 2:case 3:case 4:return new e(t.data,t.dims[1],t.dims[0],t.dims[2]);default:throw Error(`Unsupported number of channels: ${t.dims[2]}`)}}grayscale(){if(this.channels===1)return this;let e=new Uint8ClampedArray(this.width*this.height*1);switch(this.channels){case 3:case 4:for(let t=0,n=0;t=0?c=r:u=-r,i>=0?l=i:d=-i,s.drawImage(o,c,l,t,n,u,d,t,n),new e(s.getImageData(0,0,t,n).data,t,n,4).convert(a)}{let e=this.toSharp();if(r>=0&&i>=0)e=e.extract({left:Math.floor(r),top:Math.floor(i),width:t,height:n});else if(r<=0&&i<=0){let a=Math.floor(-i),o=Math.floor(-r);e=e.extend({top:a,left:o,right:t-this.width-o,bottom:n-this.height-a})}else{let a=[0,0],o=0;i<0?(a[0]=Math.floor(-i),a[1]=n-this.height-a[0]):o=Math.floor(i);let s=[0,0],c=0;r<0?(s[0]=Math.floor(-r),s[1]=t-this.width-s[0]):c=Math.floor(r),e=e.extend({top:a[0],bottom:a[1],left:s[0],right:s[1]}).extract({left:c,top:o,width:t,height:n})}return await Rf(e)}}async toBlob(e=`image/png`,t=1){if(!O.IS_WEB_ENV)throw Error(`toBlob() is only supported in browser environments.`);return await this.toCanvas().convertToBlob({type:e,quality:t})}toTensor(e=`CHW`){let t=new V(`uint8`,new Uint8Array(this.data),[this.height,this.width,this.channels]);if(e!==`HWC`){if(e===`CHW`)t=t.permute(2,0,1);else throw Error(`Unsupported channel format: ${e}`)}return t}toCanvas(){if(!O.IS_WEB_ENV)throw Error(`toCanvas() is only supported in browser environments.`);let e=this.clone().rgba(),t=If(e.width,e.height),n=new Lf(e.data,e.width,e.height);return t.getContext(`2d`).putImageData(n,0,0),t}split(){let{data:t,width:n,height:r,channels:i}=this,a=t.constructor,o=t.length/i,s=Array.from({length:i},()=>new a(o));for(let e=0;enew e(t,n,r,1))}_update(e,t,n,r=null){return this.data=e,this.width=t,this.height=n,r!==null&&(this.channels=r),this}clone(){return new e(this.data.slice(),this.width,this.height,this.channels)}convert(e){if(this.channels===e)return this;switch(e){case 1:this.grayscale();break;case 3:this.rgb();break;case 4:this.rgba();break;default:throw Error(`Conversion failed due to unsupported number of channels: ${this.channels}`)}return this}async save(e){if(O.IS_WEB_ENV){if(O.IS_WEBWORKER_ENV)throw Error(`Unable to save an image from a Web Worker.`);let t=e.split(`.`).pop().toLowerCase(),n=Bf.get(t)??`image/png`;return Hd(e,await this.toBlob(n))}if(O.IS_FS_AVAILABLE)await this.toSharp().toFile(e);else throw Error(`Unable to save the image because filesystem is disabled in this environment.`)}toSharp(){if(O.IS_WEB_ENV)throw Error(`toSharp() is only supported in server-side environments.`);return Ff(this.data,{raw:{width:this.width,height:this.height,channels:this.channels}})}};Vf.read.bind(Vf);function Hf(e,t,n=0,r=null){let i=e/t,a=gl(i)*t;return r!==null&&a>r&&(a=Math.floor(i)*t),at&&i.push(e)}else{let e=ll(n.data)[1];if(e===c-1||(a=ol(n.data),a[e]e*o[(t+1)%2])),u.boxes.push(n),u.classes.push(t),u.scores.push(a[t])}}l.push(u)}return l}function Kf(e,t=null){let n=e.logits,r=n.dims[0];if(t!==null&&t.length!==r)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let i=[];for(let e=0;el[n]&&(l[n]=t[n],u[n]=e)}let d=Array(a.dims[0]);for(let e=0;ee!==void 0);i.push({segmentation:c,labels:f})}return i}function qf(e,t,n,r){let i=[],a=[],o=[];for(let s=0;sn&&(i.push(l),a.push(d),o.push(u))}return[i,a,o]}function Jf(e,t,n,r=.5,i=.8){let a=[],o=0,s=0,c=t[n].data;for(let t=0;t=r&&++s;let l=o>0&&s>0;return l&&=o/s>i,[l,a]}function Yf(e,t,n,r,i,a=null,o=null){let[s,c]=o??e[0].dims,l=new V(`int32`,new Int32Array(s*c),[s,c]),u=[];if(o!==null)for(let t=0;tf[e]&&(d[e]=n,f[e]=i[e])}let p=0,m=l.data;for(let a=0;a200)throw Error(`absolute aspect ratio must be smaller than 200, got ${Math.max(e,t)/Math.min(e,t)}`);let o=Math.round(e/n)*n,s=Math.round(t/n)*n;if(a*o*s>i){let r=Math.sqrt(a*e*t/i);o=Math.max(n,Math.floor(e/r/n)*n),s=Math.max(n,Math.floor(t/r/n)*n)}else if(a*o*si?c=Math.floor(i*s/r):i>r&&(s=Math.floor(r*c/i)),await e.resize(c,s,{resample:n}))}async crop_margin(e,t=200){let n=e.clone().grayscale(),r=cl(n.data)[0],i=ll(n.data)[0]-r;if(i===0)return e;let a=t/255,o=n.width,s=n.height,c=0,l=0,u=n.data;for(let e=0;ethis.preprocess(e)));return{pixel_values:du(n.map(e=>e.pixel_values),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}static async from_pretrained(e,t={}){let n=await rl(e,Fd,!0,t);return new this(n)}},$f={};Sr($f,{BeitFeatureExtractor:()=>ep,BitImageProcessor:()=>tp,CHMv2ImageProcessor:()=>rp,CLIPFeatureExtractor:()=>ap,CLIPImageProcessor:()=>ip,ChineseCLIPFeatureExtractor:()=>np,ConvNextFeatureExtractor:()=>sp,ConvNextImageProcessor:()=>op,DINOv3ViTImageProcessor:()=>fp,DPTFeatureExtractor:()=>gp,DPTImageProcessor:()=>hp,DeiTFeatureExtractor:()=>lp,DeiTImageProcessor:()=>cp,DetrFeatureExtractor:()=>dp,DetrImageProcessor:()=>up,DonutFeatureExtractor:()=>mp,DonutImageProcessor:()=>pp,EfficientNetImageProcessor:()=>_p,GLPNFeatureExtractor:()=>wp,Gemma3ImageProcessor:()=>vp,Gemma4ImageProcessor:()=>xp,Glm46VImageProcessor:()=>Cp,GroundingDinoImageProcessor:()=>Tp,Idefics3ImageProcessor:()=>Ep,ImageFeatureExtractor:()=>K,ImageProcessor:()=>K,JinaCLIPImageProcessor:()=>Op,Lfm2VlImageProcessor:()=>Pp,LlavaOnevisionImageProcessor:()=>Fp,Mask2FormerImageProcessor:()=>Rp,MaskFormerFeatureExtractor:()=>Lp,MaskFormerImageProcessor:()=>Ip,MobileNetV1FeatureExtractor:()=>Bp,MobileNetV1ImageProcessor:()=>zp,MobileNetV2FeatureExtractor:()=>Hp,MobileNetV2ImageProcessor:()=>Vp,MobileNetV3FeatureExtractor:()=>Wp,MobileNetV3ImageProcessor:()=>Up,MobileNetV4FeatureExtractor:()=>Kp,MobileNetV4ImageProcessor:()=>Gp,MobileViTFeatureExtractor:()=>Jp,MobileViTImageProcessor:()=>qp,NougatImageProcessor:()=>Yp,OwlViTFeatureExtractor:()=>Zp,OwlViTImageProcessor:()=>Xp,Owlv2ImageProcessor:()=>Qp,Phi3VImageProcessor:()=>im,PixtralImageProcessor:()=>am,PvtImageProcessor:()=>om,Qwen2VLImageProcessor:()=>Sp,RTDetrImageProcessor:()=>sm,Sam2ImageProcessor:()=>cm,Sam3ImageProcessor:()=>cm,SamImageProcessor:()=>cm,SapiensFeatureExtractor:()=>um,SapiensImageProcessor:()=>lm,SegformerFeatureExtractor:()=>fm,SegformerImageProcessor:()=>dm,SiglipImageProcessor:()=>pm,SmolVLMImageProcessor:()=>Ep,Swin2SRImageProcessor:()=>mm,VLMImageProcessor:()=>Dp,ViTFeatureExtractor:()=>gm,ViTImageProcessor:()=>hm,VitMatteImageProcessor:()=>_m,VitPoseImageProcessor:()=>vm,YolosFeatureExtractor:()=>bm,YolosImageProcessor:()=>ym});var ep=class extends K{},tp=class extends K{},np=class extends K{},rp=class extends K{},ip=class extends K{},ap=class extends ip{},op=class extends K{constructor(e){super(e),this.crop_pct=this.config.crop_pct??224/256}async resize(e){let t=this.size?.shortest_edge;if(t===void 0)throw Error(`Size dictionary must contain 'shortest_edge' key.`);if(t<384){let n=Math.floor(t/this.crop_pct),[r,i]=this.get_resize_output_image_size(e,{shortest_edge:n});e=await e.resize(r,i,{resample:this.resample}),e=await e.center_crop(t,t)}else e=await e.resize(t,t,{resample:this.resample});return e}},sp=class extends op{},cp=class extends K{},lp=class extends cp{},up=class extends K{async _call(e){let t=await super._call(e),n=_u([t.pixel_values.dims[0],64,64],1n);return{...t,pixel_mask:n}}post_process_object_detection(...e){return Gf(...e)}post_process_panoptic_segmentation(...e){return Zf(...e)}post_process_instance_segmentation(...e){return Qf(...e)}},dp=class extends up{},fp=class extends K{},pp=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t,s=this.image_mean;Array.isArray(this.image_mean)||(s=Array(o).fill(s));let c=this.image_std;Array.isArray(c)||(c=Array(o).fill(s));let l=s.map((e,t)=>-e/c[t]);return super.pad_image(e,t,n,{center:!0,constant_values:l,...r})}},mp=class extends pp{},hp=class extends K{},gp=class extends hp{},_p=class extends K{constructor(e){super(e),this.include_top=this.config.include_top??!0,this.include_top&&(this.image_std=this.image_std.map(e=>e*e))}},vp=class extends K{};function yp(e,t,n,r,i){let a=r*n**2,o=Math.sqrt(a/(e*t)),s=i*n,c=Math.floor(o*e/s)*s,l=Math.floor(o*t/s)*s;if(c===0&&l===0)throw Error(`Attempting to resize to a 0 x 0 image. Resized height should be divisible by \`pooling_kernel_size * patch_size\`=${s}.`);let u=Math.floor(r/i**2)*s;return c===0?(c=s,l=Math.min(Math.floor(t/e)*s,u)):l===0&&(l=s,c=Math.min(Math.floor(e/t)*s,u)),[c,l]}function bp(e,t,n,r,i,a,o){let s=Math.floor(t/i),c=Math.floor(n/i),l=s*c,u=i*i*r,d=new Float32Array(a*u),f=0;for(let t=0;ta),0));let l=a.dims[0]/o,u=a.dims[1],d=Math.floor(a.dims[2]/c),f=Math.floor(a.dims[3]/c);return{pixel_values:a.view(l,o,u,Math.floor(d/s),s,c,Math.floor(f/s),s,c).permute(0,3,6,4,7,2,1,5,8).view(l*d*f,u*o*c*c),image_grid_thw:new V(`int64`,[l,d,f],[1,3]),original_sizes:r,reshaped_input_sizes:i}}},Cp=class extends Sp{get_resize_output_image_size(e,t){let n=this.patch_size*this.merge_size,r=this.config.temporal_patch_size??2;return Xf(e.height,e.width,n,this.min_pixels,this.max_pixels,r)}},wp=class extends K{},Tp=class extends K{async _call(e){let t=await super._call(e),n=t.pixel_values.dims,r=yu([n[0],n[2],n[3]]);return{...t,pixel_mask:r}}},Ep=class extends K{constructor(e){super(e),this.do_image_splitting=e.do_image_splitting??!0,this.max_image_size=e.max_image_size}get_resize_for_vision_encoder(e,t){let[n,r]=e.dims.slice(-2),i=r/n;return r>=n?(r=Math.ceil(r/t)*t,n=Math.floor(r/i),n=Math.ceil(n/t)*t):(n=Math.ceil(n/t)*t,r=Math.floor(n*i),r=Math.ceil(r/t)*t),{height:n,width:r}}async _call(e,{do_image_splitting:t=null,return_row_col_info:n=!1}={}){let r;if(!Array.isArray(e))r=[[e]];else{if(e.length===0||!e[0])throw Error(`No images provided.`);r=Array.isArray(e[0])?e:[e]}let i=[],a=[],o=[],s=[],c=[];for(let e of r){let n=await Promise.all(e.map(e=>this.preprocess(e)));s.push(...n.map(e=>e.original_size)),c.push(...n.map(e=>e.reshaped_input_size)),n.forEach(e=>e.pixel_values.unsqueeze_(0));let{longest_edge:r}=this.max_image_size,l;if(t??this.do_image_splitting){let e=Array(n.length),t=Array(n.length);l=await Promise.all(n.map(async(n,i)=>{let a=this.get_resize_for_vision_encoder(n.pixel_values,r),o=await nu(n.pixel_values,{size:[a.height,a.width]}),{frames:s,num_splits_h:c,num_splits_w:l}=await this.split_image(o,this.max_image_size);return e[i]=c,t[i]=l,H(s,0)})),a.push(e),o.push(t)}else{let e=[r,r];l=await Promise.all(n.map(t=>nu(t.pixel_values,{size:e}))),a.push(Array(n.length).fill(0)),o.push(Array(n.length).fill(0))}i.push(H(l,0))}let l=i.length,[u,d,f,p]=i[0].dims,m,h;if(l===1)m=i[0].unsqueeze_(0),h=_u([l,u,f,p],!0);else{let e=Math.max(...i.map(e=>e.dims.at(0)));h=_u([l,e,f,p],!0);let t=h.data,n=e*f*p;for(let r=0;rn||o>r){s=Math.ceil(a/n),c=Math.ceil(o/r);let t=Math.ceil(a/s),l=Math.ceil(o/c);for(let n=0;ne*this.rescale_factor)}pad_image(e,t,n,r){return super.pad_image(e,t,n,{constant_values:this.constant_values,center:!0,...r})}},Op=class extends K{constructor(e){let{resize_mode:t,fill_color:n,interpolation:r,size:i,...a}=e,o=t===`squash`?{width:i,height:i}:t===`shortest`?{shortest_edge:i}:{longest_edge:i},s=r===`bicubic`?3:2;super({...a,size:o,resample:s,do_center_crop:!0,crop_size:i,do_normalize:!0})}};function kp(e,t){return Math.round(e/t)*t}function Ap(e,t,n,r,i){let a=1/0,o=[1,1],s=n*r;for(let n of t){let t=Math.abs(e-n[0]/n[1]);t.5*i*i*n[0]*n[1]&&(o=n)}return o}function jp(e,t){let n=[],r=/* @__PURE__ */ new Set;for(let i=e;i<=t;++i)for(let a=1;a<=i;++a)for(let o=1;o<=i;++o){let i=a*o;if(i>=e&&i<=t){let e=a<<16|o;r.has(e)||(r.add(e),n.push([a,o]))}}return n.sort((e,t)=>e[0]*e[1]-t[0]*t[1])}function Mp(e,t){let[n,r,i,a]=e.dims,o=Math.floor(i/t),s=Math.floor(a/t),c=t*t*r,l=e.data,u=new Float32Array(n*o*s*c),d=i*a;for(let e=0;ethis.max_image_tokens*(this.encoder_patch_size*this.downsample_factor)**2*this.max_pixels_tolerance}_get_grid_layout(e,t){let n=jp(this.min_tiles,this.max_tiles),[r,i]=Ap(t/e,n,t,e,this.tile_size);return{grid_width:r,grid_height:i,target_width:this.tile_size*r,target_height:this.tile_size*i}}async _call(e,{return_row_col_info:t=null}={}){let n;n=Array.isArray(e)?Array.isArray(e[0])?e:[e]:[[e]];let r=[],i=[],a=[],o=[],s=[],c=[];for(let e of n){let t=await Promise.all(e.map(e=>this.preprocess(e,{do_pad:!1})));for(let{pixel_values:e}of t){let[,t,n]=e.dims,l=e.unsqueeze_(0),u=this.encoder_patch_size*this.downsample_factor,d=u**2,[f,p]=Xf(Math.max(u,t),Math.max(u,n),u,this.min_image_tokens*d,this.max_image_tokens*d).map(e=>Math.max(u,e)),m,h=1,g=1,_=this._is_image_too_large(t,n),v=this.do_image_splitting&&(this.min_tiles!==1||this.max_tiles!==1);if(_&&v){let{grid_width:e,grid_height:r,target_width:i,target_height:a}=this._get_grid_layout(t,n);h=r,g=e;let o=await nu(l,{size:[a,i]});m=[];for(let t=0;t(e-this.image_mean[t])/this.image_std[t]);return super.pad_image(e,t,{width:s,height:o},{center:!0,constant_values:c,...r})}async _call(e,{num_crops:t=null}={}){if(this._num_crops=t??=this.config.num_crops,t<4||rm(t)%1!=0)throw Error(`num_crops must be a square number >= 4`);Array.isArray(e)||(e=[e]);let n=e.length,r=await Promise.all(e.map(e=>this.preprocess(e))),i=r.map(e=>e.original_size),a=r.map(e=>e.reshaped_input_size),o=[];for(let{pixel_values:e}of r){e.unsqueeze_(0);let[n,r]=e.dims.slice(-2),i=await nu(e,{size:[$p,$p],mode:`bicubic`});if(t>0){let a=[],s=rm(t),c=nm(r/s),l=nm(n/s);for(let t=0;te.map(e=>$p*tm(e/$p)));return{pixel_values:s,original_sizes:i,reshaped_input_sizes:a,image_sizes:new V(`int64`,c.flat(),[n,2]),num_img_tokens:c.map(([e,t])=>this.calc_num_image_tokens_from_image_size(t,e))}}},am=class extends K{get_resize_output_image_size(e,t){let{longest_edge:n}=t;if(n===void 0)throw Error(`size must contain 'longest_edge'`);let[r,i]=e.size,a=Math.max(r,i)/n,o=r,s=i;a>1&&(o=Math.floor(r/a),s=Math.floor(i/a));let{patch_size:c,spatial_merge_size:l}=this.config;if(!l)throw Error(`config must contain 'spatial_merge_size'`);let u=c*l,d=Math.floor((o-1)/u)+1,f=Math.floor((s-1)/u)+1;return[d*u,f*u]}},om=class extends K{},sm=class extends K{post_process_object_detection(...e){return Gf(...e)}},cm=class extends K{reshape_input_points(e,t,n,r=!1){e=structuredClone(e);let i=ii(e);if(i.length===3)r||(i=[1,...i]),e=[e];else if(i.length!==4)throw Error("The input_points must be a 4D tensor of shape `batch_size`, `point_batch_size`, `nb_points_per_image`, `2`.");for(let r=0;re!==t.dims[n]))throw Error(`The first ${n.length} dimensions of 'input_points' and 'input_labels' must be the same.`);return new V(`int64`,e.flat(1/0).map(BigInt),n)}async _call(e,{input_points:t=null,input_labels:n=null,input_boxes:r=null}={}){let i=await super._call(e);if(t&&(i.input_points=this.reshape_input_points(t,i.original_sizes,i.reshaped_input_sizes)),n){if(!i.input_points)throw Error("`input_points` must be provided if `input_labels` are provided.");i.input_labels=this.add_input_labels(n,i.input_points)}return r&&(i.input_boxes=this.reshape_input_points(r,i.original_sizes,i.reshaped_input_sizes,!0)),i}async post_process_masks(e,t,n,{mask_threshold:r=0,binarize:i=!0,pad_size:a=null}={}){let o=[];a=a??this.pad_size??this.size;let s=[a.height,a.width];for(let a=0;ar&&(t[n]=1);u=new V(`bool`,t,u.dims)}o.push(u)}return o}generate_crop_boxes(e,t,{crop_n_layers:n=0,overlap_ratio:r=512/1500,points_per_crop:i=32,crop_n_points_downscale_factor:a=1}={}){}},lm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},um=class extends lm{},dm=class extends K{post_process_semantic_segmentation(...e){return Kf(...e)}},fm=class extends dm{},pm=class extends K{},mm=class extends K{pad_image(e,t,n,r={}){let[i,a,o]=t;return super.pad_image(e,t,{width:a+(n-a%n)%n,height:i+(n-i%n)%n},{mode:`symmetric`,center:!1,constant_values:-1,...r})}},hm=class extends K{},gm=class extends hm{},_m=class extends K{async _call(e,t){Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let n=await Promise.all(e.map(e=>this.preprocess(e))),r=await Promise.all(t.map(e=>this.preprocess(e,{do_normalize:!1,do_convert_rgb:!1,do_convert_grayscale:!0})));return{pixel_values:du(n.map((e,t)=>H([e.pixel_values,r[t].pixel_values],0)),0),original_sizes:n.map(e=>e.original_size),reshaped_input_sizes:n.map(e=>e.reshaped_input_size)}}},vm=class extends K{post_process_pose_estimation(e,t,{threshold:n=null}={}){let r=e.tolist(),[i,a,o,s]=e.dims,c=[];for(let e=0;e/gm,bboxes:/([^<]+)?/gm},this.size_per_bin=1e3}construct_prompts(e){typeof e==`string`&&(e=[e]);let t=[];for(let n of e)if(this.task_prompts_without_inputs.has(n))t.push(this.task_prompts_without_inputs.get(n));else{for(let[e,r]of this.task_prompts_with_input)if(n.includes(e)){t.push(r.replaceAll(`{input}`,n).replaceAll(e,``));break}t.length!==e.length&&t.push(n)}return t}post_process_generation(e,t,n){let r=this.tasks_answer_post_processing_type.get(t)??`pure_text`;e=e.replaceAll(``,``).replaceAll(``,``);let i;switch(r){case`pure_text`:i=e;break;case`description_with_bboxes`:case`bboxes`:case`phrase_grounding`:case`ocr`:let a=r===`ocr`?`quad_boxes`:`bboxes`,o=e.matchAll(this.regexes[a]),s=[],c=[];for(let[e,t,...r]of o)s.push(t?t.trim():s.at(-1)??``),c.push(r.map((e,t)=>(Number(e)+.5)/this.size_per_bin*n[t%2]));i={labels:s,[a]:c};break;default:throw Error(`Task "${t}" (of type "${r}") not yet implemented.`)}return{[t]:i}}async _call(e,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=await this.image_processor(e,n),i=t?this.tokenizer(this.construct_prompts(t),n):{};return{...r,...i}}},Cm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.image_seq_length=this.config.image_seq_length;let{boi_token:r,image_token:i,eoi_token:a}=this.tokenizer.config;this.boi_token=r,this.image_token=i,this.eoi_token=a;let o=i.repeat(this.image_seq_length);this.full_image_sequence=` - -${r}${o}${a} - -`}async _call(e,t=null,n={}){typeof e==`string`&&(e=[e]);let r;return t&&(r=await this.image_processor(t,n),e=e.map(e=>e.replaceAll(this.boi_token,this.full_image_sequence))),{...this.tokenizer(e,n),...r}}},wm=class extends G{static image_processor_class=xm;static feature_extractor_class=jf;static tokenizer_class=W;static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_seq_length=this.config.audio_seq_length,this.image_seq_length=this.config.image_seq_length;let{audio_token_id:r,boa_token:i,audio_token:a,eoa_token:o,image_token_id:s,boi_token:c,image_token:l,eoi_token:u}=this.tokenizer.config;this.audio_token_id=r,this.boa_token=i,this.audio_token=a;let d=a.repeat(this.audio_seq_length);this.full_audio_sequence=` - -${i}${d}${o} - -`,this.image_token_id=s,this.boi_token=c,this.image_token=l;let f=l.repeat(this.image_seq_length);this.full_image_sequence=` - -${c}${f}${u} - -`}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;n&&(i=await this.feature_extractor(n,r),e=e.map(e=>e.replaceAll(this.audio_token,this.full_audio_sequence)));let a;return t&&(a=await this.image_processor(t,r),e=e.map(e=>e.replaceAll(this.image_token,this.full_image_sequence))),{...this.tokenizer(e,r),...a,...i}}},Tm=class extends G{static uses_processor_config=!0;static uses_chat_template_file=!0;constructor(e,t,n){super(e,t,n),this.audio_ms_per_token=this.config.audio_ms_per_token??40,this.audio_seq_length=this.config.audio_seq_length??750,this.image_seq_length=this.config.image_seq_length??280;let{audio_token:r,boa_token:i,eoa_token:a,image_token:o,boi_token:s,eoi_token:c}=this.tokenizer.config;this.audio_token=r,this.boa_token=i,this.eoa_token=a,this.image_token=o,this.boi_token=s,this.eoi_token=c}static async from_pretrained(e,t={}){let[n,r,i]=await Promise.all([rl(e,Id,!0,t),W.from_pretrained(e,t),nl(e,Ld,!1,t)]),a={tokenizer:r};return n.image_processor&&(a.image_processor=new xp(n.image_processor)),n.feature_extractor&&(a.feature_extractor=new bf(n.feature_extractor)),new this(n,a,i)}_compute_audio_num_tokens(e,t){let n=Math.round(t*20/1e3),r=Math.round(t*10/1e3),i=Math.floor(n/2),a=Math.floor((e+i-n-1)/r)+1;if(a<=0)return 0;for(let e=0;e<2;++e)a=Math.floor((a-1)/2)+1;return Math.min(a,this.audio_seq_length)}async _call(e,t=null,n=null,r={}){typeof e==`string`&&(e=[e]);let i;if(t){i=await this.image_processor(t,r);let n=i.num_soft_tokens_per_image,a=0;e=e.map(e=>e.replaceAll(this.image_token,()=>` - -${this.boi_token}${this.image_token.repeat(n[a++])}${this.eoi_token} - -`))}let a;if(n){let t=Array.isArray(n)?n:[n];a=await this.feature_extractor(t[0],r);let i=this.feature_extractor.config.sampling_rate??16e3,o=0;e=e.map(e=>e.replaceAll(this.audio_token,()=>` - -${this.boa_token}${this.audio_token.repeat(this._compute_audio_num_tokens(t[o++].length,i))}${this.eoa_token} - -`))}return{...this.tokenizer(e,r),...i,...a}}},Em=class extends G{static image_processor_class=xm;static tokenizer_class=W;static image_token=`<|image_pad|>`;async _call(e,t=null,...n){Array.isArray(e)||(e=[e]);let r,i;if(t&&(r=await this.image_processor(t),i=r.image_grid_thw),i){let t=this.image_processor.config.merge_size**2,n=0,r=this.constructor.image_token,a=i.tolist();e=e.map(e=>{for(;e.includes(r);){let i=Number(a[n++].reduce((e,t)=>e*t,1n));e=e.replace(r,`<|placeholder|>`.repeat(Math.floor(i/t)))}return e.replaceAll(`<|placeholder|>`,r)})}return{...this.tokenizer(e),...r}}},Dm=class extends Em{static image_token=`<|image|>`},Om=class extends G{static tokenizer_class=W;static feature_extractor_class=jf;static uses_processor_config=!0;_get_num_audio_features(e){let{hop_length:t}=this.feature_extractor.config.melspec_kwargs,{projector_window_size:n,projector_downsample_rate:r}=this.feature_extractor.config,i=Math.floor(n/r),a=Math.floor(e/t)+1,o=Math.floor(a/2);return Math.ceil(o/n)*i}async _call(e,t=null,n={}){if(Array.isArray(e))throw Error(`Batched inputs are not supported yet.`);let r={};if(t){let{input_features:n}=await this.feature_extractor(t);r.input_features=n;let i=this._get_num_audio_features(t.length);r.input_features_mask=new V(`bool`,new Uint8Array(i).fill(1),[1,i]);let a=this.config.audio_token??`<|audio|>`;if(!e.includes(a))throw Error(`The input text does not contain the audio token ${a}.`);e=e.replaceAll(a,a.repeat(i))}return{...this.tokenizer(e,{add_special_tokens:!1,...n}),...r}}};function km(e,t){let n=e.dims.at(-1)-1,r=e.tolist();r.fill(!1,0,1),r.fill(!1,n);let i=t.tolist();return r.map((e,t)=>e?t:null).filter(e=>e!==null).map(e=>i[e])}var Am=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t,n={}){let r=e?await this.image_processor(e,n):{};return{...t?this.tokenizer(t,n):{},...r}}post_process_grounded_object_detection(e,t,{box_threshold:n=.25,text_threshold:r=.25,target_sizes:i=null}={}){let{logits:a,pred_boxes:o}=e,s=a.dims[0];if(i!==null&&i.length!==s)throw Error(`Make sure that you pass in as many target sizes as the batch dimension of the logits`);let c=a.dims.at(1),l=a.sigmoid(),u=l.max(-1).tolist(),d=o.tolist().map(e=>e.map(e=>Wf(e))),f=[];for(let e=0;ee.map((e,t)=>e*a[(t+1)%2])));let o=u[e],s=[],p=[],m=[];for(let i=0;i`+i.repeat(e);o+=` -`}return o+=` -${r}${a}`+i.repeat(e)+`${r}`,o}function Mm(e,t,n,r){return`${t}${r}`+n.repeat(e)+`${t}`}function Nm(e,t,n,r,i,a){return e===0&&t===0?Mm(n,r,i,a):jm(n,e,t,r,i,a)}var Pm=class extends G{static image_processor_class=xm;static tokenizer_class=W;static uses_processor_config=!0;fake_image_token=``;image_token=``;global_img_token=``;async _call(e,t=null,n={}){n.return_row_col_info??=!0;let r;t&&(r=await this.image_processor(t,n)),Array.isArray(e)||(e=[e]);let i=r.rows??[Array(e.length).fill(0)],a=r.cols??[Array(e.length).fill(0)],o=this.config.image_seq_len,s=[],c=[];for(let t=0;tNm(e,l[t],o,this.fake_image_token,this.image_token,this.global_img_token)),d=n.split(this.image_token);if(d.length===0)throw Error(`The image token should be present in the text.`);let f=d[0];for(let e=0;ee.images).flatMap(e=>e.images).map(e=>Vf.read(e)));let r=this.tokenizer,i=r.apply_chat_template(e,{tokenize:!1,add_generation_prompt:!0,chat_template:n}),a=e=>r.encode(e,{add_special_tokens:!1}),o=i.split(this.image_tag),s=o.length-1;if(t.length!==s)throw Error(`Number of images provided (${t.length}) does not match number of "${this.image_tag}" image tags (${s})`);let[c,l,u]=r.convert_tokens_to_ids([this.image_tag,this.image_start_tag,this.image_end_tag]),d=a(o[0]),f=Array(d.length).fill(!1);for(let e=1;e0){let e=await this.image_processor(t);return e.pixel_values.unsqueeze_(0),{...m,...e}}return m}},Im=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e=null,t=null,n={}){if(!e&&!t)throw Error(`Either text or images must be provided`);let r=e?this.tokenizer(e,n):{},i=t?await this.image_processor(t,n):{};return{...r,...i}}},Lm=class extends G{static tokenizer_class=W;static image_processor_class=xm;async _call(e,t=null,n={}){let{image_rows:r,image_cols:i,image_sizes:a,...o}=await this.image_processor(e,{...n,return_row_col_info:!0});if(t){let e=this.config.image_token??``,{tile_size:n=512,downsample_factor:o=2,encoder_patch_size:s=16,use_thumbnail:c=!0}=this.image_processor.config,l=e=>Math.ceil(Math.floor(e/s)/o),u=l(n)**2,d=this.config.image_start_token??`<|image_start|>`,f=this.config.image_end_token??`<|image_end|>`,p=this.config.image_thumbnail??`<|img_thumbnail|>`;Array.isArray(t)||(t=[t]);let m=0;t=t.map(t=>{let n=t.split(e);return n[0]+n.slice(1).map(t=>{let n=m++,[o,s]=a[n],h=r[n],g=i[n],_=l(o)*l(s),v=d;if(h>1||g>1){let t=e.repeat(u);for(let e=0;e`+t;c&&(v+=p+e.repeat(_))}else v+=e.repeat(_);return v+f+t}).join(``)})}return{...o,...t?this.tokenizer(t,n):{}}}},Rm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,patch_size:a,num_additional_image_tokens:o}=this.config,s=Math.floor(e/a)*Math.floor(n/a)+o;t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;e0?i.reduce((e,t)=>e*t,1):0;c.push(n),s.push(a)}return[i(c),s]}char_decode(e){return this.char_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}bpe_decode(e){return this.bpe_tokenizer.batch_decode(e)}wp_decode(e){return this.wp_tokenizer.batch_decode(e).map(e=>e.replaceAll(` `,``))}batch_decode([e,t,n]){let[r,i]=this._decode_helper(e,`char`),[a,o]=this._decode_helper(t,`bpe`),[s,c]=this._decode_helper(n,`wp`),l=[],u=[];for(let e=0;e`;function Wm(e,t,n,r,i){return`${r.repeat(n*i)}${t}${e} -`}var Gm=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!1;async _call(e,t=null,n={}){t||=(A.warn(`You are using PaliGemma without a text prefix. It will perform as a picture-captioning model.`),``),Array.isArray(e)||(e=[e]),Array.isArray(t)||(t=[t]);let r=this.tokenizer.bos_token,i=this.image_processor.config.image_seq_length,a;t.some(e=>e.includes(Um))?a=t.map(e=>{let t=e.replaceAll(Um,Um.repeat(i)),n=t.lastIndexOf(Um),a=n===-1?0:n+Um.length;return t.slice(0,a)+r+t.slice(a)+` -`}):(A.warn("You are passing both `text` and `images` to `PaliGemmaProcessor`. The processor expects special image tokens in the text, as many tokens as there are images per each text. It is recommended to add `` tokens in the very beginning of your text. For this call, we will infer how many images each text has and add special tokens."),a=t.map(t=>Wm(t,r,i,Um,e.length)));let o=this.tokenizer(a,n);return{...await this.image_processor(e,n),...o}}},Km=`<|image|>`,qm=/<\|image_\d+\|>/g,Jm=class extends G{static image_processor_class=xm;static tokenizer_class=W;async _call(e,t=null,{padding:n=!0,truncation:r=!0,num_crops:i=null}={}){Array.isArray(e)||(e=[e]);let a,o;if(t){o=await this.image_processor(t,{num_crops:i});let{num_img_tokens:s}=o,c=e.map((e,t)=>e.split(qm).join(Km.repeat(s[t])));a=this.tokenizer(c,{padding:n,truncation:r});let l=this.tokenizer._tokenizer.token_to_id(Km);a.input_ids.map_(e=>e==l?-e:e)}else a=this.tokenizer(e);return{...a,...o}}},Ym=class extends G{static tokenizer_class=W;static image_processor_class=xm;static uses_processor_config=!0;async _call(e,t=null,n={}){let r=await this.image_processor(e,n);if(t){let[e,n]=r.pixel_values.dims.slice(-2),{image_token:i,image_break_token:a,image_end_token:o,patch_size:s,spatial_merge_size:c}=this.config,l=s*c,u=Math.floor(e/l),d=Math.floor(n/l);t=structuredClone(t),Array.isArray(t)||(t=[t]);for(let e=0;esh(e,o)),c=s.map(e=>e.length),l=s.flat(),u=(await Promise.all(l.map(e=>this.feature_extractor(e,n)))).map(e=>e.input_features);r.audio_values=u.length>1?H(u,0):u[0];let d=i[0];for(let e=0;e0){if(l>Tc)throw Error(`The number of external data chunks (${l}) exceeds the maximum allowed value (${Tc}).`);let t=Th(o,l);for(let n of t){let t=`${r.subfolder??``}/${n}`;c.push(new Promise(async(i,a)=>{let o=await tl(e,t,!0,r,s);i(o instanceof Uint8Array?{path:n,data:o}:n)}))}}else a.externalData!==void 0&&(c=a.externalData.map(async t=>{if(typeof t.data==`string`){let n=await tl(e,t.data,!0,r);return{...t,data:n}}return t}));return Promise.all(c)}async function Oh(e,t,n,r=!1,i=void 0){let a=n.config?.[`transformers.js_config`]??{},o=Gl(n.device??a.device,t,{warn:e=>A.info(e)}),s=jl(o),c=a.device_config??{};c.hasOwnProperty(o)&&(a={...a,...c[o]});let l=Zl(n.dtype??a.dtype,t,o,{configDtype:a.dtype,warn:e=>A.info(e)});if(!Xl.hasOwnProperty(l))throw Error(`Invalid dtype: ${l}. Should be one of: ${Object.keys(ql).join(`, `)}`);if(o===`webgpu`&&!O.IS_NODE_ENV&&l===ql.fp16&&!await Kl())throw Error(`The device (${o}) does not support fp16.`);let u=Xl[l],d={...n.session_options};d.executionProviders??=s;let f=a.free_dimension_overrides;f?d.freeDimensionOverrides??=f:o.startsWith(`webnn`)&&!d.freeDimensionOverrides&&A.warn(`WebNN does not currently support dynamic shapes and requires 'free_dimension_overrides' to be set in config.json, preferably as a field within config["transformers.js_config"]["device_config"]["${o}"]. When 'free_dimension_overrides' is not set, you may experience significant performance degradation.`);let p=Eh(e,t,n,u),m=await Dh(e,t,u,n,n.use_external_data_format??a.use_external_data_format,d);if(m.length>0&&(!O.IS_NODE_ENV||m.some(e=>typeof e!=`string`))&&(d.externalData=m),r&&o===`webgpu`){let e=bh(n.config,{prefix:`present`,session_name:i});if(e.size>0&&!Bl()){let t={};for(let n of e)t[n]=`gpu-buffer`;d.preferredOutputLocation=t}}return{buffer_or_path:await p,session_options:d,session_config:{dtype:l,device:o}}}async function kh(e,t,n,r=void 0){return Object.fromEntries(await Promise.all(Object.keys(t).map(async i=>{let a=r?.[i]??!1,{buffer_or_path:o,session_options:s,session_config:c}=await Oh(e,t[i],n,a,i);return[i,await Fl(o,s,c)]})))}function Ah(e){for(let t in e)Rl(e[t])?e[t]=new V(e[t]):typeof e[t]==`object`&&Ah(e[t]);return e}async function q(e,t){let n=jh(e,t);try{return Ah(await Ll(e,Object.fromEntries(Object.entries(n).map(([e,t])=>{let n=t.ort_tensor;return O.IS_NODE_ENV&&typeof Float16Array<`u`&&n.cpuData instanceof Float16Array&&(n.cpuData=new Uint16Array(n.cpuData.buffer)),[e,n]}))))}catch(e){let t=Object.fromEntries(Object.entries(n).map(([e,t])=>{let n={type:t.type,dims:t.dims,location:t.location};return n.location!==`gpu-buffer`&&(n.data=t.data),[e,n]}));throw A.error(`An error occurred during model execution: "${e}".`),A.error(`Inputs given to model:`,t),e}}function jh(e,t){let n=/* @__PURE__ */ Object.create(null),r=[];for(let i of e.inputNames){let e=t[i];if(!(e instanceof V)){r.push(i);continue}n[i]=Bl()?e.clone():e}if(r.length>0)throw Error(`An error occurred during model execution: "Missing the following inputs: ${r.join(`, `)}.`);let i=Object.keys(t).length,a=e.inputNames.length;if(i>a){let n=Object.keys(t).filter(t=>!e.inputNames.includes(t));A.warn(`WARNING: Too many inputs were provided (${i} > ${a}). The following inputs will be ignored: "${n.join(`, `)}".`)}return n}var Mh=class{},Nh=class extends Mh{constructor({last_hidden_state:e,hidden_states:t=null,attentions:n=null}){super(),this.last_hidden_state=e,this.hidden_states=t,this.attentions=n}},J=class extends Mh{constructor({logits:e,...t}){super(),this.logits=e;let n=Object.values(t);n.length>0&&(this.attentions=n)}},Ph=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Fh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Ih=class extends Mh{constructor({start_logits:e,end_logits:t}){super(),this.start_logits=e,this.end_logits=t}},Lh=class extends Mh{constructor({logits:e}){super(),this.logits=e}},Rh=class extends Mh{constructor({logits:e,past_key_values:t}){super(),this.logits=e,this.past_key_values=t}},zh=class extends Mh{constructor({logits:e,past_key_values:t,encoder_outputs:n,decoder_attentions:r=null,cross_attentions:i=null}){super(),this.logits=e,this.past_key_values=t,this.encoder_outputs=n,this.decoder_attentions=r,this.cross_attentions=i}},Bh=class extends Mh{constructor({alphas:e}){super(),this.alphas=e}},Vh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Hh=class extends $r{_call(e,t){throw Error("`_call` should be implemented in a subclass")}},Uh=class extends $r{constructor(){super(),this.processors=[]}push(e){this.processors.push(e)}extend(e){this.processors.push(...e)}_call(e,t){let n=t;for(let t of this.processors)n=t(e,n);return n}[Symbol.iterator](){return this.processors.values()}},Wh=class extends Vh{constructor(e){super(),this.bos_token_id=e}_call(e,t){for(let n=0;n=1&&i[i.length-1]>=this.timestamp_begin,o=i.length<2||i[i.length-2]>=this.timestamp_begin;if(a&&(o?r.subarray(this.timestamp_begin).fill(-1/0):r.subarray(0,this.eos_token_id).fill(-1/0)),e[n].length===this.begin_index&&this.max_initial_timestamp_index!==null){let e=this.timestamp_begin+this.max_initial_timestamp_index;r.subarray(e+1).fill(-1/0)}let s=sl(r);Math.log(s.subarray(this.timestamp_begin).map(Math.exp).reduce((e,t)=>e+t))>ll(s.subarray(0,this.timestamp_begin))[0]&&r.subarray(0,this.timestamp_begin).fill(-1/0)}return t}},Yh=class extends Vh{constructor(e){super(),this.no_repeat_ngram_size=e}getNgrams(e){let t=e.length,n=[];for(let r=0;r1 to use the classifier-free guidance processor, got guidance scale ${e}.`);this.guidance_scale=e}_call(e,t){if(t.dims[0]!==2*e.length)throw Error(`Logits should have twice the batch size of the input ids, the first half of batches corresponding to the conditional inputs, and the second half of batches corresponding to the unconditional inputs. Got batch size ${t.dims[0]} for the logits and ${e.length} for the input ids.`);let n=e.length,r=t.slice([0,n],null),i=t.slice([n,t.dims[0]],null);for(let e=0;ee.length>=this.max_length)}},og=class extends rg{constructor(e){super(),Array.isArray(e)||(e=[e]),this.eos_token_id=e}_call(e,t){return e.map(e=>{let t=e.at(-1);return this.eos_token_id.some(e=>t==e)})}},sg=class extends $r{constructor(e){super(),this.generation_config=e}async _call(e){return this.sample(e)}async sample(e){throw Error(`sample should be implemented in subclasses.`)}getLogits(e,t){let n=e.dims.at(-1),r=e.data;if(t===-1)r=r.slice(-n);else{let e=t*n;r=r.slice(e,e+n)}return r}randomSelect(e){return xc(e)}static getSampler(e){if(e.do_sample)return new lg(e);if(e.num_beams>1)return new ug(e);if(e.num_return_sequences>1)throw Error(`num_return_sequences has to be 1 when doing greedy search, but is ${e.num_return_sequences}.`);return new cg(e)}},cg=class extends sg{async sample(e){let t=ll(e.data)[1];return[[BigInt(t),0]]}},lg=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},()=>{let e=this.randomSelect(i);return[r.data[e],Math.log(i[e])]})}},ug=class extends sg{async sample(e){let t=e.dims.at(-1);this.generation_config.top_k>0&&(t=Math.min(this.generation_config.top_k,t));let[n,r]=await iu(e,t),i=ol(n.data);return Array.from({length:this.generation_config.num_beams},(e,t)=>[r.data[t],Math.log(i[t])])}},dg=class{constructor(e){if(e)for(let t in e){if(t in this)throw TypeError(`Key "${t}" conflicts with an existing property on DynamicCache`);let n=e[t];if(!(n instanceof V))throw TypeError(`Expected a Tensor for key "${t}", got ${typeof n}`);this[t]=n}}get_seq_length(){let e=this;if(Object.keys(e).length===0)return 0;for(let t in e)if(t.startsWith(`past_key_values.`))return e[t].dims.at(-2);throw Error(`Unable to determine sequence length from the cache.`)}update(e){for(let t in e){let n=this[t],r=e[t];n&&n!==r&&n.location===`gpu-buffer`&&n.dispose(),this[t]=r}}async dispose(){let e=[];for(let t of Object.values(this))t.location===`gpu-buffer`&&e.push(t.dispose());await Promise.all(e)}},Y={EncoderOnly:0,EncoderDecoder:1,Seq2Seq:2,Vision2Seq:3,DecoderOnly:4,DecoderOnlyWithoutHead:5,MaskGeneration:6,ImageTextToText:7,Musicgen:8,MultiModality:9,Phi3V:10,AudioTextToText:11,AutoEncoder:12,ImageAudioTextToText:13,Supertonic:14,Chatterbox:15,VoxtralRealtime:16},fg={[Y.DecoderOnly]:{sessions:(e,t)=>({model:t.model_file_name??`model`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.DecoderOnlyWithoutHead]:{sessions:(e,t)=>({model:t.model_file_name??`model`})},[Y.Seq2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Vision2Seq]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Musicgen]:{sessions:()=>({model:`text_encoder`,decoder_model_merged:`decoder_model_merged`,encodec_decode:`encodec_decode`}),cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.EncoderDecoder]:{sessions:()=>({model:`encoder_model`,decoder_model_merged:`decoder_model_merged`}),cache_sessions:{decoder_model_merged:!0}},[Y.MaskGeneration]:{sessions:()=>({model:`vision_encoder`,prompt_encoder_mask_decoder:`prompt_encoder_mask_decoder`})},[Y.ImageTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageTextToText].text_only_sessions};return n||(r.vision_encoder=`vision_encoder`),e.is_encoder_decoder&&(r.model=`encoder_model`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.AudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.ImageAudioTextToText]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.ImageAudioTextToText].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`,r.vision_encoder=`vision_encoder`),r},cache_sessions:{decoder_model_merged:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.Phi3V]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`model`,vision_encoder:`vision_encoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.MultiModality]:{sessions:()=>({prepare_inputs_embeds:`prepare_inputs_embeds`,model:`language_model`,lm_head:`lm_head`,gen_head:`gen_head`,gen_img_embeds:`gen_img_embeds`,image_decode:`image_decode`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.AutoEncoder]:{sessions:()=>({encoder_model:`encoder_model`,decoder_model:`decoder_model`})},[Y.Supertonic]:{sessions:()=>({text_encoder:`text_encoder`,latent_denoiser:`latent_denoiser`,voice_decoder:`voice_decoder`})},[Y.Chatterbox]:{sessions:()=>({embed_tokens:`embed_tokens`,speech_encoder:`speech_encoder`,model:`language_model`,conditional_decoder:`conditional_decoder`}),cache_sessions:{model:!0},optional_configs:{generation_config:`generation_config.json`}},[Y.VoxtralRealtime]:{text_only_sessions:{embed_tokens:`embed_tokens`,decoder_model_merged:`decoder_model_merged`},sessions:(e,t,n)=>{let r={...fg[Y.VoxtralRealtime].text_only_sessions};return n||(r.audio_encoder=`audio_encoder`),r},cache_sessions:{decoder_model_merged:!0,audio_encoder:!0},optional_configs:{generation_config:`generation_config.json`}},default:{sessions:(e,t)=>({model:t.model_file_name??`model`})}};function pg(e,t,n={}){let r=fg[e]??fg.default;return{sessions:r.sessions(t,n,n.textOnly??!1),cache_sessions:r.cache_sessions,optional_configs:r.optional_configs}}function mg(e,{warn:t=!0}={}){let n=e.architectures||[];for(let e of n){let t=Cg.get(e);if(t!==void 0)return t}if(e.model_type){let t=Cg.get(e.model_type);if(t!==void 0)return t;for(let t of Object.values(_g))if(t.has(e.model_type)){let n=Cg.get(t.get(e.model_type));if(n!==void 0)return n}}if(t){let t=n.length>0?n.join(`, `):`(none)`;A.warn(`[resolve_model_type] Architecture(s) not found in MODEL_TYPE_MAPPING: [${t}] for model type '${e.model_type}'. Falling back to EncoderOnly (single model.onnx file). If you encounter issues, please report at: ${Nd}`)}return Y.EncoderOnly}function hg(e,{config:t=null,cache_dir:n=null,local_files_only:r=!1,revision:i=`main`}={}){return t===null?Wc(Ac(e,{cache_dir:n,local_files_only:r,revision:i}),()=>Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})):Ch.from_pretrained(e,{config:t,cache_dir:n,local_files_only:r,revision:i})}async function gg(e,{config:t=null,dtype:n=null,device:r=null,model_file_name:i=null}={}){t=await hg(e,{config:t});let a=[`config.json`],o=t[`transformers.js_config`]??{},s=o.use_external_data_format,c=`onnx`,l=r??o.device,u=n??o.dtype,d=mg(t),f=(e,t=null)=>{t??=e;let n=Gl(l,e),r=Xl[Zl(u,e,n)]??``,i=`${t}${r}.onnx`,o=`${c}/${i}`;a.push(o);let d=wh(s,i,e);for(let e of Th(i,d)){let t=`${c}/${e}`;a.push(t)}},{sessions:p,optional_configs:m}=pg(d,t,{model_file_name:i});for(let[e,t]of Object.entries(p))f(e,t);if(m)for(let e of Object.values(m))a.push(e);return a}var _g=null;function vg(e){_g=e}function yg(e){if(e instanceof V)return e;if(e.length===0)throw Error(`items must be non-empty`);if(Array.isArray(e[0])){if(e.some(t=>t.length!==e[0].length))throw Error(`Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' and/or 'truncation=True' to have batched tensors with the same length.`);return new V(`int64`,BigInt64Array.from(e.flat().map(e=>BigInt(e))),[e.length,e[0].length])}return new V(`int64`,BigInt64Array.from(e.map(e=>BigInt(e))),[1,e.length])}function bg(e){return new V(`bool`,[e],[1])}var xg={[Y.DecoderOnly]:{can_generate:!0,forward:Pg,prepare_inputs:Bg},[Y.DecoderOnlyWithoutHead]:{can_generate:!1,forward:Pg,prepare_inputs:Bg},[Y.Seq2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Vision2Seq]:{can_generate:!0,forward:Eg,prepare_inputs:Vg},[Y.Musicgen]:{can_generate:!0,forward:Eg},[Y.EncoderDecoder]:{can_generate:!1,forward:Eg},[Y.ImageTextToText]:{can_generate:!0,forward:Lg,prepare_inputs:Hg},[Y.AudioTextToText]:{can_generate:!0,forward:Ig,prepare_inputs:Hg},[Y.ImageAudioTextToText]:{can_generate:!0,prepare_inputs:Hg},[Y.Phi3V]:{can_generate:!0,prepare_inputs:Hg},[Y.MultiModality]:{can_generate:!0},[Y.AutoEncoder]:{can_generate:!1,forward:Og},[Y.Chatterbox]:{can_generate:!0,forward:Dg},[Y.VoxtralRealtime]:{can_generate:!0,prepare_inputs:Bg},default:{can_generate:!1,forward:Dg}};function Sg(e,t){let n=Cg.get(e),r=!1,i=t?.architectures?.[0];if(i&&i!==e&&e?.endsWith(`ForCausalLM`)&&i.endsWith(`ForConditionalGeneration`)){let e=Cg.get(i);e!==void 0&&(n=e,r=!0)}let a=xg[n]??xg.default,o=fg[n]??fg.default;return{typeConfig:{...a,...o},textOnly:r,modelType:n}}var Cg=/* @__PURE__ */ new Map,wg=/* @__PURE__ */ new Map,Tg=/* @__PURE__ */ new Map,X=class extends $r{main_input_name=`input_ids`;forward_params=[`input_ids`,`attention_mask`];_return_dict_in_generate_keys=null;constructor(e,t,n){super(),this.config=e,this.sessions=t,this.configs=n;let{typeConfig:r}=Sg(Tg.get(this.constructor),e);this.can_generate=r.can_generate,this._forward=r.forward,this._prepare_inputs_for_generation=r.prepare_inputs,this.can_generate&&this.forward_params.push(`past_key_values`),this.custom_config=this.config[`transformers.js_config`]??{}}async dispose(){let e=[];for(let t of Object.values(this.sessions))e.push(t.release?.());return await Promise.all(e)}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d},p=Tg.get(this);n=f.config=await Ch.from_pretrained(e,f);let{typeConfig:m,textOnly:h,modelType:g}=Sg(p,n);if(g===void 0){let e=p??n?.model_type;e!==`custom`&&A.warn(`Model type for '${e}' not found, assuming encoder-only architecture. Please report this at ${Nd}.`)}if(t&&!(t instanceof ti)){let r={};try{let t=await gg(e,{config:n,dtype:l,device:c,model_file_name:o});(await Promise.all(t.map(t=>Kc(e,t,f)))).forEach((e,n)=>{if(e.exists){let i=t[n]===`config.json`;r[t[n]]={loaded:i?e.size??0:0,total:e.size??0}}})}catch(e){A.warn(`Unable to fetch model file metadata for total progress tracking: ${e}`)}Object.keys(r).length>0&&(f.progress_callback=new ti(t,r))}let _=[kh(e,m.sessions(n,f,h),f,m.cache_sessions)];m.optional_configs&&_.push(Kg(e,m.optional_configs,f));let v=await Promise.all(_);return new this(n,...v)}async _call(e){return await this.forward(e)}async forward(e){return await this._forward(this,e)}get generation_config(){return this.configs?.generation_config??null}_get_logits_processor(e,t,n=null){let r=new Uh;if(e.repetition_penalty!==null&&e.repetition_penalty!==1&&r.push(new Xh(e.repetition_penalty)),e.no_repeat_ngram_size!==null&&e.no_repeat_ngram_size>0&&r.push(new Yh(e.no_repeat_ngram_size)),e.bad_words_ids!==null&&r.push(new $h(e.bad_words_ids,e.eos_token_id)),e.min_length!==null&&e.eos_token_id!==null&&e.min_length>0&&r.push(new Zh(e.min_length,e.eos_token_id)),e.min_new_tokens!==null&&e.eos_token_id!==null&&e.min_new_tokens>0&&r.push(new Qh(t,e.min_new_tokens,e.eos_token_id)),e.forced_bos_token_id!==null&&r.push(new Wh(e.forced_bos_token_id)),e.forced_eos_token_id!==null&&r.push(new Gh(e.max_length,e.forced_eos_token_id)),e.suppress_tokens!==null&&r.push(new Kh(e.suppress_tokens)),e.begin_suppress_tokens!==null){let n=t>1||e.forced_bos_token_id===null?t:t+1;r.push(new qh(e.begin_suppress_tokens,n))}return e.guidance_scale!==null&&e.guidance_scale>1&&r.push(new eg(e.guidance_scale)),e.temperature===0&&e.do_sample&&(A.warn("`do_sample` changed to false because `temperature: 0` implies greedy sampling (always selecting the most likely token), which is incompatible with `do_sample: true`."),e.do_sample=!1),e.do_sample&&e.temperature!==null&&e.temperature!==1&&r.push(new tg(e.temperature)),n!==null&&r.extend(n),r}_prepare_generation_config(e,t,n=ng){let r={...this.config};for(let e of[`decoder`,`generator`,`text_config`])e in r&&Object.assign(r,r[e]);let i=new n(r);return Object.assign(i,this.generation_config??{}),e&&Object.assign(i,e),t&&Object.assign(i,ci(t,Object.getOwnPropertyNames(i))),i}_get_stopping_criteria(e,t=null){let n=new ig;return e.max_length!==null&&n.push(new ag(e.max_length,this.config.max_position_embeddings??null)),e.eos_token_id!==null&&n.push(new og(e.eos_token_id)),t&&n.extend(t),n}_validate_model_class(){if(!this.can_generate){let e=[_g.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES,_g.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES,_g.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES].filter(Boolean),t=Tg.get(this.constructor),n=/* @__PURE__ */ new Set,r=this.config.model_type;for(let t of e){let e=t?.get(r);e&&n.add(e)}let i=`The current model class (${t}) is not compatible with \`.generate()\`, as it doesn't have a language model head.`;throw n.size>0&&(i+=` Please use the following class instead: ${[...n].join(`, `)}`),Error(i)}}prepare_inputs_for_generation(...e){if(!this._prepare_inputs_for_generation)throw Error(`prepare_inputs_for_generation is not implemented for this model.`);return this._prepare_inputs_for_generation(this,...e)}_update_model_kwargs_for_generation({generated_input_ids:e,outputs:t,model_inputs:n,is_encoder_decoder:r}){return n.past_key_values=kg(t,n.past_key_values),n.input_ids=new V(`int64`,e.flat(),[e.length,1]),r?`decoder_attention_mask`in n&&(n.decoder_attention_mask=H([n.decoder_attention_mask,yu([n.decoder_attention_mask.dims[0],1])],1)):n.attention_mask=H([n.attention_mask,yu([n.attention_mask.dims[0],1])],1),n.position_ids=null,n}_prepare_model_inputs({inputs:e,bos_token_id:t,model_kwargs:n}){let r=ci(n,this.forward_params),i=this.main_input_name;if(i in r){if(e)throw Error("`inputs`: {inputs}` were passed alongside {input_name} which is not allowed. Make sure to either pass {inputs} or {input_name}=...")}else r[i]=e;return{inputs_tensor:r[i],model_inputs:r,model_input_name:i}}async _prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:e,model_inputs:t,model_input_name:n,generation_config:r}){if(this.sessions.model.inputNames.includes(`inputs_embeds`)&&!t.inputs_embeds&&`_prepare_inputs_embeds`in this){let{input_ids:e,pixel_values:n,attention_mask:r,...i}=t,a=await this._prepare_inputs_embeds(t);t={...i,...ci(a,[`inputs_embeds`,`attention_mask`])}}let{last_hidden_state:i}=await Dg(this,t);if(r.guidance_scale!==null&&r.guidance_scale>1)i=H([i,vu(i,0)],0),`attention_mask`in t&&(t.attention_mask=H([t.attention_mask,Su(t.attention_mask)],0));else if(t.decoder_input_ids){let e=yg(t.decoder_input_ids).dims[0];if(e!==i.dims[0]){if(i.dims[0]!==1)throw Error(`The encoder outputs have a different batch size (${i.dims[0]}) than the decoder inputs (${e}).`);i=H(Array.from({length:e},()=>i),0)}}return t.encoder_outputs=i,t}_prepare_decoder_input_ids_for_generation({batch_size:e,model_input_name:t,model_kwargs:n,decoder_start_token_id:r,bos_token_id:i,generation_config:a}){let{decoder_input_ids:o,...s}=n;if(!(o instanceof V)){if(o)Array.isArray(o[0])||(o=Array.from({length:e},()=>o));else if(r??=i,this.config.model_type===`musicgen`)o=Array.from({length:e*this.config.decoder.num_codebooks},()=>[r]);else if(Array.isArray(r)){if(r.length!==e)throw Error(`\`decoder_start_token_id\` expected to have length ${e} but got ${r.length}`);o=r}else o=Array.from({length:e},()=>[r]);o=yg(o)}return s.decoder_attention_mask=bu(o),{input_ids:o,model_inputs:s}}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,streamer:i=null,...a}){this._validate_model_class(),t=this._prepare_generation_config(t,a);let{inputs_tensor:o,model_inputs:s,model_input_name:c}=this._prepare_model_inputs({inputs:e,model_kwargs:a}),l=this.config.is_encoder_decoder;l&&(`encoder_outputs`in s||(s=await this._prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:o,model_inputs:s,model_input_name:c,generation_config:t})));let u;l?{input_ids:u,model_inputs:s}=this._prepare_decoder_input_ids_for_generation({batch_size:s[c].dims.at(0),model_input_name:c,model_kwargs:s,decoder_start_token_id:t.decoder_start_token_id,bos_token_id:t.bos_token_id,generation_config:t}):u=s[c];let d=u.dims.at(-1);t.max_new_tokens!==null&&(t.max_length=d+t.max_new_tokens);let f=this._get_logits_processor(t,d,n),p=this._get_stopping_criteria(t,r),m=s[c].dims.at(0),h=sg.getSampler(t),g=Array(m).fill(0),_=u.tolist();i&&i.put(_);let v,y={},b={};for(;;){if(s=this.prepare_inputs_for_generation(_,s,t),v=await this.forward(s),t.return_dict_in_generate){if(t.output_attentions){let e=Ag(v);for(let t in e)t in y||(y[t]=[]),y[t].push(e[t])}else this._return_dict_in_generate_keys&&Object.assign(b,ci(v,this._return_dict_in_generate_keys))}let e=f(_,v.logits.slice(null,-1,null).to(`float32`)),n=[];for(let t=0;te))break;s=this._update_model_kwargs_for_generation({generated_input_ids:n,outputs:v,model_inputs:s,is_encoder_decoder:l})}i&&i.end();let x=new V(`int64`,_.flat(),[_.length,_[0].length]),S=kg(v,s.past_key_values),C=new Set(Object.values(S));for(let e of Object.values(v))e.location===`gpu-buffer`&&!C.has(e)&&e.dispose();return`past_key_values`in a||t.return_dict_in_generate||await S.dispose(),t.return_dict_in_generate?{sequences:x,past_key_values:S,...y,...b}:x}async _encode_input(e,t,n){if(!Object.hasOwn(this.sessions,e))throw Error(`Model does not have a ${e} session.`);let r=this.sessions[e];return(await q(r,ci(t,r.inputNames)))[n]}async encode_image(e){return this._encode_input(`vision_encoder`,e,`image_features`)}async encode_text(e){return this._encode_input(`embed_tokens`,e,`inputs_embeds`)}async encode_audio(e){return this._encode_input(`audio_encoder`,e,`audio_features`)}};async function Eg(e,t){let{encoder_outputs:n,input_ids:r,decoder_input_ids:i,decoder_attention_mask:a,...o}=t;return n||=(await Dg(e,ci(t,e.sessions.model.inputNames))).last_hidden_state,o.input_ids=i,o.encoder_hidden_states=n,e.sessions.decoder_model_merged.inputNames.includes(`encoder_attention_mask`)&&(o.encoder_attention_mask=t.attention_mask),a&&!o.attention_mask&&(o.attention_mask=a),await Pg(e,o,!0)}async function Dg(e,t){let n=e.sessions.model,r=ci(t,n.inputNames);if(n.inputNames.includes(`inputs_embeds`)&&!r.inputs_embeds){if(!t.input_ids)throw Error("Both `input_ids` and `inputs_embeds` are missing in the model inputs.");r.inputs_embeds=await e.encode_text({input_ids:t.input_ids})}if(n.inputNames.includes(`token_type_ids`)&&!r.token_type_ids){if(!r.input_ids)throw Error("Both `input_ids` and `token_type_ids` are missing in the model inputs.");r.token_type_ids=Su(r.input_ids)}if(n.inputNames.includes(`pixel_mask`)&&!r.pixel_mask){if(!r.pixel_values)throw Error("Both `pixel_values` and `pixel_mask` are missing in the model inputs.");let e=r.pixel_values.dims;r.pixel_mask=yu([e[0],e[2],e[3]])}return await q(n,r)}async function Og(e,t){let n=await e.encode(t);return await e.decode(n)}function kg(e,t){let n=/* @__PURE__ */ Object.create(null);for(let r in e)if(r.startsWith(`present`)){let i=r.replace(`present_ssm`,`past_ssm`).replace(`present_conv`,`past_conv`).replace(`present_recurrent`,`past_recurrent`).replace(`present_compressor`,`past_compressor`).replace(`present_indexer`,`past_indexer`).replace(`present`,`past_key_values`);n[i]=r.includes(`encoder`)&&t?t[i]:e[r]}return t?(t.update(n),t):new dg(n)}function Ag(e){let t={};for(let n of[`cross_attentions`,`encoder_attentions`,`decoder_attentions`])for(let r in e)r.startsWith(n)&&(n in t||(t[n]=[]),t[n].push(e[r]));return t}function jg(e,t){return e.map(e=>typeof e==`number`?e:t[e]??0)}function Mg(e,t,n){if(n&&Object.keys(n).length>0)return Object.assign(t,n),n;let r=e.sessions.decoder_model_merged??e.sessions.model,i=(t[e.main_input_name]??t.attention_mask)?.dims?.[0]??1,a=bh(e.config),o=e.config?.normalized_config?.num_heads,s={batch_size:i};typeof o==`number`&&(s[`batch_size x num_heads`]=i*o);let c=/* @__PURE__ */ Object.create(null);for(let e of r.inputMetadata){if(!a.has(e.name))continue;let n=jg(e.shape,s),r=n.reduce((e,t)=>e*t,1),i=Ql[e.type],o=new V(e.type,new i(r),n);t[e.name]=o,c[e.name]=o}return n?(n.update(c),n):new dg(c)}function Ng(e,t,n){t.num_logits_to_keep||(e.sessions.decoder_model_merged??e.sessions.model)?.inputNames.includes(`num_logits_to_keep`)&&(t.num_logits_to_keep=new V(`int64`,[n],[]))}async function Pg(e,t,n=!1){let r=e.sessions[n?`decoder_model_merged`:`model`],{past_key_values:i,...a}=t;return r.inputNames.includes(`use_cache_branch`)&&(a.use_cache_branch=bg(i!=null&&Object.keys(i).length>0)),r.inputNames.includes(`position_ids`)&&a.attention_mask&&!a.position_ids&&(a.position_ids=zg(a,i,+!![`paligemma`,`gemma3_text`,`gemma3`].includes(e.config.model_type))),Ng(e,a,0n),Mg(e,a,i),await q(r,ci(a,r.inputNames))}async function Fg(e,{encode_function:t,merge_function:n,modality_input_names:r,modality_output_name:i,input_ids:a=null,attention_mask:o=null,position_ids:s=null,inputs_embeds:c=null,past_key_values:l=null,generation_config:u=null,logits_processor:d=null,num_logits_to_keep:f=null,...p}){if(!c){c=await e.encode_text({input_ids:a,...p});let s=ci(p,r);if(Object.keys(s).length>0){if(a.dims[1]!==1){let e=await t({...s,...p});({inputs_embeds:c,attention_mask:o}=n({[i]:e,inputs_embeds:c,input_ids:a,attention_mask:o}))}else if(l&&a.dims[1]===1){let e=a.dims[1],t=l.get_seq_length();o=H([yu([a.dims[0],t]),o.slice(null,[o.dims[1]-e,o.dims[1]])],1)}}}if(!s&&[`qwen2_vl`,`qwen2_vl_text`,`qwen2_5_vl`,`qwen2_5_vl_text`,`qwen3_vl`,`qwen3_vl_text`,`qwen3_vl_moe`,`qwen3_vl_moe_text`,`qwen3_5`,`qwen3_5_text`,`qwen3_5_moe`,`qwen3_5_moe_text`,`glm_ocr`,`glm_ocr_text`].includes(e.config.model_type)){let{image_grid_thw:t,video_grid_thw:n}=p;[s]=e.get_rope_index(a,t,n,o)}return await Pg(e,{inputs_embeds:c,past_key_values:l,attention_mask:o,position_ids:s,generation_config:u,logits_processor:d,num_logits_to_keep:f},!0)}async function Ig(e,t){return await Fg(e,{...t,modality_input_names:[`audio_values`,`input_features`],modality_output_name:`audio_features`,encode_function:e.encode_audio.bind(e),merge_function:e._merge_input_ids_with_audio_features.bind(e)})}async function Lg(e,t){return await Fg(e,{...t,modality_input_names:[`pixel_values`],modality_output_name:`image_features`,encode_function:e.encode_image.bind(e),merge_function:e._merge_input_ids_with_image_features.bind(e)})}function Rg(e,t=0){let[n,r]=e.dims,i=e.data,a=new BigInt64Array(i.length);for(let e=0;ee.dims[1]||i[e.at(-1)])),Ng(e,n,1n),{...n,decoder_input_ids:yg(t)}}function Hg(e,...t){return e.config.is_encoder_decoder?Vg(e,...t):Bg(e,...t)}function Ug({modality_token_id:e,inputs_embeds:t,modality_features:n,input_ids:r,attention_mask:i}){let a=r.tolist().map(t=>t.reduce((t,n,r)=>(n==e&&t.push(r),t),[])),o=a.reduce((e,t)=>e+t.length,0),s=n.dims[0];if(o!==s)throw Error(`Number of tokens and features do not match: tokens: ${o}, features ${s}`);let c=0;for(let e=0;e[r,await rl(e,t[r],!1,n)])))}var qg={};Sr(qg,{ASTForAudioClassification:()=>u_,ASTModel:()=>l_,ASTPreTrainedModel:()=>c_,AfmoeForCausalLM:()=>i_,AfmoeModel:()=>r_,AfmoePreTrainedModel:()=>n_,AlbertForMaskedLM:()=>Qg,AlbertForQuestionAnswering:()=>Zg,AlbertForSequenceClassification:()=>Xg,AlbertModel:()=>Yg,AlbertPreTrainedModel:()=>Jg,ApertusForCausalLM:()=>t_,ApertusModel:()=>e_,ApertusPreTrainedModel:()=>$g,ArceeForCausalLM:()=>s_,ArceeModel:()=>o_,ArceePreTrainedModel:()=>a_,BartForConditionalGeneration:()=>p_,BartForSequenceClassification:()=>m_,BartModel:()=>f_,BartPretrainedModel:()=>d_,BaseModelOutput:()=>Nh,BeitForImageClassification:()=>__,BeitModel:()=>g_,BeitPreTrainedModel:()=>h_,BertForMaskedLM:()=>b_,BertForQuestionAnswering:()=>C_,BertForSequenceClassification:()=>x_,BertForTokenClassification:()=>S_,BertModel:()=>y_,BertPreTrainedModel:()=>v_,BlenderbotForConditionalGeneration:()=>E_,BlenderbotModel:()=>T_,BlenderbotPreTrainedModel:()=>w_,BlenderbotSmallForConditionalGeneration:()=>k_,BlenderbotSmallModel:()=>O_,BlenderbotSmallPreTrainedModel:()=>D_,BloomForCausalLM:()=>M_,BloomModel:()=>j_,BloomPreTrainedModel:()=>A_,CHMv2ForDepthEstimation:()=>K_,CHMv2PreTrainedModel:()=>G_,CLIPModel:()=>Q_,CLIPPreTrainedModel:()=>Z_,CLIPSegForImageSegmentation:()=>av,CLIPSegModel:()=>iv,CLIPSegPreTrainedModel:()=>rv,CLIPTextModel:()=>$_,CLIPTextModelWithProjection:()=>ev,CLIPVisionModel:()=>tv,CLIPVisionModelWithProjection:()=>nv,CamembertForMaskedLM:()=>F_,CamembertForQuestionAnswering:()=>R_,CamembertForSequenceClassification:()=>I_,CamembertForTokenClassification:()=>L_,CamembertModel:()=>P_,CamembertPreTrainedModel:()=>N_,CausalLMOutput:()=>Lh,CausalLMOutputWithPast:()=>Rh,ChatterboxModel:()=>H_,ChatterboxPreTrainedModel:()=>V_,ChineseCLIPModel:()=>W_,ChineseCLIPPreTrainedModel:()=>U_,ClapAudioModelWithProjection:()=>X_,ClapModel:()=>J_,ClapPreTrainedModel:()=>q_,ClapTextModelWithProjection:()=>Y_,CodeGenForCausalLM:()=>cv,CodeGenModel:()=>sv,CodeGenPreTrainedModel:()=>ov,Cohere2ForCausalLM:()=>mv,Cohere2Model:()=>pv,Cohere2PreTrainedModel:()=>fv,CohereAsrForConditionalGeneration:()=>_v,CohereAsrModel:()=>gv,CohereAsrPreTrainedModel:()=>hv,CohereForCausalLM:()=>dv,CohereModel:()=>uv,CoherePreTrainedModel:()=>lv,ConvBertForMaskedLM:()=>bv,ConvBertForQuestionAnswering:()=>Cv,ConvBertForSequenceClassification:()=>xv,ConvBertForTokenClassification:()=>Sv,ConvBertModel:()=>yv,ConvBertPreTrainedModel:()=>vv,ConvNextForImageClassification:()=>Ev,ConvNextModel:()=>Tv,ConvNextPreTrainedModel:()=>wv,ConvNextV2ForImageClassification:()=>kv,ConvNextV2Model:()=>Ov,ConvNextV2PreTrainedModel:()=>Dv,DFineForObjectDetection:()=>Iv,DFineModel:()=>Fv,DFinePreTrainedModel:()=>Pv,DINOv3ConvNextModel:()=>ky,DINOv3ConvNextPreTrainedModel:()=>Oy,DINOv3ViTModel:()=>jy,DINOv3ViTPreTrainedModel:()=>Ay,DPTForDepthEstimation:()=>Hy,DPTModel:()=>Vy,DPTPreTrainedModel:()=>By,DacDecoderModel:()=>Hv,DacDecoderOutput:()=>Rv,DacEncoderModel:()=>Vv,DacEncoderOutput:()=>Lv,DacModel:()=>Bv,DacPreTrainedModel:()=>zv,DebertaForMaskedLM:()=>Gv,DebertaForQuestionAnswering:()=>Jv,DebertaForSequenceClassification:()=>Kv,DebertaForTokenClassification:()=>qv,DebertaModel:()=>Wv,DebertaPreTrainedModel:()=>Uv,DebertaV2ForMaskedLM:()=>ry,DebertaV2ForQuestionAnswering:()=>oy,DebertaV2ForSequenceClassification:()=>iy,DebertaV2ForTokenClassification:()=>ay,DebertaV2Model:()=>ny,DebertaV2PreTrainedModel:()=>ty,DecisionTransformerModel:()=>cy,DecisionTransformerPreTrainedModel:()=>sy,DeepseekV3ForCausalLM:()=>Zv,DeepseekV3Model:()=>Xv,DeepseekV3PreTrainedModel:()=>Yv,DeepseekV4ForCausalLM:()=>ey,DeepseekV4Model:()=>$v,DeepseekV4PreTrainedModel:()=>Qv,DeiTForImageClassification:()=>dy,DeiTModel:()=>uy,DeiTPreTrainedModel:()=>ly,DepthAnythingForDepthEstimation:()=>py,DepthAnythingPreTrainedModel:()=>fy,DepthProForDepthEstimation:()=>hy,DepthProPreTrainedModel:()=>my,DetrForObjectDetection:()=>vy,DetrForSegmentation:()=>yy,DetrModel:()=>_y,DetrObjectDetectionOutput:()=>by,DetrPreTrainedModel:()=>gy,DetrSegmentationOutput:()=>xy,Dinov2ForImageClassification:()=>wy,Dinov2Model:()=>Cy,Dinov2PreTrainedModel:()=>Sy,Dinov2WithRegistersForImageClassification:()=>Dy,Dinov2WithRegistersModel:()=>Ey,Dinov2WithRegistersPreTrainedModel:()=>Ty,DistilBertForMaskedLM:()=>Ly,DistilBertForQuestionAnswering:()=>Iy,DistilBertForSequenceClassification:()=>Py,DistilBertForTokenClassification:()=>Fy,DistilBertModel:()=>Ny,DistilBertPreTrainedModel:()=>My,DonutSwinModel:()=>zy,DonutSwinPreTrainedModel:()=>Ry,EdgeTamModel:()=>kE,EfficientNetForImageClassification:()=>Gy,EfficientNetModel:()=>Wy,EfficientNetPreTrainedModel:()=>Uy,ElectraForMaskedLM:()=>Jy,ElectraForQuestionAnswering:()=>Zy,ElectraForSequenceClassification:()=>Yy,ElectraForTokenClassification:()=>Xy,ElectraModel:()=>qy,ElectraPreTrainedModel:()=>Ky,Ernie4_5ForCausalLM:()=>eb,Ernie4_5Model:()=>$y,Ernie4_5PretrainedModel:()=>Qy,EsmForMaskedLM:()=>rb,EsmForSequenceClassification:()=>ib,EsmForTokenClassification:()=>ab,EsmModel:()=>nb,EsmPreTrainedModel:()=>tb,EuroBertForMaskedLM:()=>cb,EuroBertForSequenceClassification:()=>lb,EuroBertForTokenClassification:()=>ub,EuroBertModel:()=>sb,EuroBertPreTrainedModel:()=>ob,ExaoneForCausalLM:()=>pb,ExaoneModel:()=>fb,ExaonePreTrainedModel:()=>db,FalconForCausalLM:()=>gb,FalconH1ForCausalLM:()=>yb,FalconH1Model:()=>vb,FalconH1PreTrainedModel:()=>_b,FalconModel:()=>hb,FalconPreTrainedModel:()=>mb,FastViTForImageClassification:()=>Sb,FastViTModel:()=>xb,FastViTPreTrainedModel:()=>bb,Florence2ForConditionalGeneration:()=>wb,Florence2PreTrainedModel:()=>Cb,GLPNForDepthEstimation:()=>ix,GLPNModel:()=>rx,GLPNPreTrainedModel:()=>nx,GPT2LMHeadModel:()=>yx,GPT2Model:()=>vx,GPT2PreTrainedModel:()=>_x,GPTBigCodeForCausalLM:()=>sx,GPTBigCodeModel:()=>ox,GPTBigCodePreTrainedModel:()=>ax,GPTJForCausalLM:()=>Sx,GPTJModel:()=>xx,GPTJPreTrainedModel:()=>bx,GPTNeoForCausalLM:()=>ux,GPTNeoModel:()=>lx,GPTNeoPreTrainedModel:()=>cx,GPTNeoXForCausalLM:()=>px,GPTNeoXModel:()=>fx,GPTNeoXPreTrainedModel:()=>dx,Gemma2ForCausalLM:()=>Ab,Gemma2Model:()=>kb,Gemma2PreTrainedModel:()=>Ob,Gemma3ForCausalLM:()=>Rb,Gemma3ForConditionalGeneration:()=>Lb,Gemma3Model:()=>Ib,Gemma3PreTrainedModel:()=>Fb,Gemma3nForCausalLM:()=>Vb,Gemma3nForConditionalGeneration:()=>Bb,Gemma3nPreTrainedModel:()=>zb,Gemma4ForCausalLM:()=>Ub,Gemma4ForConditionalGeneration:()=>Hb,GemmaForCausalLM:()=>Db,GemmaModel:()=>Eb,GemmaPreTrainedModel:()=>Tb,GlmForCausalLM:()=>Kb,GlmModel:()=>Gb,GlmMoeDsaForCausalLM:()=>Yb,GlmMoeDsaModel:()=>Jb,GlmMoeDsaPreTrainedModel:()=>qb,GlmOcrForConditionalGeneration:()=>tx,GlmPreTrainedModel:()=>Wb,GptOssForCausalLM:()=>gx,GptOssModel:()=>hx,GptOssPreTrainedModel:()=>mx,GraniteForCausalLM:()=>Tx,GraniteModel:()=>wx,GraniteMoeHybridForCausalLM:()=>Ox,GraniteMoeHybridModel:()=>Dx,GraniteMoeHybridPreTrainedModel:()=>Ex,GranitePreTrainedModel:()=>Cx,GraniteSpeechForConditionalGeneration:()=>jx,GroundingDinoForObjectDetection:()=>Nx,GroundingDinoPreTrainedModel:()=>Mx,GroupViTModel:()=>Fx,GroupViTPreTrainedModel:()=>Px,HeliumForCausalLM:()=>Rx,HeliumModel:()=>Lx,HeliumPreTrainedModel:()=>Ix,HieraForImageClassification:()=>Vx,HieraModel:()=>Bx,HieraPreTrainedModel:()=>zx,HrmTextForCausalLM:()=>Wx,HrmTextModel:()=>Ux,HrmTextPreTrainedModel:()=>Hx,HubertForCTC:()=>Qx,HubertForSequenceClassification:()=>$x,HubertModel:()=>Zx,HubertPreTrainedModel:()=>Xx,HunYuanDenseV1ForCausalLM:()=>nS,HunYuanDenseV1Model:()=>tS,HunYuanDenseV1PreTrainedModel:()=>eS,IJepaForImageClassification:()=>oS,IJepaModel:()=>aS,IJepaPreTrainedModel:()=>iS,Idefics3ForConditionalGeneration:()=>rS,ImageMattingOutput:()=>Bh,JAISLMHeadModel:()=>lS,JAISModel:()=>cS,JAISPreTrainedModel:()=>sS,JinaCLIPModel:()=>dS,JinaCLIPPreTrainedModel:()=>uS,JinaCLIPTextModel:()=>fS,JinaCLIPVisionModel:()=>pS,Lfm2ForCausalLM:()=>gS,Lfm2Model:()=>hS,Lfm2MoeForCausalLM:()=>bS,Lfm2MoeModel:()=>yS,Lfm2MoePreTrainedModel:()=>vS,Lfm2PreTrainedModel:()=>mS,Lfm2VlForConditionalGeneration:()=>xS,LightOnOcrForConditionalGeneration:()=>_S,LiteWhisperForConditionalGeneration:()=>RO,Llama4ForCausalLM:()=>ES,Llama4PreTrainedModel:()=>TS,LlamaForCausalLM:()=>wS,LlamaModel:()=>CS,LlamaPreTrainedModel:()=>SS,LlavaForConditionalGeneration:()=>Mb,LlavaOnevisionForConditionalGeneration:()=>Mb,LlavaPreTrainedModel:()=>jb,LlavaQwen2ForCausalLM:()=>Pb,LongT5ForConditionalGeneration:()=>kS,LongT5Model:()=>OS,LongT5PreTrainedModel:()=>DS,M2M100ForConditionalGeneration:()=>MS,M2M100Model:()=>jS,M2M100PreTrainedModel:()=>AS,MBartForCausalLM:()=>US,MBartForConditionalGeneration:()=>VS,MBartForSequenceClassification:()=>HS,MBartModel:()=>BS,MBartPreTrainedModel:()=>zS,MPNetForMaskedLM:()=>aw,MPNetForQuestionAnswering:()=>cw,MPNetForSequenceClassification:()=>ow,MPNetForTokenClassification:()=>sw,MPNetModel:()=>iw,MPNetPreTrainedModel:()=>rw,MT5ForConditionalGeneration:()=>mw,MT5Model:()=>pw,MT5PreTrainedModel:()=>fw,MarianMTModel:()=>FS,MarianModel:()=>PS,MarianPreTrainedModel:()=>NS,MaskFormerForInstanceSegmentation:()=>RS,MaskFormerModel:()=>LS,MaskFormerPreTrainedModel:()=>IS,MaskedLMOutput:()=>Fh,Metric3DForDepthEstimation:()=>GS,Metric3DPreTrainedModel:()=>WS,Metric3Dv2ForDepthEstimation:()=>qS,Metric3Dv2PreTrainedModel:()=>KS,MgpstrForSceneTextRecognition:()=>XS,MgpstrModelOutput:()=>JS,MgpstrPreTrainedModel:()=>YS,MimiDecoderModel:()=>nC,MimiDecoderOutput:()=>QS,MimiEncoderModel:()=>tC,MimiEncoderOutput:()=>ZS,MimiModel:()=>eC,MimiPreTrainedModel:()=>$S,Ministral3ForCausalLM:()=>cC,Ministral3Model:()=>sC,Ministral3PreTrainedModel:()=>oC,MinistralForCausalLM:()=>aC,MinistralModel:()=>iC,MinistralPreTrainedModel:()=>rC,Mistral3ForConditionalGeneration:()=>fC,Mistral4ForCausalLM:()=>hC,Mistral4Model:()=>mC,Mistral4PreTrainedModel:()=>pC,MistralForCausalLM:()=>dC,MistralModel:()=>uC,MistralPreTrainedModel:()=>lC,MobileBertForMaskedLM:()=>vC,MobileBertForQuestionAnswering:()=>bC,MobileBertForSequenceClassification:()=>yC,MobileBertModel:()=>_C,MobileBertPreTrainedModel:()=>gC,MobileLLMForCausalLM:()=>CC,MobileLLMModel:()=>SC,MobileLLMPreTrainedModel:()=>xC,MobileNetV1ForImageClassification:()=>EC,MobileNetV1ForSemanticSegmentation:()=>DC,MobileNetV1Model:()=>TC,MobileNetV1PreTrainedModel:()=>wC,MobileNetV2ForImageClassification:()=>AC,MobileNetV2ForSemanticSegmentation:()=>jC,MobileNetV2Model:()=>kC,MobileNetV2PreTrainedModel:()=>OC,MobileNetV3ForImageClassification:()=>PC,MobileNetV3ForSemanticSegmentation:()=>FC,MobileNetV3Model:()=>NC,MobileNetV3PreTrainedModel:()=>MC,MobileNetV4ForImageClassification:()=>RC,MobileNetV4ForSemanticSegmentation:()=>zC,MobileNetV4Model:()=>LC,MobileNetV4PreTrainedModel:()=>IC,MobileViTForImageClassification:()=>HC,MobileViTModel:()=>VC,MobileViTPreTrainedModel:()=>BC,MobileViTV2ForImageClassification:()=>GC,MobileViTV2Model:()=>WC,MobileViTV2PreTrainedModel:()=>UC,ModelOutput:()=>Mh,ModernBertDecoderForCausalLM:()=>$C,ModernBertDecoderModel:()=>QC,ModernBertDecoderPreTrainedModel:()=>ZC,ModernBertForMaskedLM:()=>JC,ModernBertForSequenceClassification:()=>YC,ModernBertForTokenClassification:()=>XC,ModernBertModel:()=>qC,ModernBertPreTrainedModel:()=>KC,Moondream1ForConditionalGeneration:()=>Nb,MoonshineForConditionalGeneration:()=>nw,MoonshineModel:()=>tw,MoonshinePreTrainedModel:()=>ew,MptForCausalLM:()=>dw,MptModel:()=>uw,MptPreTrainedModel:()=>lw,MultiModalityCausalLM:()=>gw,MultiModalityPreTrainedModel:()=>hw,MusicgenForCausalLM:()=>yw,MusicgenForConditionalGeneration:()=>bw,MusicgenModel:()=>vw,MusicgenPreTrainedModel:()=>_w,NanoChatForCausalLM:()=>Cw,NanoChatModel:()=>Sw,NanoChatPreTrainedModel:()=>xw,NemotronHForCausalLM:()=>Ew,NemotronHModel:()=>Tw,NemotronHPreTrainedModel:()=>ww,NeoBertForMaskedLM:()=>kw,NeoBertForQuestionAnswering:()=>Mw,NeoBertForSequenceClassification:()=>Aw,NeoBertForTokenClassification:()=>jw,NeoBertModel:()=>Ow,NeoBertPreTrainedModel:()=>Dw,NomicBertModel:()=>Pw,NomicBertPreTrainedModel:()=>Nw,OPTForCausalLM:()=>tT,OPTModel:()=>eT,OPTPreTrainedModel:()=>$w,Olmo2ForCausalLM:()=>Bw,Olmo2Model:()=>zw,Olmo2PreTrainedModel:()=>Rw,Olmo3ForCausalLM:()=>Uw,Olmo3Model:()=>Hw,Olmo3PreTrainedModel:()=>Vw,OlmoForCausalLM:()=>Lw,OlmoHybridForCausalLM:()=>Kw,OlmoHybridModel:()=>Gw,OlmoHybridPreTrainedModel:()=>Ww,OlmoModel:()=>Iw,OlmoPreTrainedModel:()=>Fw,OpenAIPrivacyFilterForTokenClassification:()=>Yw,OpenAIPrivacyFilterModel:()=>Jw,OpenAIPrivacyFilterPreTrainedModel:()=>qw,OpenELMForCausalLM:()=>Qw,OpenELMModel:()=>Zw,OpenELMPreTrainedModel:()=>Xw,OwlViTForObjectDetection:()=>sT,OwlViTModel:()=>oT,OwlViTPreTrainedModel:()=>aT,Owlv2ForObjectDetection:()=>iT,Owlv2Model:()=>rT,Owlv2PreTrainedModel:()=>nT,PaliGemmaForConditionalGeneration:()=>cT,ParakeetForCTC:()=>uT,ParakeetPreTrainedModel:()=>lT,PatchTSMixerForPrediction:()=>pT,PatchTSMixerModel:()=>fT,PatchTSMixerPreTrainedModel:()=>dT,PatchTSTForPrediction:()=>gT,PatchTSTModel:()=>hT,PatchTSTPreTrainedModel:()=>mT,Phi3ForCausalLM:()=>ST,Phi3Model:()=>xT,Phi3PreTrainedModel:()=>bT,Phi3VForCausalLM:()=>wT,Phi3VPreTrainedModel:()=>CT,PhiForCausalLM:()=>yT,PhiModel:()=>vT,PhiPreTrainedModel:()=>_T,PreTrainedModel:()=>X,PvtForImageClassification:()=>DT,PvtModel:()=>ET,PvtPreTrainedModel:()=>TT,PyAnnoteForAudioFrameClassification:()=>AT,PyAnnoteModel:()=>kT,PyAnnotePreTrainedModel:()=>OT,QuestionAnsweringModelOutput:()=>Ih,Qwen2ForCausalLM:()=>NT,Qwen2Model:()=>MT,Qwen2MoeForCausalLM:()=>IT,Qwen2MoeModel:()=>FT,Qwen2MoePreTrainedModel:()=>PT,Qwen2PreTrainedModel:()=>jT,Qwen2VLForCausalLM:()=>Qb,Qwen2VLForConditionalGeneration:()=>Zb,Qwen2VLPreTrainedModel:()=>Xb,Qwen2_5_VLForCausalLM:()=>ex,Qwen2_5_VLForConditionalGeneration:()=>$b,Qwen3ForCausalLM:()=>zT,Qwen3Model:()=>RT,Qwen3MoeForCausalLM:()=>HT,Qwen3MoeModel:()=>VT,Qwen3MoePreTrainedModel:()=>BT,Qwen3NextForCausalLM:()=>GT,Qwen3NextModel:()=>WT,Qwen3NextPreTrainedModel:()=>UT,Qwen3PreTrainedModel:()=>LT,Qwen3VLForCausalLM:()=>qT,Qwen3VLForConditionalGeneration:()=>KT,Qwen3VLMoeForCausalLM:()=>YT,Qwen3VLMoeForConditionalGeneration:()=>JT,Qwen3_5ForCausalLM:()=>ZT,Qwen3_5ForConditionalGeneration:()=>XT,Qwen3_5MoeForCausalLM:()=>$T,Qwen3_5MoeForConditionalGeneration:()=>QT,RFDetrForObjectDetection:()=>aE,RFDetrModel:()=>iE,RFDetrObjectDetectionOutput:()=>oE,RFDetrPreTrainedModel:()=>rE,RTDetrForObjectDetection:()=>Mv,RTDetrModel:()=>jv,RTDetrObjectDetectionOutput:()=>Nv,RTDetrPreTrainedModel:()=>Av,RTDetrV2ForObjectDetection:()=>xE,RTDetrV2Model:()=>bE,RTDetrV2ObjectDetectionOutput:()=>SE,RTDetrV2PreTrainedModel:()=>yE,ResNetForImageClassification:()=>nE,ResNetModel:()=>tE,ResNetPreTrainedModel:()=>eE,RoFormerForMaskedLM:()=>hE,RoFormerForQuestionAnswering:()=>vE,RoFormerForSequenceClassification:()=>gE,RoFormerForTokenClassification:()=>_E,RoFormerModel:()=>mE,RoFormerPreTrainedModel:()=>pE,RobertaForMaskedLM:()=>lE,RobertaForQuestionAnswering:()=>fE,RobertaForSequenceClassification:()=>uE,RobertaForTokenClassification:()=>dE,RobertaModel:()=>cE,RobertaPreTrainedModel:()=>sE,Sam2ImageSegmentationOutput:()=>EE,Sam2Model:()=>OE,Sam2PreTrainedModel:()=>DE,Sam3TrackerModel:()=>AE,SamImageSegmentationOutput:()=>CE,SamModel:()=>TE,SamPreTrainedModel:()=>wE,SapiensForDepthEstimation:()=>NE,SapiensForNormalEstimation:()=>PE,SapiensForSemanticSegmentation:()=>ME,SapiensPreTrainedModel:()=>jE,SegformerForImageClassification:()=>LE,SegformerForSemanticSegmentation:()=>RE,SegformerModel:()=>IE,SegformerPreTrainedModel:()=>FE,Seq2SeqLMOutput:()=>zh,SequenceClassifierOutput:()=>J,SiglipModel:()=>BE,SiglipPreTrainedModel:()=>zE,SiglipTextModel:()=>VE,SiglipVisionModel:()=>HE,SmolLM3ForCausalLM:()=>GE,SmolLM3Model:()=>WE,SmolLM3PreTrainedModel:()=>UE,SmolVLMForConditionalGeneration:()=>KE,SnacDecoderModel:()=>XE,SnacEncoderModel:()=>YE,SnacModel:()=>JE,SnacPreTrainedModel:()=>qE,SolarOpenForCausalLM:()=>$E,SolarOpenModel:()=>QE,SolarOpenPreTrainedModel:()=>ZE,SpeechT5ForSpeechToText:()=>nD,SpeechT5ForTextToSpeech:()=>rD,SpeechT5HifiGan:()=>iD,SpeechT5Model:()=>tD,SpeechT5PreTrainedModel:()=>eD,SqueezeBertForMaskedLM:()=>sD,SqueezeBertForQuestionAnswering:()=>lD,SqueezeBertForSequenceClassification:()=>cD,SqueezeBertModel:()=>oD,SqueezeBertPreTrainedModel:()=>aD,StableLmForCausalLM:()=>fD,StableLmModel:()=>dD,StableLmPreTrainedModel:()=>uD,Starcoder2ForCausalLM:()=>hD,Starcoder2Model:()=>mD,Starcoder2PreTrainedModel:()=>pD,StyleTextToSpeech2Model:()=>_D,StyleTextToSpeech2PreTrainedModel:()=>gD,SupertonicForConditionalGeneration:()=>yD,SupertonicPreTrainedModel:()=>vD,Swin2SRForImageSuperResolution:()=>ED,Swin2SRModel:()=>TD,Swin2SRPreTrainedModel:()=>wD,SwinForImageClassification:()=>SD,SwinForSemanticSegmentation:()=>CD,SwinModel:()=>xD,SwinPreTrainedModel:()=>bD,T5ForConditionalGeneration:()=>kD,T5Model:()=>OD,T5PreTrainedModel:()=>DD,TableTransformerForObjectDetection:()=>MD,TableTransformerModel:()=>jD,TableTransformerObjectDetectionOutput:()=>ND,TableTransformerPreTrainedModel:()=>AD,TokenClassifierOutput:()=>Ph,TrOCRForCausalLM:()=>FD,TrOCRPreTrainedModel:()=>PD,UltravoxModel:()=>Ax,UltravoxPreTrainedModel:()=>kx,UniSpeechForCTC:()=>RD,UniSpeechForSequenceClassification:()=>zD,UniSpeechModel:()=>LD,UniSpeechPreTrainedModel:()=>ID,UniSpeechSatForAudioFrameClassification:()=>WD,UniSpeechSatForCTC:()=>HD,UniSpeechSatForSequenceClassification:()=>UD,UniSpeechSatModel:()=>VD,UniSpeechSatPreTrainedModel:()=>BD,VaultGemmaForCausalLM:()=>qD,VaultGemmaModel:()=>KD,VaultGemmaPreTrainedModel:()=>GD,ViTForImageClassification:()=>ZD,ViTMAEModel:()=>$D,ViTMAEPreTrainedModel:()=>QD,ViTMSNForImageClassification:()=>nO,ViTMSNModel:()=>tO,ViTMSNPreTrainedModel:()=>eO,ViTModel:()=>XD,ViTPreTrainedModel:()=>YD,VisionEncoderDecoderModel:()=>JD,VitMatteForImageMatting:()=>iO,VitMattePreTrainedModel:()=>rO,VitPoseForPoseEstimation:()=>oO,VitPosePreTrainedModel:()=>aO,VitsModel:()=>lO,VitsModelOutput:()=>sO,VitsPreTrainedModel:()=>cO,VoxtralForConditionalGeneration:()=>uO,VoxtralRealtimeForConditionalGeneration:()=>bO,VoxtralRealtimePreTrainedModel:()=>yO,Wav2Vec2BertForCTC:()=>CO,Wav2Vec2BertForSequenceClassification:()=>wO,Wav2Vec2BertModel:()=>SO,Wav2Vec2BertPreTrainedModel:()=>xO,Wav2Vec2ForAudioFrameClassification:()=>Yx,Wav2Vec2ForCTC:()=>qx,Wav2Vec2ForSequenceClassification:()=>Jx,Wav2Vec2Model:()=>Kx,Wav2Vec2PreTrainedModel:()=>Gx,WavLMForAudioFrameClassification:()=>jO,WavLMForCTC:()=>OO,WavLMForSequenceClassification:()=>kO,WavLMForXVector:()=>AO,WavLMModel:()=>DO,WavLMPreTrainedModel:()=>EO,WeSpeakerResNetModel:()=>NO,WeSpeakerResNetPreTrainedModel:()=>MO,WhisperForConditionalGeneration:()=>LO,WhisperModel:()=>IO,WhisperPreTrainedModel:()=>FO,XLMForQuestionAnswering:()=>WO,XLMForSequenceClassification:()=>HO,XLMForTokenClassification:()=>UO,XLMModel:()=>BO,XLMPreTrainedModel:()=>zO,XLMRobertaForMaskedLM:()=>qO,XLMRobertaForQuestionAnswering:()=>XO,XLMRobertaForSequenceClassification:()=>JO,XLMRobertaForTokenClassification:()=>YO,XLMRobertaModel:()=>KO,XLMRobertaPreTrainedModel:()=>GO,XLMWithLMHeadModel:()=>VO,XVectorOutput:()=>TO,YolosForObjectDetection:()=>$O,YolosModel:()=>QO,YolosObjectDetectionOutput:()=>ek,YolosPreTrainedModel:()=>ZO,YoutuForCausalLM:()=>rk,YoutuModel:()=>nk,YoutuPreTrainedModel:()=>tk,ZayaForCausalLM:()=>ok,ZayaModel:()=>ak,ZayaPreTrainedModel:()=>ik});var Jg=class extends X{},Yg=class extends Jg{},Xg=class extends Jg{async _call(e){return new J(await super._call(e))}},Zg=class extends Jg{async _call(e){return new Ih(await super._call(e))}},Qg=class extends Jg{async _call(e){return new Fh(await super._call(e))}},$g=class extends X{},e_=class extends $g{},t_=class extends $g{},n_=class extends X{},r_=class extends n_{},i_=class extends n_{},a_=class extends X{},o_=class extends a_{},s_=class extends a_{},c_=class extends X{},l_=class extends c_{},u_=class extends c_{},d_=class extends X{},f_=class extends d_{},p_=class extends d_{},m_=class extends d_{async _call(e){return new J(await super._call(e))}},h_=class extends X{},g_=class extends h_{},__=class extends h_{async _call(e){return new J(await super._call(e))}},v_=class extends X{},y_=class extends v_{},b_=class extends v_{async _call(e){return new Fh(await super._call(e))}},x_=class extends v_{async _call(e){return new J(await super._call(e))}},S_=class extends v_{async _call(e){return new Ph(await super._call(e))}},C_=class extends v_{async _call(e){return new Ih(await super._call(e))}},w_=class extends X{},T_=class extends w_{},E_=class extends w_{},D_=class extends X{},O_=class extends D_{},k_=class extends D_{},A_=class extends X{},j_=class extends A_{},M_=class extends A_{},N_=class extends X{},P_=class extends N_{},F_=class extends N_{async _call(e){return new Fh(await super._call(e))}},I_=class extends N_{async _call(e){return new J(await super._call(e))}},L_=class extends N_{async _call(e){return new Ph(await super._call(e))}},R_=class extends N_{async _call(e){return new Ih(await super._call(e))}},z_=4299n,B_=6561n,V_=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`audio_values`,`exaggeration`,`audio_features`,`audio_tokens`,`speaker_embeddings`,`speaker_features`,`past_key_values`];main_input_name=`input_ids`;_return_dict_in_generate_keys=[`audio_tokens`,`speaker_embeddings`,`speaker_features`]},H_=class extends V_{async encode_speech(e){return q(this.sessions.speech_encoder,{audio_values:e})}async forward({input_ids:e=null,attention_mask:t=null,audio_values:n=null,exaggeration:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,audio_features:u=null,audio_tokens:d=null,speaker_embeddings:f=null,speaker_features:p=null,...m}){let h;if(!a){let s=this.sessions.embed_tokens.inputNames,c={input_ids:e};if(s.includes(`exaggeration`)){if(!(r instanceof V)){let t=e.dims[0];if(r==null)r=_u([t],.5);else if(typeof r==`number`)r=_u([t],r);else if(Array.isArray(r))r=new V(`float32`,r,[t]);else throw Error("Unsupported type for `exaggeration` input")}c.exaggeration=r}if(s.includes(`position_ids`)&&(c.position_ids=i),{inputs_embeds:a}=await q(this.sessions.embed_tokens,c),u&&d&&f&&p&&(h={audio_features:u,audio_tokens:d,speaker_embeddings:f,speaker_features:p}),h||n)h??=await this.encode_speech(n),a=H([h.audio_features,a],1),t=yu([a.dims[0],a.dims[1]]);else{let e=a.dims[1];if(!o||e!==1)throw Error(`Incorrect state encountered during generation.`);let n=o.get_seq_length();t=yu([a.dims[0],n+e])}}return{...await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1),...h}}prepare_inputs_for_generation(e,t,n){return!t.position_ids&&this.sessions.embed_tokens.inputNames.includes(`position_ids`)&&(t.position_ids=t.input_ids.dims[1]===1?new V(`int64`,Array.from({length:e.length},(t,n)=>e[n].length-e[n].findLastIndex(e=>e==B_)-1),[e.length,1]):new V(`int64`,t.input_ids.tolist().map(e=>{let t=0;return e.map(e=>e>=B_?0:t++)}).flat(),t.input_ids.dims)),t.input_ids.dims[1]===1&&(delete t.audio_values,delete t.audio_features,delete t.audio_tokens,delete t.speaker_embeddings,delete t.speaker_features),Bg(this,e,t,n)}async generate(e){let t=e.past_key_values,{sequences:n,audio_tokens:r,speaker_embeddings:i,speaker_features:a,past_key_values:o}=await super.generate({...e,return_dict_in_generate:!0});try{let t=n.slice(null,[e.input_ids.dims[1],-1]),o=H([r,t,_u([t.dims[0],3],z_)],1),{waveform:s}=await q(this.sessions.conditional_decoder,{speech_tokens:o,speaker_features:a,speaker_embeddings:i});return s}finally{o!==t&&await o?.dispose()}}},U_=class extends X{},W_=class extends U_{},G_=class extends X{},K_=class extends G_{},q_=class extends X{},J_=class extends q_{},Y_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},X_=class extends q_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`audio_model`})}},Z_=class extends X{},Q_=class extends Z_{},$_=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},ev=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},tv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},nv=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},rv=class extends X{},iv=class extends rv{},av=class extends rv{},ov=class extends X{},sv=class extends ov{},cv=class extends ov{},lv=class extends X{},uv=class extends lv{},dv=class extends lv{},fv=class extends X{},pv=class extends fv{},mv=class extends fv{},hv=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},gv=class extends hv{},_v=class extends hv{},vv=class extends X{},yv=class extends vv{},bv=class extends vv{async _call(e){return new Fh(await super._call(e))}},xv=class extends vv{async _call(e){return new J(await super._call(e))}},Sv=class extends vv{async _call(e){return new Ph(await super._call(e))}},Cv=class extends vv{async _call(e){return new Ih(await super._call(e))}},wv=class extends X{},Tv=class extends wv{},Ev=class extends wv{async _call(e){return new J(await super._call(e))}},Dv=class extends X{},Ov=class extends Dv{},kv=class extends Dv{async _call(e){return new J(await super._call(e))}},Av=class extends X{},jv=class extends Av{},Mv=class extends Av{async _call(e){return new Nv(await super._call(e))}},Nv=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},Pv=class extends X{},Fv=class extends Pv{},Iv=class extends Pv{async _call(e){return new Nv(await super._call(e))}},Lv=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},Rv=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},zv=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},Bv=class extends zv{async encode(e){return new Lv(await q(this.sessions.encoder_model,e))}async decode(e){return new Rv(await q(this.sessions.decoder_model,e))}},Vv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},Hv=class extends zv{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},Uv=class extends X{},Wv=class extends Uv{},Gv=class extends Uv{async _call(e){return new Fh(await super._call(e))}},Kv=class extends Uv{async _call(e){return new J(await super._call(e))}},qv=class extends Uv{async _call(e){return new Ph(await super._call(e))}},Jv=class extends Uv{async _call(e){return new Ih(await super._call(e))}},Yv=class extends X{},Xv=class extends Yv{},Zv=class extends Yv{},Qv=class extends X{},$v=class extends Qv{},ey=class extends Qv{},ty=class extends X{},ny=class extends ty{},ry=class extends ty{async _call(e){return new Fh(await super._call(e))}},iy=class extends ty{async _call(e){return new J(await super._call(e))}},ay=class extends ty{async _call(e){return new Ph(await super._call(e))}},oy=class extends ty{async _call(e){return new Ih(await super._call(e))}},sy=class extends X{},cy=class extends sy{},ly=class extends X{},uy=class extends ly{},dy=class extends ly{async _call(e){return new J(await super._call(e))}},fy=class extends X{},py=class extends fy{},my=class extends X{},hy=class extends my{},gy=class extends X{},_y=class extends gy{},vy=class extends gy{async _call(e){return new by(await super._call(e))}},yy=class extends gy{async _call(e){return new xy(await super._call(e))}},by=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},xy=class extends Mh{constructor({logits:e,pred_boxes:t,pred_masks:n}){super(),this.logits=e,this.pred_boxes=t,this.pred_masks=n}},Sy=class extends X{},Cy=class extends Sy{},wy=class extends Sy{async _call(e){return new J(await super._call(e))}},Ty=class extends X{},Ey=class extends Ty{},Dy=class extends Ty{async _call(e){return new J(await super._call(e))}},Oy=class extends X{},ky=class extends Oy{},Ay=class extends X{},jy=class extends Ay{},My=class extends X{},Ny=class extends My{},Py=class extends My{async _call(e){return new J(await super._call(e))}},Fy=class extends My{async _call(e){return new Ph(await super._call(e))}},Iy=class extends My{async _call(e){return new Ih(await super._call(e))}},Ly=class extends My{async _call(e){return new Fh(await super._call(e))}},Ry=class extends X{},zy=class extends Ry{},By=class extends X{},Vy=class extends By{},Hy=class extends By{},Uy=class extends X{},Wy=class extends Uy{},Gy=class extends Uy{async _call(e){return new J(await super._call(e))}},Ky=class extends X{},qy=class extends Ky{},Jy=class extends Ky{async _call(e){return new Fh(await super._call(e))}},Yy=class extends Ky{async _call(e){return new J(await super._call(e))}},Xy=class extends Ky{async _call(e){return new Ph(await super._call(e))}},Zy=class extends Ky{async _call(e){return new Ih(await super._call(e))}},Qy=class extends X{},$y=class extends Qy{},eb=class extends Qy{},tb=class extends X{},nb=class extends tb{},rb=class extends tb{async _call(e){return new Fh(await super._call(e))}},ib=class extends tb{async _call(e){return new J(await super._call(e))}},ab=class extends tb{async _call(e){return new Ph(await super._call(e))}},ob=class extends X{},sb=class extends ob{},cb=class extends ob{async _call(e){return new Fh(await super._call(e))}},lb=class extends ob{async _call(e){return new J(await super._call(e))}},ub=class extends ob{async _call(e){return new Ph(await super._call(e))}},db=class extends X{},fb=class extends db{},pb=class extends db{},mb=class extends X{},hb=class extends mb{},gb=class extends mb{},_b=class extends X{},vb=class extends _b{},yb=class extends _b{},bb=class extends X{},xb=class extends bb{},Sb=class extends bb{async _call(e){return new J(await super._call(e))}},Cb=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`pixel_values`,`encoder_outputs`,`decoder_input_ids`,`decoder_inputs_embeds`,`decoder_attention_mask`,`past_key_values`];main_input_name=`inputs_embeds`},wb=class extends Cb{_merge_input_ids_with_image_features({inputs_embeds:e,image_features:t,input_ids:n,attention_mask:r}){return{inputs_embeds:H([t,e],1),attention_mask:H([yu(t.dims.slice(0,2)),r],1)}}async _prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:n,attention_mask:r}){if(!e&&!t)throw Error("Either `input_ids` or `pixel_values` should be provided.");let i,a;return e&&(i=await this.encode_text({input_ids:e})),t&&(a=await this.encode_image({pixel_values:t})),i&&a?{inputs_embeds:n,attention_mask:r}=this._merge_input_ids_with_image_features({inputs_embeds:i,image_features:a,input_ids:e,attention_mask:r}):n=i||a,{inputs_embeds:n,attention_mask:r}}async forward({input_ids:e,pixel_values:t,attention_mask:n,decoder_input_ids:r,decoder_attention_mask:i,encoder_outputs:a,past_key_values:o,inputs_embeds:s,decoder_inputs_embeds:c,num_logits_to_keep:l=null}){if(s||({inputs_embeds:s,attention_mask:n}=await this._prepare_inputs_embeds({input_ids:e,pixel_values:t,inputs_embeds:s,attention_mask:n})),!a){let{last_hidden_state:e}=await Dg(this,{inputs_embeds:s,attention_mask:n});a=e}if(!c){if(!r)throw Error("Either `decoder_input_ids` or `decoder_inputs_embeds` should be provided.");c=await this.encode_text({input_ids:r})}let u={inputs_embeds:c,attention_mask:i,encoder_attention_mask:n,encoder_hidden_states:a,past_key_values:o,num_logits_to_keep:l};return await Pg(this,u,!0)}},Tb=class extends X{},Eb=class extends Tb{},Db=class extends Tb{},Ob=class extends X{},kb=class extends Ob{},Ab=class extends Ob{},jb=class extends X{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`position_ids`,`past_key_values`]},Mb=class extends jb{_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_index??this.config.image_token_id,...e,image_features:n})}},Nb=class extends Mb{},Pb=class extends Mb{},Fb=class extends X{},Ib=class extends Fb{},Lb=class extends Mb{},Rb=class extends Lb{},zb=class extends X{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`input_features`,`input_features_mask`,`past_key_values`]},Bb=class extends zb{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,input_features:r=null,input_features_mask:i=null,position_ids:a=null,inputs_embeds:o=null,per_layer_inputs:s=null,past_key_values:c=null,generation_config:l=null,logits_processor:u=null,num_logits_to_keep:d=null,...f}){if((!o||!s)&&({inputs_embeds:o,per_layer_inputs:s}=await q(this.sessions.embed_tokens,{input_ids:e}),e.dims[1]!==1)){if(n){let{image_features:r}=await this._encode_vision({pixel_values:n,...f});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_image_features({image_features:r,inputs_embeds:o,input_ids:e,attention_mask:t}))}if(r){let{audio_features:n}=await q(this.sessions.audio_encoder,{input_features:r,input_features_mask:i});({inputs_embeds:o,attention_mask:t}=this._merge_input_ids_with_audio_features({audio_features:n,inputs_embeds:o,input_ids:e,attention_mask:t}))}}return await Pg(this,{inputs_embeds:o,per_layer_inputs:s,past_key_values:c,attention_mask:t,position_ids:a,generation_config:l,logits_processor:u,num_logits_to_keep:d},!0)}_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values})}_merge_input_ids_with_image_features(e){let t=e.image_features.dims.at(-1),n=e.image_features.view(-1,t);return Wg({image_token_id:this.config.image_token_id,...e,image_features:n})}_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.audio_token_id,...e,audio_features:n})}},Vb=class extends Bb{},Hb=class extends Bb{forward_params=[`input_ids`,`attention_mask`,`inputs_embeds`,`per_layer_inputs`,`position_ids`,`pixel_values`,`image_position_ids`,`input_features`,`input_features_mask`,`past_key_values`];_encode_vision(e){return q(this.sessions.vision_encoder,{pixel_values:e.pixel_values,pixel_position_ids:e.image_position_ids})}},Ub=class extends Hb{},Wb=class extends X{},Gb=class extends Wb{},Kb=class extends Wb{},qb=class extends X{},Jb=class extends qb{},Yb=class extends qb{},Xb=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`,`pixel_values`,`image_grid_thw`]},Zb=class extends Xb{image_grid_thw_name=`grid_thw`;_get_text_only_rope_index(e,t){if(t){let{data:e,dims:n}=Rg(t),r=BigInt64Array.from({length:3*e.length},(t,n)=>e[n%e.length]),i=Array.from({length:n[0]},(t,r)=>ll(e.subarray(n[1]*r,n[1]*(r+1)))[0]+1n+BigInt(n[1]));return[new V(`int64`,r,[3,...n]),new V(`int64`,i,[i.length,1])]}{let[t,n]=e.dims;return[new V(`int64`,BigInt64Array.from({length:3*t*n},(e,r)=>BigInt(Math.floor(r%n/t))),[3,...e.dims]),xu([t,1])]}}_reorder_and_write_positions(e,t,n,r){let i=e.reduce((e,t)=>e+t.length,0),a=Array(i),o=0;for(let t=0;t<3;++t)for(let n of e){let e=n.length/3;for(let r=t*e;r<(t+1)*e;++r)a[o++]=n[r]}let s=0;for(let e=0;e(t==s&&e.push(n),e),[]).map(e=>c[e+1]),u=l.filter(e=>e==a).length,d=l.filter(e=>e==o).length,f=[],p=0,m=u,h=d;for(let e=0;et>p&&e==a),s=c.findIndex((e,t)=>t>p&&e==o),l=m>0&&e!==-1?e:c.length+1,u=h>0&&s!==-1?s:c.length+1,d,g,_,v;l0?ll(f.at(-1))[0]+1:0;f.push(Array.from({length:3*S},(e,t)=>C+t%S));let ee=S+C,w=y*b*x,te=Array.from({length:w},(e,t)=>ee+Math.floor(t/(b*x))),ne=Array.from({length:w},(e,t)=>ee+Math.floor(t/x)%b),re=Array.from({length:w},(e,t)=>ee+t%x);f.push([te,ne,re].flat()),p=d+w}if(p0?ll(f.at(-1))[0]+1:0,t=c.length-p;f.push(Array.from({length:3*t},(n,r)=>e+r%t))}return f}get_rope_index(e,t,n,r){let{vision_config:i}=this.config,a=i.spatial_merge_size??2;if(t||n){let i=e.tolist();r||=bu(e);let o=r.tolist(),s=Array.from({length:3},()=>Array.from({length:e.dims[0]},()=>Array.from({length:e.dims[1]},()=>0))),c=t?t.tolist():[],l=n?n.tolist():[],u={image_index:0,video_index:0},d=[];for(let e=0;eo[e][n]==1),n=this._get_multimodal_rope_positions({filtered_ids:t,image_grid_thw_list:c,video_grid_thw_list:l,spatial_merge_size:a,state:u}),r=this._reorder_and_write_positions(n,o[e],s,e);d.push(ll(r)[0]+1-i[e].length)}return[new V(`int64`,s.flat(1/0),[3,e.dims[0],e.dims[1]]),new V(`int64`,d,[d.length,1])]}return this._get_text_only_rope_index(e,r)}async encode_image({pixel_values:e,image_grid_thw:t}){return(await q(this.sessions.vision_encoder,{pixel_values:e,[this.image_grid_thw_name]:t})).image_features}_merge_input_ids_with_image_features(e){return Wg({image_token_id:this.config.image_token_id,...e})}prepare_inputs_for_generation(e,t,n){if(Ng(this,t,1n),!t.attention_mask||t.position_ids||!(this.sessions.decoder_model_merged??this.sessions.model).inputNames.includes(`position_ids`))return t;if(!t.past_key_values)[t.position_ids,t.rope_deltas]=this.get_rope_index(t.input_ids,t.image_grid_thw,t.video_grid_thw,t.attention_mask);else{t.pixel_values=null;let e=t.past_key_values.get_seq_length();if(en+e);t.position_ids=du([r,r,r],0)}}return t}},Qb=class extends Zb{},$b=class extends Zb{image_grid_thw_name=`image_grid_thw`},ex=class extends Qb{image_grid_thw_name=`image_grid_thw`},tx=class extends $b{get_vision_position_ids(e,t,n,r){let i=Math.floor(t[0]/n),a=Math.floor(t[1]/r),o=Math.floor(t[2]/r),s=a*o*i,c=Array.from({length:s},()=>e),l=Array.from({length:s},(t,n)=>e+Math.floor(n/(o*i))),u=Array.from({length:s},(t,n)=>e+n%o);return[...c,...l,...u]}_get_multimodal_rope_positions({filtered_ids:e,image_grid_thw_list:t,video_grid_thw_list:n,spatial_merge_size:r,state:i}){let{image_token_id:a}=this.config,o=[],s=0,c=+(e[0]==a);for(let t=1;t<=e.length;++t){let n=tl+n%e)),l+=e}else{let e=t[i.image_index++].map(Number),n=e[0];u.push(this.get_vision_position_ids(l,e,n,r)),l+=Math.max(e[1],e[2])/r}return u}},nx=class extends X{},rx=class extends nx{},ix=class extends nx{},ax=class extends X{},ox=class extends ax{},sx=class extends ax{},cx=class extends X{},lx=class extends cx{},ux=class extends cx{},dx=class extends X{},fx=class extends dx{},px=class extends dx{},mx=class extends X{},hx=class extends mx{},gx=class extends mx{},_x=class extends X{},vx=class extends _x{},yx=class extends _x{},bx=class extends X{},xx=class extends bx{},Sx=class extends bx{},Cx=class extends X{},wx=class extends Cx{},Tx=class extends Cx{},Ex=class extends X{},Dx=class extends Ex{},Ox=class extends Ex{},kx=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`audio_values`,`past_key_values`]},Ax=class extends kx{_merge_input_ids_with_audio_features(e){let t=e.audio_features.dims.at(-1),n=e.audio_features.view(-1,t);return Gg({audio_token_id:this.config.ignore_index??this.config.audio_token_id??this.config.audio_token_index,...e,audio_features:n})}},jx=class extends Ax{forward_params=[`input_ids`,`attention_mask`,`input_features`,`past_key_values`]},Mx=class extends X{},Nx=class extends Mx{},Px=class extends X{},Fx=class extends Px{},Ix=class extends X{},Lx=class extends Ix{},Rx=class extends Ix{},zx=class extends X{},Bx=class extends zx{},Vx=class extends zx{async _call(e){return new J(await super._call(e))}},Hx=class extends X{},Ux=class extends Hx{},Wx=class extends Hx{forward_params=[`input_ids`,`attention_mask`,`token_type_ids`,`past_key_values`];prepare_inputs_for_generation(e,t,n){let r=Bg(this,e,t,n);return r.token_type_ids=(r.past_key_values?Su:bu)(r.input_ids),r}},Gx=class extends X{},Kx=class extends Gx{},qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},Jx=class extends Gx{async _call(e){return new J(await super._call(e))}},Yx=class extends Gx{async _call(e){return new Ph(await super._call(e))}},Xx=class extends X{},Zx=class extends Gx{},Qx=class extends Gx{async _call(e){return new Lh(await super._call(e))}},$x=class extends Gx{async _call(e){return new J(await super._call(e))}},eS=class extends X{},tS=class extends eS{},nS=class extends eS{},rS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`position_ids`,`past_key_values`]},iS=class extends X{},aS=class extends iS{},oS=class extends iS{async _call(e){return new J(await super._call(e))}},sS=class extends X{},cS=class extends sS{},lS=class extends sS{},uS=class extends X{},dS=class extends uS{async forward(e){let t=!e.input_ids,n=!e.pixel_values;if(t&&n)throw Error("Either `input_ids` or `pixel_values` should be provided.");if(t&&(e.input_ids=yu([e.pixel_values.dims[0],1])),n){let{image_size:t}=this.config.vision_config;e.pixel_values=_u([0,3,t,t],0)}let{text_embeddings:r,image_embeddings:i,l2norm_text_embeddings:a,l2norm_image_embeddings:o}=await super.forward(e),s={};return t||(s.text_embeddings=r,s.l2norm_text_embeddings=a),n||(s.image_embeddings=i,s.l2norm_image_embeddings=o),s}},fS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},pS=class extends uS{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},mS=class extends X{},hS=class extends mS{},gS=class extends mS{},_S=class extends Mb{},vS=class extends X{},yS=class extends vS{},bS=class extends vS{},xS=class extends Mb{forward_params=[`input_ids`,`attention_mask`,`pixel_values`,`pixel_attention_mask`,`spatial_shapes`,`position_ids`,`past_key_values`]},SS=class extends X{},CS=class extends SS{},wS=class extends SS{},TS=class extends X{},ES=class extends TS{},DS=class extends X{},OS=class extends DS{},kS=class extends DS{},AS=class extends X{},jS=class extends AS{},MS=class extends AS{},NS=class extends X{},PS=class extends NS{},FS=class extends NS{},IS=class extends X{},LS=class extends IS{},RS=class extends IS{},zS=class extends X{},BS=class extends zS{},VS=class extends zS{},HS=class extends zS{async _call(e){return new J(await super._call(e))}},US=class extends zS{},WS=class extends X{},GS=class extends WS{},KS=class extends X{},qS=class extends KS{},JS=class extends Mh{constructor({char_logits:e,bpe_logits:t,wp_logits:n}){super(),this.char_logits=e,this.bpe_logits=t,this.wp_logits=n}get logits(){return[this.char_logits,this.bpe_logits,this.wp_logits]}},YS=class extends X{},XS=class extends YS{async _call(e){return new JS(await super._call(e))}},ZS=class extends Mh{constructor({audio_codes:e}){super(),this.audio_codes=e}},QS=class extends Mh{constructor({audio_values:e}){super(),this.audio_values=e}},$S=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},eC=class extends $S{async encode(e){return new ZS(await q(this.sessions.encoder_model,e))}async decode(e){return new QS(await q(this.sessions.decoder_model,e))}},tC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},nC=class extends $S{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},rC=class extends X{},iC=class extends rC{},aC=class extends rC{},oC=class extends X{},sC=class extends oC{},cC=class extends oC{},lC=class extends X{},uC=class extends lC{},dC=class extends lC{},fC=class extends Mb{},pC=class extends X{},mC=class extends pC{},hC=class extends pC{},gC=class extends X{},_C=class extends gC{},vC=class extends gC{async _call(e){return new Fh(await super._call(e))}},yC=class extends gC{async _call(e){return new J(await super._call(e))}},bC=class extends gC{async _call(e){return new Ih(await super._call(e))}},xC=class extends X{},SC=class extends xC{},CC=class extends xC{},wC=class extends X{},TC=class extends wC{},EC=class extends wC{async _call(e){return new J(await super._call(e))}},DC=class extends wC{},OC=class extends X{},kC=class extends OC{},AC=class extends OC{async _call(e){return new J(await super._call(e))}},jC=class extends OC{},MC=class extends X{},NC=class extends MC{},PC=class extends MC{async _call(e){return new J(await super._call(e))}},FC=class extends MC{},IC=class extends X{},LC=class extends IC{},RC=class extends IC{async _call(e){return new J(await super._call(e))}},zC=class extends IC{},BC=class extends X{},VC=class extends BC{},HC=class extends BC{async _call(e){return new J(await super._call(e))}},UC=class extends X{},WC=class extends UC{},GC=class extends UC{async _call(e){return new J(await super._call(e))}},KC=class extends X{},qC=class extends KC{},JC=class extends KC{async _call(e){return new Fh(await super._call(e))}},YC=class extends KC{async _call(e){return new J(await super._call(e))}},XC=class extends KC{async _call(e){return new Ph(await super._call(e))}},ZC=class extends X{},QC=class extends ZC{},$C=class extends ZC{},ew=class extends X{requires_attention_mask=!1;main_input_name=`input_values`;forward_params=[`input_values`,`decoder_input_ids`,`past_key_values`]},tw=class extends ew{},nw=class extends ew{},rw=class extends X{},iw=class extends rw{},aw=class extends rw{async _call(e){return new Fh(await super._call(e))}},ow=class extends rw{async _call(e){return new J(await super._call(e))}},sw=class extends rw{async _call(e){return new Ph(await super._call(e))}},cw=class extends rw{async _call(e){return new Ih(await super._call(e))}},lw=class extends X{},uw=class extends lw{},dw=class extends lw{},fw=class extends X{},pw=class extends fw{},mw=class extends fw{},hw=class extends X{},gw=class extends hw{forward_params=[`input_ids`,`pixel_values`,`images_seq_mask`,`images_emb_mask`,`attention_mask`,`position_ids`,`past_key_values`];constructor(...e){super(...e),this._generation_mode=`text`}async forward(e){let t=this._generation_mode??`text`,n;if(t===`text`||!e.past_key_values){let t=this.sessions.prepare_inputs_embeds;n=await q(t,ci(e,t.inputNames))}else{let t=this.sessions.gen_img_embeds;n=await q(t,ci({image_ids:e.input_ids},t.inputNames))}let r={...e,...n},i=await Pg(this,r),a=this.sessions[t===`text`?`lm_head`:`gen_head`];if(!a)throw Error(`Unable to find "${a}" generation head`);let o=await q(a,ci(i,a.inputNames));return{...n,...i,...o}}prepare_inputs_for_generation(e,t,n){let r=!!t.past_key_values;return Ng(this,t,1n),n.guidance_scale!==null&&n.guidance_scale>1&&(r?t.input_ids=H([t.input_ids,t.input_ids],0):(t.input_ids=H([t.input_ids,vu(t.input_ids,BigInt(n.pad_token_id))],0),t.attention_mask=H([t.attention_mask,vu(t.attention_mask,0n)],0))),(r||!t.pixel_values)&&(t.pixel_values=_u([0,0,3,384,384],1)),r&&(t.images_seq_mask=new V(`bool`,[,].fill(!0).fill(!1,0,1),[1,1]),t.images_emb_mask=new V(`bool`,[].fill(!1),[1,1,0])),t}async generate(e){return this._generation_mode=`text`,super.generate(e)}async generate_images(e){this._generation_mode=`image`;let t=(e.inputs??e[this.main_input_name]).dims[1],n=(await super.generate(e)).slice(null,[t,null]),r=this.sessions.image_decode,{decoded_image:i}=await q(r,{generated_tokens:n}),a=i.add_(1).mul_(255/2).clamp_(0,255).to(`uint8`),o=[];for(let e of a){let t=Vf.fromTensor(e);o.push(t)}return o}},_w=class extends X{},vw=class extends _w{},yw=class extends _w{},bw=class extends X{forward_params=[`input_ids`,`attention_mask`,`encoder_outputs`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`];_apply_and_filter_by_delay_pattern_mask(e){let[t,n]=e.dims,r=this.config.decoder.num_codebooks,i=n-r,a=0;for(let t=0;t0&&o<=i&&(e.data[a++]=e.data[t])}let o=Math.floor(t/r),s=a/(o*r);return new V(e.type,e.data.slice(0,a),[o,r,s])}prepare_inputs_for_generation(e,t,n){let r=BigInt(this.config.decoder.pad_token_id),i=structuredClone(e);for(let e=0;e=t&&(i[e][t]=r);return n.guidance_scale!==null&&n.guidance_scale>1&&(i=i.concat(i)),Vg(this,i,t,n)}async generate(e){let t=await super.generate(e),n=this._apply_and_filter_by_delay_pattern_mask(t).unsqueeze_(0),{audio_values:r}=await q(this.sessions.encodec_decode,{audio_codes:n});return r}},xw=class extends X{},Sw=class extends xw{},Cw=class extends xw{},ww=class extends X{},Tw=class extends ww{},Ew=class extends ww{},Dw=class extends X{},Ow=class extends Dw{},kw=class extends Dw{async _call(e){return new Fh(await super._call(e))}},Aw=class extends Dw{async _call(e){return new J(await super._call(e))}},jw=class extends Dw{async _call(e){return new Ph(await super._call(e))}},Mw=class extends Dw{async _call(e){return new Ih(await super._call(e))}},Nw=class extends X{},Pw=class extends Nw{},Fw=class extends X{},Iw=class extends Fw{},Lw=class extends Fw{},Rw=class extends X{},zw=class extends Rw{},Bw=class extends Rw{},Vw=class extends X{},Hw=class extends Vw{},Uw=class extends Vw{},Ww=class extends X{},Gw=class extends Ww{},Kw=class extends Ww{},qw=class extends X{},Jw=class extends qw{},Yw=class extends qw{async _call(e){return new J(await super._call(e))}},Xw=class extends X{},Zw=class extends Xw{},Qw=class extends Xw{},$w=class extends X{},eT=class extends $w{},tT=class extends $w{},nT=class extends X{},rT=class extends nT{},iT=class extends nT{},aT=class extends X{},oT=class extends aT{},sT=class extends aT{},cT=class extends Mb{},lT=class extends X{},uT=class extends lT{async _call(e){return new Lh(await super._call(e))}},dT=class extends X{},fT=class extends dT{},pT=class extends dT{},mT=class extends X{},hT=class extends mT{},gT=class extends mT{},_T=class extends X{},vT=class extends _T{},yT=class extends _T{},bT=class extends X{},xT=class extends bT{},ST=class extends bT{},CT=class extends X{forward_params=[`input_ids`,`inputs_embeds`,`attention_mask`,`position_ids`,`pixel_values`,`image_sizes`,`past_key_values`]},wT=class extends CT{async forward({input_ids:e=null,attention_mask:t=null,pixel_values:n=null,image_sizes:r=null,position_ids:i=null,inputs_embeds:a=null,past_key_values:o=null,generation_config:s=null,logits_processor:c=null,num_logits_to_keep:l=null,...u}){if(!a){let t;if(n&&e.dims[1]!==1){if(!r)throw Error("`image_sizes` must be provided when `pixel_values` is provided.");({image_features:t}=await q(this.sessions.vision_encoder,{pixel_values:n,image_sizes:r}))}else{let e=this.config.normalized_config.hidden_size;t=new V(`float32`,[],[0,e])}({inputs_embeds:a}=await q(this.sessions.prepare_inputs_embeds,{input_ids:e,image_features:t}))}return await Pg(this,{inputs_embeds:a,past_key_values:o,attention_mask:t,position_ids:i,generation_config:s,logits_processor:c,num_logits_to_keep:l},!1)}},TT=class extends X{},ET=class extends TT{},DT=class extends TT{async _call(e){return new J(await super._call(e))}},OT=class extends X{},kT=class extends OT{},AT=class extends OT{async _call(e){return new Ph(await super._call(e))}},jT=class extends X{},MT=class extends jT{},NT=class extends jT{},PT=class extends X{},FT=class extends PT{},IT=class extends PT{},LT=class extends X{},RT=class extends LT{},zT=class extends LT{},BT=class extends X{},VT=class extends BT{},HT=class extends BT{},UT=class extends X{},WT=class extends UT{},GT=class extends UT{},KT=class extends $b{},qT=class extends ex{},JT=class extends KT{},YT=class extends qT{},XT=class extends KT{},ZT=class extends XT{},QT=class extends XT{},$T=class extends ZT{},eE=class extends X{},tE=class extends eE{},nE=class extends eE{async _call(e){return new J(await super._call(e))}},rE=class extends X{},iE=class extends rE{},aE=class extends rE{async _call(e){return new oE(await super._call(e))}},oE=class extends Nv{},sE=class extends X{},cE=class extends sE{},lE=class extends sE{async _call(e){return new Fh(await super._call(e))}},uE=class extends sE{async _call(e){return new J(await super._call(e))}},dE=class extends sE{async _call(e){return new Ph(await super._call(e))}},fE=class extends sE{async _call(e){return new Ih(await super._call(e))}},pE=class extends X{},mE=class extends pE{},hE=class extends pE{async _call(e){return new Fh(await super._call(e))}},gE=class extends pE{async _call(e){return new J(await super._call(e))}},_E=class extends pE{async _call(e){return new Ph(await super._call(e))}},vE=class extends pE{async _call(e){return new Ih(await super._call(e))}},yE=class extends X{},bE=class extends yE{},xE=class extends yE{async _call(e){return new SE(await super._call(e))}},SE=class extends Nv{},CE=class extends Mh{constructor({iou_scores:e,pred_masks:t}){super(),this.iou_scores=e,this.pred_masks=t}},wE=class extends X{},TE=class extends wE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){e=!e.image_embeddings||!e.image_positional_embeddings?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_labels??=yu(e.input_points.dims.slice(0,-1));let t={image_embeddings:e.image_embeddings,image_positional_embeddings:e.image_positional_embeddings};return e.input_points&&(t.input_points=e.input_points),e.input_labels&&(t.input_labels=e.input_labels),e.input_boxes&&(t.input_boxes=e.input_boxes),await q(this.sessions.prompt_encoder_mask_decoder,t)}async _call(e){return new CE(await super._call(e))}},EE=class extends Mh{constructor({iou_scores:e,pred_masks:t,object_score_logits:n}){super(),this.iou_scores=e,this.pred_masks=t,this.object_score_logits=n}},DE=class extends X{},OE=class extends DE{async get_image_embeddings({pixel_values:e}){return await Dg(this,{pixel_values:e})}async forward(e){let{num_feature_levels:t}=this.config.vision_config;if(e=Array.from({length:t},(e,t)=>`image_embeddings.${t}`).some(t=>!e[t])?{...e,...await this.get_image_embeddings(e)}:{...e},e.input_points){if(e.input_boxes&&e.input_boxes.dims[1]!==1)throw Error("When both `input_points` and `input_boxes` are provided, the number of boxes per image must be 1.");let t=e.input_points.dims;e.input_labels??=yu(t.slice(0,-1)),e.input_boxes??=_u([t[0],0,4],0)}else if(e.input_boxes){let t=e.input_boxes.dims;e.input_labels=_u([t[0],t[1],0],-1n),e.input_points=_u([t[0],1,0,2],0)}else throw Error("At least one of `input_points` or `input_boxes` must be provided.");let n=this.sessions.prompt_encoder_mask_decoder;return await q(n,ci(e,n.inputNames))}async _call(e){return new EE(await super._call(e))}},kE=class extends OE{},AE=class extends OE{},jE=class extends X{},ME=class extends jE{},NE=class extends jE{},PE=class extends jE{},FE=class extends X{},IE=class extends FE{},LE=class extends FE{},RE=class extends FE{},zE=class extends X{},BE=class extends zE{},VE=class extends zE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`text_model`})}},HE=class extends Z_{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`vision_model`})}},UE=class extends X{},WE=class extends UE{},GE=class extends UE{},KE=class extends rS{},qE=class extends X{main_input_name=`input_values`;forward_params=[`input_values`]},JE=class extends qE{async encode(e){return await q(this.sessions.encoder_model,e)}async decode(e){return await q(this.sessions.decoder_model,e)}},YE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`encoder_model`})}},XE=class extends qE{static async from_pretrained(e,t={}){return super.from_pretrained(e,{...t,model_file_name:t.model_file_name??`decoder_model`})}},ZE=class extends X{},QE=class extends ZE{},$E=class extends ZE{},eD=class extends X{},tD=class extends eD{},nD=class extends eD{},rD=class extends eD{async generate_speech(e,t,{threshold:n=.5,minlenratio:r=0,maxlenratio:i=20,vocoder:a=null}={}){let o={input_ids:e},{encoder_outputs:s,encoder_attention_mask:c}=await Dg(this,o),l=s.dims[1]/this.config.reduction_factor,u=Math.floor(l*i),d=Math.floor(l*r),f=this.config.num_mel_bins,p=[],m=null,h=null,g=0;for(;;){++g;let e=bg(!!h),r;r=h?h.output_sequence_out:new V(`float32`,new Float32Array(f),[1,1,f]);let i={use_cache_branch:e,output_sequence:r,encoder_attention_mask:c,speaker_embeddings:t,encoder_hidden_states:s};Mg(this,i,m),h=await q(this.sessions.decoder_model_merged,i),m=kg(h,m);let{prob:a,spectrum:o}=h;if(p.push(o),g>=d&&(Array.from(a.data).filter(e=>e>=n).length>0||g>=u))break}let _=H(p),{waveform:v}=await q(a.sessions.model,{spectrogram:_});return{spectrogram:_,waveform:v}}},iD=class extends X{main_input_name=`spectrogram`},aD=class extends X{},oD=class extends aD{},sD=class extends aD{async _call(e){return new Fh(await super._call(e))}},cD=class extends aD{async _call(e){return new J(await super._call(e))}},lD=class extends aD{async _call(e){return new Ih(await super._call(e))}},uD=class extends X{},dD=class extends uD{},fD=class extends uD{},pD=class extends X{},mD=class extends pD{},hD=class extends pD{},gD=class extends X{},_D=class extends gD{},vD=class extends X{},yD=class extends vD{async generate_speech({input_ids:e,attention_mask:t,style:n,num_inference_steps:r=5,speed:i=1.05}){let{sampling_rate:a,chunk_compress_factor:o,base_chunk_size:s,latent_dim:c}=this.config,{last_hidden_state:l,durations:u}=await q(this.sessions.text_encoder,{input_ids:e,attention_mask:t,style:n}),d=u.div(i).mul_(a),f=s*o,p=d.data,m=Int32Array.from(p,e=>Math.ceil(e/f)),h=Math.max(...m),g=e.dims[0],_=new BigInt64Array(g*h);for(let e=0;ee*t,1),r=Ql[e.type];c[e.name]=new V(e.type,new r(n),t)}let f=Ql[d],p=new V(d,new f(s*dO),[1,s,dO]),m=t[Symbol.asyncIterator]?.()??t[Symbol.iterator]?.();if(!m)throw Error(`input_features must be iterable or async iterable`);return{encoder_session:i,enc_kv_cache:c,enc_padding_cache:p,enc_past_seq_len:0,audio_embed_queue:[],audio_embed_total_tokens:0,audio_queue_offset:0,audio_consumed:0,stream_exhausted:!1,chunks_iter:m,text_hidden_size:n.hidden_size}}async function hO(e,t){let n=t.dims[2],r=Math.floor((fO+n-3)/2)+1,i=new V(`int64`,BigInt64Array.from({length:r},(t,n)=>BigInt(e.enc_past_seq_len+n)),[1,r]),a=e.enc_past_seq_len+r,o=yu([1,a]),{audio_embeds:s,present_padding_cache:c,...l}=await q(e.encoder_session,{input_features:t,attention_mask:o,position_ids:i,past_padding_cache:e.enc_padding_cache,...e.enc_kv_cache});e.enc_padding_cache.location===`gpu-buffer`&&e.enc_padding_cache.dispose(),e.enc_padding_cache=c;for(let t in l)if(t.startsWith(`present.`)){let n=t.replace(`present`,`past_key_values`),r=e.enc_kv_cache[n];r?.location===`gpu-buffer`&&r.dispose(),e.enc_kv_cache[n]=l[t]}return e.enc_past_seq_len=a,s}async function gO(e,t){for(;e.audio_embed_total_tokens0&&e.audio_embed_queue.length>0;){let t=e.audio_embed_queue[0],n=t.tokens-e.audio_queue_offset,o=Math.min(a,n),s=e.audio_queue_offset*e.text_hidden_size;for(let n=0;n=t.tokens&&(e.audio_embed_queue.shift(),e.audio_queue_offset=0)}e.audio_consumed+=n-a}var vO=class extends rg{constructor(e){super(),this._s=e}_call(e){let t=this._s.stream_exhausted&&this._s.audio_embed_queue.length===0;return e.map(()=>t)}},yO=class extends X{forward_params=[`input_ids`,`attention_mask`,`position_ids`,`past_key_values`]},bO=class extends yO{async forward({input_ids:e,past_key_values:t,...n}){let r=e.dims[1],i=pO.get(this);i&&await gO(i,i.audio_consumed+r);let{inputs_embeds:a}=await q(this.sessions.embed_tokens,{input_ids:e});i&&_O(i,a,r);let o={inputs_embeds:a,...n};Mg(this,o,t);let s=this.sessions.decoder_model_merged;return await q(s,ci(o,s.inputNames))}async generate({input_features:e,stopping_criteria:t,...n}){if(!e)throw Error(`input_features (generator/iterable) must be provided`);let r=mO(this,e);pO.set(this,r);let i=new ig;i.push(new vO(r)),t&&i.extend(t);try{return await super.generate({...n,stopping_criteria:i})}finally{r.enc_kv_cache.dispose(),pO.delete(this)}}},xO=class extends X{},SO=class extends xO{},CO=class extends xO{async _call(e){return new Lh(await super._call(e))}},wO=class extends xO{async _call(e){return new J(await super._call(e))}},TO=class extends Mh{constructor({logits:e,embeddings:t}){super(),this.logits=e,this.embeddings=t}},EO=class extends X{},DO=class extends EO{},OO=class extends EO{async _call(e){return new Lh(await super._call(e))}},kO=class extends EO{async _call(e){return new J(await super._call(e))}},AO=class extends EO{async _call(e){return new TO(await super._call(e))}},jO=class extends EO{async _call(e){return new Ph(await super._call(e))}},MO=class extends X{},NO=class extends MO{},PO=class extends ng{return_timestamps=null;return_token_timestamps=null;num_frames=null;alignment_heads=null;task=null;language=null;no_timestamps_token_id=null;prompt_ids=null;is_multilingual=null;lang_to_id=null;task_to_id=null;max_initial_timestamp_index=1},FO=class extends X{requires_attention_mask=!1;main_input_name=`input_features`;forward_params=[`input_features`,`attention_mask`,`decoder_input_ids`,`decoder_attention_mask`,`past_key_values`]},IO=class extends FO{},LO=class extends FO{_prepare_generation_config(e,t){return super._prepare_generation_config(e,t,PO)}_retrieve_init_tokens(e){let t=[e.decoder_start_token_id],n=e.language,r=e.task;if(e.is_multilingual){n||=(A.warn(`No language specified - defaulting to English (en).`),`en`);let i=`<|${Dd(n)}|>`;t.push(e.lang_to_id[i]),t.push(e.task_to_id[r??`transcribe`])}else if(n||r)throw Error("Cannot specify `task` or `language` for an English-only model. If the model is intended to be multilingual, pass `is_multilingual=true` to generate, or update the generation config.");return!e.return_timestamps&&e.no_timestamps_token_id&&t.at(-1)!==e.no_timestamps_token_id?t.push(e.no_timestamps_token_id):e.return_timestamps&&t.at(-1)===e.no_timestamps_token_id&&(A.warn("<|notimestamps|> prompt token is removed from generation_config since `return_timestamps` is set to `true`."),t.pop()),t.filter(e=>e!=null)}async generate({inputs:e=null,generation_config:t=null,logits_processor:n=null,stopping_criteria:r=null,...i}){t=this._prepare_generation_config(t,i);let a=i.decoder_input_ids instanceof V?Du(i.decoder_input_ids):i.decoder_input_ids??this._retrieve_init_tokens(t);if(t.return_timestamps&&(n??=new Uh,n.push(new Jh(t,a))),t.begin_suppress_tokens&&(n??=new Uh,n.push(new qh(t.begin_suppress_tokens,a.length))),t.return_token_timestamps){if(!t.alignment_heads)throw Error("Model generation config has no `alignment_heads`, token-level timestamps not available. See https://gist.github.com/hollance/42e32852f24243b748ae6bc1f985b13a on how to add this property to the generation config.");t.task===`translate`&&A.warn(`Token-level timestamps may not be reliable for task 'translate'.`),t.output_attentions=!0,t.return_dict_in_generate=!0}if(t.return_timestamps&&!i.max_new_tokens)return this._generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:a,kwargs:i});let o=await super.generate({inputs:e,generation_config:t,logits_processor:n,decoder_input_ids:a,...i});return t.return_token_timestamps&&(o.token_timestamps=this._extract_token_timestamps(o,t.alignment_heads,t.num_frames,.02,a.length)),o}async _generate_with_seek({inputs:e,generation_config:t,logits_processor:n,init_tokens:r,kwargs:i}){let a=t.no_timestamps_token_id+1,o=Array.isArray(t.eos_token_id)?t.eos_token_id[0]:t.eos_token_id,s=t.return_token_timestamps,c=e,l=c.dims[2],u=2*this.config.max_source_positions,d=0,f=[],p=[];for(;de+n)}if(v.length>0&&v.at(-1)===o&&v.pop(),v.length===0)break;let b=v.map(e=>e>=a),x=v.length>=2&&b[v.length-1]&&!b[v.length-2],S=[];for(let e=0;e0){if(x)C=e-d;else{let e=S.at(-1);C=(v[e-1]-a)*2,ee=e}}else C=e-d;let w=Math.floor(d/2),te=a+1500;for(let e=0;e=a&&(v[e]=Math.min(v[e]+w,te));f.push(...v.slice(0,ee)),y&&p.push(...y.slice(0,ee)),d+=C}f.push(o);let m=[...r,...f];if(s){let e=new V(`int64`,m.map(BigInt),[1,m.length]),t=[...Array(r.length).fill(0),...p,0];return{sequences:e,token_timestamps:new V(`float32`,new Float32Array(t),[1,t.length])}}return new V(`int64`,m.map(BigInt),[1,m.length])}_extract_token_timestamps(e,t,n=null,r=.02,i=0){if(!e.cross_attentions)throw Error("Model outputs must contain cross attentions to extract timestamps. This is most likely because the model was not exported with `output_attentions=True`.");n??A.warn("`num_frames` has not been set, meaning the entire audio will be analyzed. This may lead to inaccurate token-level timestamps for short audios (< 30 seconds).");let a=this.config.median_filter_width;a===void 0&&(A.warn("Model config has no `median_filter_width`, using default value of 7."),a=7);let o=e.cross_attentions,s=Array.from({length:this.config.decoder_layers},(e,t)=>H(o.map(e=>e[t]),2)),c=du(t.map(([e,t])=>{if(e>=s.length)throw Error(`Layer index ${e} is out of bounds for cross attentions (length ${s.length}).`);return n?s[e].slice(null,t,null,[0,n]):s[e].slice(null,t)})).permute(1,0,2,3),[l,u]=pu(c,-2,0,!0),d=c.clone();for(let e=0;e0?d.slice(null,null,[i,d.dims[2]],null):d,1)],p=e.sequences.dims,m=new V(`float32`,new Float32Array(p[0]*p[1]),p);for(let e=0;et[n+1]-t[n])).map(e=>!!e),o=[];for(let e=0;e0&&s.push(o.at(-1)),m[e].data.set(s)}return m}},RO=class extends LO{},zO=class extends X{},BO=class extends zO{},VO=class extends zO{async _call(e){return new Fh(await super._call(e))}},HO=class extends zO{async _call(e){return new J(await super._call(e))}},UO=class extends zO{async _call(e){return new Ph(await super._call(e))}},WO=class extends zO{async _call(e){return new Ih(await super._call(e))}},GO=class extends X{},KO=class extends GO{},qO=class extends GO{async _call(e){return new Fh(await super._call(e))}},JO=class extends GO{async _call(e){return new J(await super._call(e))}},YO=class extends GO{async _call(e){return new Ph(await super._call(e))}},XO=class extends GO{async _call(e){return new Ih(await super._call(e))}},ZO=class extends X{},QO=class extends ZO{},$O=class extends ZO{async _call(e){return new ek(await super._call(e))}},ek=class extends Mh{constructor({logits:e,pred_boxes:t}){super(),this.logits=e,this.pred_boxes=t}},tk=class extends X{},nk=class extends tk{},rk=class extends tk{},ik=class extends X{},ak=class extends ik{},ok=class extends ik{},sk=/* @__PURE__ */ new Map([[`bert`,`BertModel`],[`eurobert`,`EuroBertModel`],[`neobert`,`NeoBertModel`],[`modernbert`,`ModernBertModel`],[`nomic_bert`,`NomicBertModel`],[`roformer`,`RoFormerModel`],[`electra`,`ElectraModel`],[`esm`,`EsmModel`],[`convbert`,`ConvBertModel`],[`camembert`,`CamembertModel`],[`deberta`,`DebertaModel`],[`deberta-v2`,`DebertaV2Model`],[`mpnet`,`MPNetModel`],[`albert`,`AlbertModel`],[`distilbert`,`DistilBertModel`],[`roberta`,`RobertaModel`],[`xlm`,`XLMModel`],[`xlm-roberta`,`XLMRobertaModel`],[`clap`,`ClapModel`],[`clip`,`CLIPModel`],[`clipseg`,`CLIPSegModel`],[`chinese_clip`,`ChineseCLIPModel`],[`siglip`,`SiglipModel`],[`jina_clip`,`JinaCLIPModel`],[`mobilebert`,`MobileBertModel`],[`squeezebert`,`SqueezeBertModel`],[`wav2vec2`,`Wav2Vec2Model`],[`wav2vec2-bert`,`Wav2Vec2BertModel`],[`unispeech`,`UniSpeechModel`],[`unispeech-sat`,`UniSpeechSatModel`],[`hubert`,`HubertModel`],[`wavlm`,`WavLMModel`],[`audio-spectrogram-transformer`,`ASTModel`],[`vits`,`VitsModel`],[`pyannote`,`PyAnnoteModel`],[`wespeaker-resnet`,`WeSpeakerResNetModel`],[`detr`,`DetrModel`],[`rt_detr`,`RTDetrModel`],[`rt_detr_v2`,`RTDetrV2Model`],[`rf_detr`,`RFDetrModel`],[`d_fine`,`DFineModel`],[`table-transformer`,`TableTransformerModel`],[`vit`,`ViTModel`],[`ijepa`,`IJepaModel`],[`pvt`,`PvtModel`],[`vit_msn`,`ViTMSNModel`],[`vit_mae`,`ViTMAEModel`],[`groupvit`,`GroupViTModel`],[`fastvit`,`FastViTModel`],[`mobilevit`,`MobileViTModel`],[`mobilevitv2`,`MobileViTV2Model`],[`owlvit`,`OwlViTModel`],[`owlv2`,`Owlv2Model`],[`beit`,`BeitModel`],[`deit`,`DeiTModel`],[`hiera`,`HieraModel`],[`convnext`,`ConvNextModel`],[`convnextv2`,`ConvNextV2Model`],[`dinov2`,`Dinov2Model`],[`dinov2_with_registers`,`Dinov2WithRegistersModel`],[`dinov3_vit`,`DINOv3ViTModel`],[`dinov3_convnext`,`DINOv3ConvNextModel`],[`resnet`,`ResNetModel`],[`swin`,`SwinModel`],[`swin2sr`,`Swin2SRModel`],[`donut-swin`,`DonutSwinModel`],[`yolos`,`YolosModel`],[`dpt`,`DPTModel`],[`glpn`,`GLPNModel`],[`hifigan`,`SpeechT5HifiGan`],[`efficientnet`,`EfficientNetModel`],[`decision_transformer`,`DecisionTransformerModel`],[`patchtst`,`PatchTSTModel`],[`patchtsmixer`,`PatchTSMixerModel`],[`mobilenet_v1`,`MobileNetV1Model`],[`mobilenet_v2`,`MobileNetV2Model`],[`mobilenet_v3`,`MobileNetV3Model`],[`mobilenet_v4`,`MobileNetV4Model`],[`maskformer`,`MaskFormerModel`],[`mgp-str`,`MgpstrForSceneTextRecognition`],[`style_text_to_speech_2`,`StyleTextToSpeech2Model`],[`openai_privacy_filter`,`OpenAIPrivacyFilterModel`]]),ck=/* @__PURE__ */ new Map([[`t5`,`T5Model`],[`longt5`,`LongT5Model`],[`mt5`,`MT5Model`],[`bart`,`BartModel`],[`mbart`,`MBartModel`],[`marian`,`MarianModel`],[`whisper`,`WhisperModel`],[`cohere_asr`,`CohereAsrModel`],[`m2m_100`,`M2M100Model`],[`blenderbot`,`BlenderbotModel`],[`blenderbot-small`,`BlenderbotSmallModel`]]),lk=/* @__PURE__ */ new Map([[`mimi`,`MimiModel`],[`dac`,`DacModel`],[`snac`,`SnacModel`]]),uk=/* @__PURE__ */ new Map([[`bloom`,`BloomModel`],[`jais`,`JAISModel`],[`gpt2`,`GPT2Model`],[`gpt_oss`,`GptOssModel`],[`gptj`,`GPTJModel`],[`gpt_bigcode`,`GPTBigCodeModel`],[`gpt_neo`,`GPTNeoModel`],[`gpt_neox`,`GPTNeoXModel`],[`codegen`,`CodeGenModel`],[`llama`,`LlamaModel`],[`apertus`,`ApertusModel`],[`nanochat`,`NanoChatModel`],[`arcee`,`ArceeModel`],[`afmoe`,`AfmoeModel`],[`lfm2`,`Lfm2Model`],[`lfm2_moe`,`Lfm2MoeModel`],[`smollm3`,`SmolLM3Model`],[`exaone`,`ExaoneModel`],[`olmo`,`OlmoModel`],[`olmo2`,`Olmo2Model`],[`olmo3`,`Olmo3Model`],[`olmo_hybrid`,`OlmoHybridModel`],[`mobilellm`,`MobileLLMModel`],[`granite`,`GraniteModel`],[`granitemoehybrid`,`GraniteMoeHybridModel`],[`cohere`,`CohereModel`],[`cohere2`,`Cohere2Model`],[`gemma`,`GemmaModel`],[`gemma2`,`Gemma2Model`],[`vaultgemma`,`VaultGemmaModel`],[`gemma3_text`,`Gemma3Model`],[`helium`,`HeliumModel`],[`glm`,`GlmModel`],[`glm_moe_dsa`,`GlmMoeDsaModel`],[`openelm`,`OpenELMModel`],[`qwen2`,`Qwen2Model`],[`qwen2_moe`,`Qwen2MoeModel`],[`qwen3`,`Qwen3Model`],[`qwen3_moe`,`Qwen3MoeModel`],[`qwen3_next`,`Qwen3NextModel`],[`phi`,`PhiModel`],[`phi3`,`Phi3Model`],[`mpt`,`MptModel`],[`opt`,`OPTModel`],[`mistral`,`MistralModel`],[`mistral4`,`Mistral4Model`],[`ministral`,`MinistralModel`],[`ministral3`,`Ministral3Model`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2Model`],[`deepseek_v3`,`DeepseekV3Model`],[`deepseek_v4`,`DeepseekV4Model`],[`falcon`,`FalconModel`],[`falcon_h1`,`FalconH1Model`],[`nemotron_h`,`NemotronHModel`],[`solar_open`,`SolarOpenModel`],[`stablelm`,`StableLmModel`],[`modernbert-decoder`,`ModernBertDecoderModel`],[`hunyuan_v1_dense`,`HunYuanDenseV1Model`],[`youtu`,`YoutuModel`],[`zaya`,`ZayaModel`],[`hrm_text`,`HrmTextModel`]]),dk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForSpeechToText`],[`whisper`,`WhisperForConditionalGeneration`],[`lite-whisper`,`LiteWhisperForConditionalGeneration`],[`moonshine`,`MoonshineForConditionalGeneration`],[`cohere_asr`,`CohereAsrForConditionalGeneration`]]),fk=/* @__PURE__ */ new Map([[`speecht5`,`SpeechT5ForTextToSpeech`]]),pk=/* @__PURE__ */ new Map([[`vits`,`VitsModel`],[`musicgen`,`MusicgenForConditionalGeneration`],[`supertonic`,`SupertonicForConditionalGeneration`]]),mk=/* @__PURE__ */ new Map([[`bert`,`BertForSequenceClassification`],[`eurobert`,`EuroBertForSequenceClassification`],[`neobert`,`NeoBertForSequenceClassification`],[`modernbert`,`ModernBertForSequenceClassification`],[`roformer`,`RoFormerForSequenceClassification`],[`electra`,`ElectraForSequenceClassification`],[`esm`,`EsmForSequenceClassification`],[`convbert`,`ConvBertForSequenceClassification`],[`camembert`,`CamembertForSequenceClassification`],[`deberta`,`DebertaForSequenceClassification`],[`deberta-v2`,`DebertaV2ForSequenceClassification`],[`mpnet`,`MPNetForSequenceClassification`],[`albert`,`AlbertForSequenceClassification`],[`distilbert`,`DistilBertForSequenceClassification`],[`roberta`,`RobertaForSequenceClassification`],[`xlm`,`XLMForSequenceClassification`],[`xlm-roberta`,`XLMRobertaForSequenceClassification`],[`bart`,`BartForSequenceClassification`],[`mbart`,`MBartForSequenceClassification`],[`mobilebert`,`MobileBertForSequenceClassification`],[`squeezebert`,`SqueezeBertForSequenceClassification`]]),hk=/* @__PURE__ */ new Map([[`bert`,`BertForTokenClassification`],[`eurobert`,`EuroBertForTokenClassification`],[`neobert`,`NeoBertForTokenClassification`],[`modernbert`,`ModernBertForTokenClassification`],[`roformer`,`RoFormerForTokenClassification`],[`electra`,`ElectraForTokenClassification`],[`esm`,`EsmForTokenClassification`],[`convbert`,`ConvBertForTokenClassification`],[`camembert`,`CamembertForTokenClassification`],[`deberta`,`DebertaForTokenClassification`],[`deberta-v2`,`DebertaV2ForTokenClassification`],[`mpnet`,`MPNetForTokenClassification`],[`distilbert`,`DistilBertForTokenClassification`],[`roberta`,`RobertaForTokenClassification`],[`xlm`,`XLMForTokenClassification`],[`xlm-roberta`,`XLMRobertaForTokenClassification`],[`openai_privacy_filter`,`OpenAIPrivacyFilterForTokenClassification`]]),gk=/* @__PURE__ */ new Map([[`t5`,`T5ForConditionalGeneration`],[`longt5`,`LongT5ForConditionalGeneration`],[`mt5`,`MT5ForConditionalGeneration`],[`bart`,`BartForConditionalGeneration`],[`mbart`,`MBartForConditionalGeneration`],[`marian`,`MarianMTModel`],[`m2m_100`,`M2M100ForConditionalGeneration`],[`blenderbot`,`BlenderbotForConditionalGeneration`],[`blenderbot-small`,`BlenderbotSmallForConditionalGeneration`]]),_k=/* @__PURE__ */ new Map([[`bloom`,`BloomForCausalLM`],[`gpt2`,`GPT2LMHeadModel`],[`gpt_oss`,`GptOssForCausalLM`],[`jais`,`JAISLMHeadModel`],[`gptj`,`GPTJForCausalLM`],[`gpt_bigcode`,`GPTBigCodeForCausalLM`],[`gpt_neo`,`GPTNeoForCausalLM`],[`gpt_neox`,`GPTNeoXForCausalLM`],[`codegen`,`CodeGenForCausalLM`],[`llama`,`LlamaForCausalLM`],[`nanochat`,`NanoChatForCausalLM`],[`apertus`,`ApertusForCausalLM`],[`llama4_text`,`Llama4ForCausalLM`],[`arcee`,`ArceeForCausalLM`],[`afmoe`,`AfmoeForCausalLM`],[`lfm2`,`Lfm2ForCausalLM`],[`lfm2_moe`,`Lfm2MoeForCausalLM`],[`smollm3`,`SmolLM3ForCausalLM`],[`exaone`,`ExaoneForCausalLM`],[`olmo`,`OlmoForCausalLM`],[`olmo2`,`Olmo2ForCausalLM`],[`olmo3`,`Olmo3ForCausalLM`],[`olmo_hybrid`,`OlmoHybridForCausalLM`],[`mobilellm`,`MobileLLMForCausalLM`],[`granite`,`GraniteForCausalLM`],[`granitemoehybrid`,`GraniteMoeHybridForCausalLM`],[`cohere`,`CohereForCausalLM`],[`cohere2`,`Cohere2ForCausalLM`],[`gemma`,`GemmaForCausalLM`],[`gemma2`,`Gemma2ForCausalLM`],[`vaultgemma`,`VaultGemmaForCausalLM`],[`gemma3_text`,`Gemma3ForCausalLM`],[`gemma3`,`Gemma3ForCausalLM`],[`helium`,`HeliumForCausalLM`],[`glm`,`GlmForCausalLM`],[`glm_moe_dsa`,`GlmMoeDsaForCausalLM`],[`openelm`,`OpenELMForCausalLM`],[`qwen2`,`Qwen2ForCausalLM`],[`qwen2_moe`,`Qwen2MoeForCausalLM`],[`qwen3`,`Qwen3ForCausalLM`],[`qwen3_moe`,`Qwen3MoeForCausalLM`],[`qwen3_next`,`Qwen3NextForCausalLM`],[`qwen2_vl`,`Qwen2VLForCausalLM`],[`qwen2_5_vl`,`Qwen2_5_VLForCausalLM`],[`qwen3_vl`,`Qwen3VLForCausalLM`],[`qwen3_vl_moe`,`Qwen3VLMoeForCausalLM`],[`qwen3_5`,`Qwen3_5ForCausalLM`],[`qwen3_5_text`,`Qwen3_5ForCausalLM`],[`qwen3_5_moe`,`Qwen3_5MoeForCausalLM`],[`gemma3n`,`Gemma3nForCausalLM`],[`gemma4`,`Gemma4ForCausalLM`],[`phi`,`PhiForCausalLM`],[`phi3`,`Phi3ForCausalLM`],[`mpt`,`MptForCausalLM`],[`opt`,`OPTForCausalLM`],[`mbart`,`MBartForCausalLM`],[`mistral`,`MistralForCausalLM`],[`mistral4`,`Mistral4ForCausalLM`],[`ministral`,`MinistralForCausalLM`],[`ministral3`,`Ministral3ForCausalLM`],[`ernie4_5`,`Ernie4_5ForCausalLM`],[`starcoder2`,`Starcoder2ForCausalLM`],[`deepseek_v3`,`DeepseekV3ForCausalLM`],[`deepseek_v4`,`DeepseekV4ForCausalLM`],[`falcon`,`FalconForCausalLM`],[`falcon_h1`,`FalconH1ForCausalLM`],[`nemotron_h`,`NemotronHForCausalLM`],[`trocr`,`TrOCRForCausalLM`],[`solar_open`,`SolarOpenForCausalLM`],[`stablelm`,`StableLmForCausalLM`],[`modernbert-decoder`,`ModernBertDecoderForCausalLM`],[`hunyuan_v1_dense`,`HunYuanDenseV1ForCausalLM`],[`youtu`,`YoutuForCausalLM`],[`zaya`,`ZayaForCausalLM`],[`hrm_text`,`HrmTextForCausalLM`],[`phi3_v`,`Phi3VForCausalLM`]]),vk=/* @__PURE__ */ new Map([[`multi_modality`,`MultiModalityCausalLM`]]),yk=/* @__PURE__ */ new Map([[`bert`,`BertForMaskedLM`],[`eurobert`,`EuroBertForMaskedLM`],[`neobert`,`NeoBertForMaskedLM`],[`modernbert`,`ModernBertForMaskedLM`],[`roformer`,`RoFormerForMaskedLM`],[`electra`,`ElectraForMaskedLM`],[`esm`,`EsmForMaskedLM`],[`convbert`,`ConvBertForMaskedLM`],[`camembert`,`CamembertForMaskedLM`],[`deberta`,`DebertaForMaskedLM`],[`deberta-v2`,`DebertaV2ForMaskedLM`],[`mpnet`,`MPNetForMaskedLM`],[`albert`,`AlbertForMaskedLM`],[`distilbert`,`DistilBertForMaskedLM`],[`roberta`,`RobertaForMaskedLM`],[`xlm`,`XLMWithLMHeadModel`],[`xlm-roberta`,`XLMRobertaForMaskedLM`],[`mobilebert`,`MobileBertForMaskedLM`],[`squeezebert`,`SqueezeBertForMaskedLM`]]),bk=/* @__PURE__ */ new Map([[`bert`,`BertForQuestionAnswering`],[`neobert`,`NeoBertForQuestionAnswering`],[`roformer`,`RoFormerForQuestionAnswering`],[`electra`,`ElectraForQuestionAnswering`],[`convbert`,`ConvBertForQuestionAnswering`],[`camembert`,`CamembertForQuestionAnswering`],[`deberta`,`DebertaForQuestionAnswering`],[`deberta-v2`,`DebertaV2ForQuestionAnswering`],[`mpnet`,`MPNetForQuestionAnswering`],[`albert`,`AlbertForQuestionAnswering`],[`distilbert`,`DistilBertForQuestionAnswering`],[`roberta`,`RobertaForQuestionAnswering`],[`xlm`,`XLMForQuestionAnswering`],[`xlm-roberta`,`XLMRobertaForQuestionAnswering`],[`mobilebert`,`MobileBertForQuestionAnswering`],[`squeezebert`,`SqueezeBertForQuestionAnswering`]]),xk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`]]),Sk=/* @__PURE__ */ new Map([[`llava`,`LlavaForConditionalGeneration`],[`llava_onevision`,`LlavaOnevisionForConditionalGeneration`],[`moondream1`,`Moondream1ForConditionalGeneration`],[`florence2`,`Florence2ForConditionalGeneration`],[`qwen2_vl`,`Qwen2VLForConditionalGeneration`],[`qwen2_5_vl`,`Qwen2_5_VLForConditionalGeneration`],[`qwen3_vl`,`Qwen3VLForConditionalGeneration`],[`qwen3_vl_moe`,`Qwen3VLMoeForConditionalGeneration`],[`qwen3_5`,`Qwen3_5ForConditionalGeneration`],[`qwen3_5_moe`,`Qwen3_5MoeForConditionalGeneration`],[`lfm2_vl`,`Lfm2VlForConditionalGeneration`],[`idefics3`,`Idefics3ForConditionalGeneration`],[`smolvlm`,`SmolVLMForConditionalGeneration`],[`paligemma`,`PaliGemmaForConditionalGeneration`],[`llava_qwen2`,`LlavaQwen2ForCausalLM`],[`gemma3`,`Gemma3ForConditionalGeneration`],[`gemma3n`,`Gemma3nForConditionalGeneration`],[`gemma4`,`Gemma4ForConditionalGeneration`],[`mistral3`,`Mistral3ForConditionalGeneration`],[`lighton_ocr`,`LightOnOcrForConditionalGeneration`],[`glm_ocr`,`GlmOcrForConditionalGeneration`]]),Ck=/* @__PURE__ */ new Map([[`granite_speech`,`GraniteSpeechForConditionalGeneration`],[`ultravox`,`UltravoxModel`],[`voxtral`,`VoxtralForConditionalGeneration`],[`voxtral_realtime`,`VoxtralRealtimeForConditionalGeneration`]]),wk=/* @__PURE__ */ new Map([[`vision-encoder-decoder`,`VisionEncoderDecoderModel`]]),Tk=/* @__PURE__ */ new Map([[`vit`,`ViTForImageClassification`],[`ijepa`,`IJepaForImageClassification`],[`pvt`,`PvtForImageClassification`],[`vit_msn`,`ViTMSNForImageClassification`],[`fastvit`,`FastViTForImageClassification`],[`mobilevit`,`MobileViTForImageClassification`],[`mobilevitv2`,`MobileViTV2ForImageClassification`],[`beit`,`BeitForImageClassification`],[`deit`,`DeiTForImageClassification`],[`hiera`,`HieraForImageClassification`],[`convnext`,`ConvNextForImageClassification`],[`convnextv2`,`ConvNextV2ForImageClassification`],[`dinov2`,`Dinov2ForImageClassification`],[`dinov2_with_registers`,`Dinov2WithRegistersForImageClassification`],[`resnet`,`ResNetForImageClassification`],[`swin`,`SwinForImageClassification`],[`segformer`,`SegformerForImageClassification`],[`efficientnet`,`EfficientNetForImageClassification`],[`mobilenet_v1`,`MobileNetV1ForImageClassification`],[`mobilenet_v2`,`MobileNetV2ForImageClassification`],[`mobilenet_v3`,`MobileNetV3ForImageClassification`],[`mobilenet_v4`,`MobileNetV4ForImageClassification`]]),Ek=/* @__PURE__ */ new Map([[`detr`,`DetrForObjectDetection`],[`rt_detr`,`RTDetrForObjectDetection`],[`rt_detr_v2`,`RTDetrV2ForObjectDetection`],[`rf_detr`,`RFDetrForObjectDetection`],[`d_fine`,`DFineForObjectDetection`],[`table-transformer`,`TableTransformerForObjectDetection`],[`yolos`,`YolosForObjectDetection`]]),Dk=/* @__PURE__ */ new Map([[`owlvit`,`OwlViTForObjectDetection`],[`owlv2`,`Owlv2ForObjectDetection`],[`grounding-dino`,`GroundingDinoForObjectDetection`]]),Ok=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`clipseg`,`CLIPSegForImageSegmentation`]]),kk=/* @__PURE__ */ new Map([[`segformer`,`SegformerForSemanticSegmentation`],[`sapiens`,`SapiensForSemanticSegmentation`],[`swin`,`SwinForSemanticSegmentation`],[`mobilenet_v1`,`MobileNetV1ForSemanticSegmentation`],[`mobilenet_v2`,`MobileNetV2ForSemanticSegmentation`],[`mobilenet_v3`,`MobileNetV3ForSemanticSegmentation`],[`mobilenet_v4`,`MobileNetV4ForSemanticSegmentation`]]),Ak=/* @__PURE__ */ new Map([[`detr`,`DetrForSegmentation`],[`maskformer`,`MaskFormerForInstanceSegmentation`]]),jk=/* @__PURE__ */ new Map([[`sam`,`SamModel`],[`sam2`,`Sam2Model`],[`edgetam`,`EdgeTamModel`],[`sam3_tracker`,`Sam3TrackerModel`]]),Mk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForCTC`],[`wav2vec2-bert`,`Wav2Vec2BertForCTC`],[`unispeech`,`UniSpeechForCTC`],[`unispeech-sat`,`UniSpeechSatForCTC`],[`wavlm`,`WavLMForCTC`],[`hubert`,`HubertForCTC`],[`parakeet_ctc`,`ParakeetForCTC`]]),Nk=/* @__PURE__ */ new Map([[`wav2vec2`,`Wav2Vec2ForSequenceClassification`],[`wav2vec2-bert`,`Wav2Vec2BertForSequenceClassification`],[`unispeech`,`UniSpeechForSequenceClassification`],[`unispeech-sat`,`UniSpeechSatForSequenceClassification`],[`wavlm`,`WavLMForSequenceClassification`],[`hubert`,`HubertForSequenceClassification`],[`audio-spectrogram-transformer`,`ASTForAudioClassification`]]),Pk=/* @__PURE__ */ new Map([[`wavlm`,`WavLMForXVector`]]),Fk=/* @__PURE__ */ new Map([[`unispeech-sat`,`UniSpeechSatForAudioFrameClassification`],[`wavlm`,`WavLMForAudioFrameClassification`],[`wav2vec2`,`Wav2Vec2ForAudioFrameClassification`],[`pyannote`,`PyAnnoteForAudioFrameClassification`]]),Ik=/* @__PURE__ */ new Map([[`vitmatte`,`VitMatteForImageMatting`]]),Lk=/* @__PURE__ */ new Map([[`patchtst`,`PatchTSTForPrediction`],[`patchtsmixer`,`PatchTSMixerForPrediction`]]),Rk=/* @__PURE__ */ new Map([[`swin2sr`,`Swin2SRForImageSuperResolution`]]),zk=/* @__PURE__ */ new Map([[`chmv2`,`CHMv2ForDepthEstimation`],[`dpt`,`DPTForDepthEstimation`],[`depth_anything`,`DepthAnythingForDepthEstimation`],[`glpn`,`GLPNForDepthEstimation`],[`sapiens`,`SapiensForDepthEstimation`],[`depth_pro`,`DepthProForDepthEstimation`],[`metric3d`,`Metric3DForDepthEstimation`],[`metric3dv2`,`Metric3Dv2ForDepthEstimation`]]),Bk=/* @__PURE__ */ new Map([[`sapiens`,`SapiensForNormalEstimation`]]),Vk=/* @__PURE__ */ new Map([[`vitpose`,`VitPoseForPoseEstimation`]]),Hk=/* @__PURE__ */ new Map([[`clip`,`CLIPVisionModelWithProjection`],[`siglip`,`SiglipVisionModel`],[`jina_clip`,`JinaCLIPVisionModel`]]),Uk=[[sk,Y.EncoderOnly],[ck,Y.EncoderDecoder],[uk,Y.DecoderOnlyWithoutHead],[lk,Y.AutoEncoder],[mk,Y.EncoderOnly],[hk,Y.EncoderOnly],[gk,Y.Seq2Seq],[dk,Y.Seq2Seq],[_k,Y.DecoderOnly],[vk,Y.MultiModality],[yk,Y.EncoderOnly],[bk,Y.EncoderOnly],[xk,Y.Vision2Seq],[Sk,Y.ImageTextToText],[Ck,Y.AudioTextToText],[Tk,Y.EncoderOnly],[Ok,Y.EncoderOnly],[Ak,Y.EncoderOnly],[kk,Y.EncoderOnly],[Ik,Y.EncoderOnly],[Lk,Y.EncoderOnly],[Rk,Y.EncoderOnly],[zk,Y.EncoderOnly],[Bk,Y.EncoderOnly],[Vk,Y.EncoderOnly],[Ek,Y.EncoderOnly],[Dk,Y.EncoderOnly],[jk,Y.MaskGeneration],[Mk,Y.EncoderOnly],[Nk,Y.EncoderOnly],[fk,Y.Seq2Seq],[pk,Y.EncoderOnly],[Pk,Y.EncoderOnly],[Fk,Y.EncoderOnly],[Hk,Y.EncoderOnly]];for(let[e,t]of Uk)for(let n of e.values()){Cg.set(n,t);let e=qg[n];Tg.set(e,n),wg.set(n,e)}var Wk=[[`MusicgenForConditionalGeneration`,bw,Y.Musicgen],[`Phi3VForCausalLM`,wT,Y.Phi3V],[`CLIPTextModelWithProjection`,ev,Y.EncoderOnly],[`SiglipTextModel`,VE,Y.EncoderOnly],[`JinaCLIPTextModel`,fS,Y.EncoderOnly],[`ClapTextModelWithProjection`,Y_,Y.EncoderOnly],[`ClapAudioModelWithProjection`,X_,Y.EncoderOnly],[`DacEncoderModel`,Vv,Y.EncoderOnly],[`DacDecoderModel`,Hv,Y.EncoderOnly],[`MimiEncoderModel`,tC,Y.EncoderOnly],[`MimiDecoderModel`,nC,Y.EncoderOnly],[`SnacEncoderModel`,YE,Y.EncoderOnly],[`SnacDecoderModel`,XE,Y.EncoderOnly],[`Gemma3nForConditionalGeneration`,Bb,Y.ImageAudioTextToText],[`Gemma4ForConditionalGeneration`,Hb,Y.ImageAudioTextToText],[`SupertonicForConditionalGeneration`,yD,Y.Supertonic],[`ChatterboxModel`,H_,Y.Chatterbox],[`VoxtralRealtimeForConditionalGeneration`,bO,Y.VoxtralRealtime]];for(let[e,t,n]of Wk)Cg.set(e,n),Tg.set(t,e),wg.set(e,t);var Gk=/* @__PURE__ */ new Map([[`modnet`,Ok],[`birefnet`,Ok],[`isnet`,Ok],[`ben`,Ok]]);for(let[e,t]of Gk.entries())t.set(e,`PreTrainedModel`),Cg.set(e,Y.EncoderOnly),wg.set(e,X);var Kk=new Set(Gk.keys());Cg.set(`PreTrainedModel`,Y.EncoderOnly),Tg.set(X,`PreTrainedModel`);var Z={MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES:mk,MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES:hk,MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES:fk,MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES:pk,MODEL_FOR_MASKED_LM_MAPPING_NAMES:yk,MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES:bk,MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES:Tk,MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES:Ok,MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES:kk,MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES:Ak,MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES:Ek,MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES:Dk,MODEL_FOR_MASK_GENERATION_MAPPING_NAMES:jk,MODEL_FOR_CTC_MAPPING_NAMES:Mk,MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES:Nk,MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES:Pk,MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES:Fk,MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES:wk,MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES:Ik,MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES:Rk,MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES:zk,MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES:Bk,MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES:Vk,MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES:Hk,MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES:Sk,MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES:Ck,MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES:gk,MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES:dk,MODEL_FOR_CAUSAL_LM_MAPPING_NAMES:_k,MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES:xk};vg(Z);var Q=class{static MODEL_CLASS_MAPPINGS=null;static BASE_IF_FAIL=!1;static supports(e){if(!this.MODEL_CLASS_MAPPINGS)return!1;for(let t of this.MODEL_CLASS_MAPPINGS)if(t.has(e))return!0;return this.BASE_IF_FAIL}static async from_pretrained(e,{progress_callback:t=null,config:n=null,cache_dir:r=null,local_files_only:i=!1,revision:a=`main`,model_file_name:o=null,subfolder:s=`onnx`,device:c=null,dtype:l=null,use_external_data_format:u=null,session_options:d={}}={}){let f={progress_callback:t,config:n,cache_dir:r,local_files_only:i,revision:a,model_file_name:o,subfolder:s,device:c,dtype:l,use_external_data_format:u,session_options:d};if(f.config=await Ch.from_pretrained(e,f),!this.MODEL_CLASS_MAPPINGS)throw Error("`MODEL_CLASS_MAPPINGS` not implemented for this type of `AutoClass`: "+this.name);let{model_type:p}=f.config;for(let t of this.MODEL_CLASS_MAPPINGS){let n=t.get(p);if(!n){for(let e of t.values())if(e[0]===p){n=e;break}if(!n)continue}return await qg[n].from_pretrained(e,f)}if(this.BASE_IF_FAIL)return Kk.has(p)||A.warn(`Unknown model class "${p}", attempting to construct from base class.`),await X.from_pretrained(e,f);throw Error(`Unsupported model type: ${p}`)}},qk=class extends Q{static MODEL_CLASS_MAPPINGS=Uk.map(e=>e[0]);static BASE_IF_FAIL=!0},Jk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES]},Yk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES]},Xk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES]},Zk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES]},Qk=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_SPECTROGRAM_MAPPING_NAMES]},$k=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_TEXT_TO_WAVEFORM_MAPPING_NAMES]},eA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CAUSAL_LM_MAPPING_NAMES]},tA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASKED_LM_MAPPING_NAMES]},nA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES]},rA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_VISION_2_SEQ_MAPPING_NAMES]},iA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMES]},aA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_SEGMENTATION_MAPPING_NAMES]},oA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES]},sA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_UNIVERSAL_SEGMENTATION_MAPPING_NAMES]},cA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES]},lA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_MASK_GENERATION_MAPPING_NAMES]});var uA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_CTC_MAPPING_NAMES]},dA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_XVECTOR_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_FRAME_CLASSIFICATION_MAPPING_NAMES]};var fA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_MATTING_MAPPING_NAMES]});var pA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TO_IMAGE_MAPPING_NAMES]},mA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_DEPTH_ESTIMATION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_NORMAL_ESTIMATION_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_POSE_ESTIMATION_MAPPING_NAMES]};var hA=class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_FEATURE_EXTRACTION_MAPPING_NAMES]};(class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_IMAGE_TEXT_TO_TEXT_MAPPING_NAMES]}),class extends Q{static MODEL_CLASS_MAPPINGS=[Z.MODEL_FOR_AUDIO_TEXT_TO_TEXT_MAPPING_NAMES]};async function gA(e){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>Vf.read(e)))}async function _A(e,t){return Array.isArray(e)||(e=[e]),await Promise.all(e.map(e=>typeof e==`string`||e instanceof URL?Wd(e,t):e instanceof Float64Array?new Float32Array(e):e))}function vA(e,t){t&&(e=e.map(e=>e|0));let[n,r,i,a]=e;return{xmin:n,ymin:r,xmax:i,ymax:a}}var yA=class extends $r{constructor({task:e,model:t,tokenizer:n=null,processor:r=null}){super(),this.task=e,this.model=t,this.tokenizer=n,this.processor=r}async dispose(){await this.model.dispose()}},bA=class extends yA{async _call(e,{top_k:t=1}={}){let n=this.tokenizer(e,{padding:!0,truncation:!0}),r=await this.model(n),{problem_type:i,id2label:a}=this.model.config,o=i===`multi_label_classification`?e=>e.sigmoid():e=>new V(`float32`,ol(e.data),e.dims),s=[];for(let e of r.logits){let n=await iu(o(e),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));t===1?s.push(...i):s.push(i)}return Array.isArray(e)||t===1?s:s[0]}},xA=class extends yA{async _call(e,{ignore_labels:t=[`O`],aggregation_strategy:n=`none`}={}){if(n!==`none`&&n!==`simple`)throw Error(`Invalid aggregation_strategy: "${n}". Must be one of "none" or "simple".`);let r=Array.isArray(e),i=this.tokenizer(r?e:[e],{padding:!0,truncation:!0}),a=(await this.model(i)).logits,o=this.model.config.id2label,s=[];for(let e=0;e{let o=0,s=[];for(let n=i;ne==u),i=a[e].tolist(),f=o[e].tolist();for(let n=1;ne==t[n])!==-1)&&(i[n]=-1/0,f[n]=-1/0);let p=ol(i).map((e,t)=>[e,t]),m=ol(f).map((e,t)=>[e,t]);p[0][0]=0,m[0][0]=0;let h=oi(p,m).filter(e=>e[0][1]<=e[1][1]).map(e=>[e[0][1],e[1][1],e[0][0]*e[1][0]]).sort((e,t)=>t[2]-e[2]),g=[];for(let e=0;ee==n);if(c===-1)throw Error(`Mask token (${r}) not found in text.`);let l=a[e][c],u=await iu(new V(`float32`,ol(l.data),l.dims),t),d=u[0].tolist(),f=u[1].tolist();o.push(f.map((e,t)=>{let n=i.slice();return n[c]=e,{score:d[t],token:Number(e),token_str:this.tokenizer.decode([e]),sequence:this.tokenizer.decode(n,{skip_special_tokens:!0})}}))}return Array.isArray(e)?o:o[0]}},EA=class extends yA{_default_generation_config={max_new_tokens:256};_key=`generated_text`;async _call(e,t={}){Array.isArray(e)||(e=[e]),this.model.config.prefix&&(e=e.map(e=>this.model.config.prefix+e));let n=this.model.config.task_specific_params;n&&n[this.task]&&n[this.task].prefix&&(e=e.map(e=>n[this.task].prefix+e));let r=this.tokenizer,i={padding:!0,truncation:!0},a;a=this.task===`translation`&&`_build_translation_inputs`in r?r._build_translation_inputs(e,i,t):r(e,i);let o=await this.model.generate({...a,...this._default_generation_config,...t});return r.batch_decode(o,{skip_special_tokens:!0}).map(e=>({[this._key]:e}))}},DA=class extends EA{_key=`summary_text`},OA=class extends EA{_key=`translation_text`};function kA(e){return Array.isArray(e)&&e.every(e=>`role`in e&&`content`in e)}var AA=class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t={}){let{add_special_tokens:n,return_full_text:r,tools:i,documents:a,chat_template:o,tokenizer_encode_kwargs:s,...c}=t,l=!1,u=!1,d=n??(this.tokenizer.add_bos_token||this.tokenizer.add_eos_token)??!1,f=s,p;if(typeof e==`string`)p=e=[e];else if(Array.isArray(e)&&e.every(e=>typeof e==`string`))l=!0,p=e;else{if(kA(e))e=[e];else if(Array.isArray(e)&&e.every(kA))l=!0;else throw Error(`Input must be a string, an array of strings, a Chat, or an array of Chats`);u=!0;let t={tokenize:!1,add_generation_prompt:!0,...ci({tools:i,documents:a,chat_template:o},[`tools`,`documents`,`chat_template`]),...f};p=e.map(e=>this.tokenizer.apply_chat_template(e,t)),d=!1,f=void 0}let m=u?!1:r??!0;this.tokenizer.padding_side=`left`;let h=this.tokenizer(p,{add_special_tokens:d,padding:!0,truncation:!0,...f}),g=await this.model.generate({...h,...this._default_generation_config,...c}),_=this.tokenizer.batch_decode(g,{skip_special_tokens:!0}),v;!m&&h.input_ids.dims.at(-1)>0&&(v=this.tokenizer.batch_decode(h.input_ids,{skip_special_tokens:!0}).map(e=>e.length));let y=Array.from({length:e.length},e=>[]);for(let t=0;t<_.length;++t){let n=Math.floor(t/g.dims[0]*e.length);v&&(_[t]=_[t].slice(v[n])),y[n].push({generated_text:u?[...e[n],{role:`assistant`,content:_[t]}]:_[t]})}return!l&&y.length===1?y[0]:y}},jA=class extends yA{constructor(e){super(e),this.label2id=Object.fromEntries(Object.entries(this.model.config.label2id).map(([e,t])=>[e.toLowerCase(),t])),this.entailment_id=this.label2id.entailment,this.entailment_id===void 0&&(A.warn(`Could not find 'entailment' in label2id mapping. Using 2 as entailment_id.`),this.entailment_id=2),this.contradiction_id=this.label2id.contradiction??this.label2id.not_entailment,this.contradiction_id===void 0&&(A.warn(`Could not find 'contradiction' in label2id mapping. Using 0 as contradiction_id.`),this.contradiction_id=0)}async _call(e,t,{hypothesis_template:n=`This example is {}.`,multi_label:r=!1}={}){let i=Array.isArray(e);i||(e=[e]),Array.isArray(t)||(t=[t]);let a=t.map(e=>n.replace(`{}`,e)),o=r||t.length===1,s=[];for(let n of e){let e=[];for(let t of a){let r=this.tokenizer(n,{text_pair:t,padding:!0,truncation:!0}),i=await this.model(r);o?e.push([i.logits.data[this.contradiction_id],i.logits.data[this.entailment_id]]):e.push(i.logits.data[this.entailment_id])}let r=(o?e.map(e=>ol(e)[1]):ol(e)).map((e,t)=>[e,t]).sort((e,t)=>t[0]-e[0]);s.push({sequence:n,labels:r.map(e=>t[e[1]]),scores:r.map(e=>e[0])})}return i?s:s[0]}},MA=class extends yA{async _call(e,{top_k:t=5}={}){let n=this.processor.feature_extractor.config.sampling_rate,r=await _A(e,n),i=this.model.config.id2label,a=[];for(let e of r){let n=await this.processor(e),r=(await this.model(n)).logits[0],o=await iu(new V(`float32`,ol(r.data),r.dims),t),s=o[0].tolist(),c=o[1].tolist().map((e,t)=>({label:i?i[e]:`LABEL_${e}`,score:s[t]}));a.push(c)}return Array.isArray(e)?a:a[0]}},NA=class extends yA{async _call(e,t,{hypothesis_template:n=`This is a sound of {}.`}={}){let r=!Array.isArray(e);r&&(e=[e]);let i=t.map(e=>n.replace(`{}`,e)),a=this.tokenizer(i,{padding:!0,truncation:!0}),o=this.processor.feature_extractor.config.sampling_rate,s=await _A(e,o),c=[];for(let e of s){let n=await this.processor(e),r=ol((await this.model({...a,...n})).logits_per_audio.data);c.push([...r].map((e,n)=>({score:e,label:t[n]})))}return r?c[0]:c}},PA=class extends yA{_default_generation_config={};async _call(e,t={}){switch(t={...this._default_generation_config,...t},this.model.config.model_type){case`whisper`:case`lite-whisper`:return this._call_whisper(e,t);case`wav2vec2`:case`wav2vec2-bert`:case`unispeech`:case`unispeech-sat`:case`hubert`:case`parakeet_ctc`:return this._call_wav2vec2(e,t);case`moonshine`:return this._call_moonshine(e,t);case`cohere_asr`:return this._call_cohere_asr(e,t);default:throw Error(`AutomaticSpeechRecognitionPipeline does not support model type '${this.model.config.model_type}'.`)}}async _call_wav2vec2(e,t){t.language&&A.warn('`language` parameter is not yet supported for `wav2vec2` models, defaulting to "English".'),t.task&&A.warn('`task` parameter is not yet supported for `wav2vec2` models, defaulting to "transcribe".');let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let t=await this.processor(e),n=(await this.model(t)).logits[0],r=[];for(let e of n)r.push(ll(e.data)[1]);let i=this.tokenizer.decode(r,{skip_special_tokens:!0}).trim();o.push({text:i})}return n?o[0]:o}async _call_whisper(e,t){let n=t.return_timestamps??!1,r=t.chunk_length_s??0,i=t.force_full_sequences??!1,a=t.stride_length_s??null,o={...t};n===`word`&&(o.return_token_timestamps=!0,o.return_timestamps=!0);let s=!Array.isArray(e),c=s?[e]:e,l=this.processor.feature_extractor.config,u=l.chunk_length/this.model.config.max_source_positions,d=l.hop_length,f=l.sampling_rate,p=await _A(c,f),m=[];for(let e of p){let t=[];if(r>0){if(a===null)a=r/6;else if(r<=a)throw Error("`chunk_length_s` must be larger than `stride_length_s`.");let n=f*r,i=f*a,o=n-2*i,s=0;for(;;){let r=s+n,a=e.subarray(s,r),c=await this.processor(a),l=s===0,u=r>=e.length;if(t.push({stride:[a.length,l?0:i,u?0:i],input_features:c.input_features,is_last:u}),u)break;s+=o}}else t=[{stride:[e.length,0,0],input_features:(await this.processor(e)).input_features,is_last:!0}];for(let e of t){o.num_frames=Math.floor(e.stride[0]/d);let t=await this.model.generate({inputs:e.input_features,...o});if(n===`word`){let n=t.sequences.tolist()[0],r=t.token_timestamps.tolist()[0],i=this.tokenizer.timestamp_begin,a=Math.max(n.findIndex(e=>Number(e)>=i),0);e.tokens=n.slice(a),e.token_timestamps=r.slice(a).map(e=>hl(e,2))}else e.tokens=t[0].tolist();e.stride=e.stride.map(e=>e/f)}let[s,c]=this.tokenizer._decode_asr(t,{time_precision:u,return_timestamps:n,force_full_sequences:i});m.push({text:s,...c})}return s?m[0]:m}async _call_moonshine(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor.config.sampling_rate,a=await _A(r,i),o=[];for(let e of a){let n=await this.processor(e),r=Math.floor(e.length/i)*6,a=await this.model.generate({max_new_tokens:r,...t,...n}),s=this.tokenizer.batch_decode(a,{skip_special_tokens:!0})[0];o.push({text:s})}return n?o[0]:o}async _call_cohere_asr(e,t){let n=!Array.isArray(e),r=n?[e]:e,i=this.processor.feature_extractor,a=i.config.sampling_rate,o=await _A(r,a),s=t.language??`en`,c=this.processor.get_decoder_prompt_ids(s),l=[];for(let e of o){let n=i.split_audio(e),r=[];for(let e of n){let n=await this.processor(e),i=await this.model.generate({...n,decoder_input_ids:c,...t}),a=this.tokenizer.decode(i[0].tolist(),{skip_special_tokens:!0}).trim();r.push(a)}let a=this.processor.constructor.join_chunks(r,s);l.push({text:a})}return n?l[0]:l}},FA=class extends yA{DEFAULT_VOCODER_ID=`Xenova/speecht5_hifigan`;constructor(e){super(e),this.vocoder=e.vocoder??null}async _prepare_speaker_embeddings(e,t){if((typeof e==`string`||e instanceof URL)&&(e=new Float32Array(await(await k.fetch(e)).arrayBuffer())),e instanceof Float32Array)e=new V(`float32`,e,[e.length]);else if(!(e instanceof V))throw Error("Speaker embeddings must be a `Tensor`, `Float32Array`, `string`, or `URL`.");if(t>1){if(e.dims[0]===1)e=e.repeat(t,1);else if(e.dims[0]!==t)throw Error(`Expected speaker embeddings batch size to be 1 or ${t}, but got ${e.dims[0]}.`)}return e}_postprocess_waveform(e,t,n,r=null){let i=t.data,[a,o]=t.dims,s=r?r.data:null,c=[];for(let e=0;e({generated_text:e.trim()}));a.push(r)}return n?a:a[0]}},LA=class extends yA{async _call(e,{top_k:t=5}={}){let n=await gA(e),{pixel_values:r}=await this.processor(n),i=await this.model({pixel_values:r}),{id2label:a}=this.model.config,o=[];for(let e of i.logits){let n=await iu(new V(`float32`,ol(e.data),e.dims),t),r=n[0].tolist(),i=n[1].tolist().map((e,t)=>({label:a?a[e]:`LABEL_${e}`,score:r[t]}));o.push(i)}return Array.isArray(e)?o:o[0]}},RA={panoptic:`post_process_panoptic_segmentation`,instance:`post_process_instance_segmentation`,semantic:`post_process_semantic_segmentation`},zA=class extends yA{async _call(e,{threshold:t=.5,mask_threshold:n=.5,overlap_mask_area_threshold:r=.8,label_ids_to_fuse:i=null,target_sizes:a=null,subtask:o=null}={}){if(Array.isArray(e)&&e.length!==1)throw Error(`Image segmentation pipeline currently only supports a batch size of 1.`);let s=await gA(e),c=s.map(e=>[e.height,e.width]),l=await this.processor(s),{inputNames:u,outputNames:d}=this.model.sessions.model;if(!u.includes(`pixel_values`)){if(u.length!==1)throw Error(`Expected a single input name, but got ${u.length} inputs: ${u}.`);let e=u[0];if(e in l)throw Error(`Input name ${e} already exists in the inputs.`);l[e]=l.pixel_values}let f=await this.model(l),p=null;if(o!==null)p=RA[o];else if(this.processor.image_processor){for(let[e,t]of Object.entries(RA))if(t in this.processor.image_processor){p=this.processor.image_processor[t].bind(this.processor.image_processor),o=e;break}}let m=this.model.config.id2label,h=[];if(!o){let e=f[d[0]];for(let t=0;te<-1e-5||e>1.00001)&&r.sigmoid_();let i=await Vf.fromTensor(r.mul_(255).to(`uint8`)).resize(n[1],n[0]);h.push({label:null,score:null,mask:i})}}else if(o===`panoptic`||o===`instance`){let e=p(f,t,n,r,i,a??c)[0],o=e.segmentation;for(let t of e.segments_info){let e=new Uint8ClampedArray(o.data.length);for(let n=0;n{let n=e.clone();return n.putAlpha(r[t].mask),n});return Array.isArray(e)?i:i[0]}},model:[aA,oA,sA],default:{model:`Xenova/modnet`},type:`image`},"zero-shot-image-classification":{pipeline:class extends yA{async _call(e,t,{hypothesis_template:n=`This is a photo of {}`}={}){let r=Array.isArray(e),i=await gA(e),a=t.map(e=>n.replace(`{}`,e)),o=this.tokenizer(a,{padding:this.model.config.model_type!==`siglip`||`max_length`,truncation:!0}),{pixel_values:s}=await this.processor(i),c=await this.model({...o,pixel_values:s}),l=this.model.config.model_type===`siglip`?e=>e.sigmoid().data:e=>ol(e.data),u=[];for(let e of c.logits_per_image){let n=[...l(e)].map((e,n)=>({score:e,label:t[n]}));n.sort((e,t)=>t.score-e.score),u.push(n)}return r?u:u[0]}},model:qk,default:{model:`Xenova/clip-vit-base-patch32`},type:`multimodal`},"object-detection":{pipeline:class extends yA{async _call(e,{threshold:t=.9,percentage:n=!1}={}){let r=Array.isArray(e);if(r&&e.length!==1)throw Error(`Object detection pipeline currently only supports a batch size of 1.`);let i=await gA(e),a=n?null:i.map(e=>[e.height,e.width]),{pixel_values:o,pixel_mask:s}=await this.processor(i),c=await this.model({pixel_values:o,pixel_mask:s}),l=this.processor.image_processor.post_process_object_detection(c,t,a),{id2label:u}=this.model.config,d=l.map(e=>e.boxes.map((t,r)=>({score:e.scores[r],label:u[e.classes[r]],box:vA(t,!n)})));return r?d:d[0]}},model:cA,default:{model:`Xenova/detr-resnet-50`},type:`multimodal`},"zero-shot-object-detection":{pipeline:class extends yA{async _call(e,t,{threshold:n=.1,top_k:r=null,percentage:i=!1}={}){let a=Array.isArray(e),o=await gA(e),s=this.tokenizer(t,{padding:!0,truncation:!0}),c=await this.processor(o),l=[];for(let e=0;e({score:e.scores[n],label:e.labels[n],box:vA(t,!i)}))}else{let e=this.processor.image_processor.post_process_object_detection(f,n,u,!0)[0];p=e.boxes.map((n,r)=>({score:e.scores[r],label:t[e.classes[r]],box:vA(n,!i)}))}p.sort((e,t)=>t.score-e.score),r!==null&&(p=p.slice(0,r)),l.push(p)}return a?l:l[0]}},model:lA,default:{model:`Xenova/owlvit-base-patch32`},type:`multimodal`},"document-question-answering":{pipeline:class extends yA{_default_generation_config={max_new_tokens:256};async _call(e,t,n={}){if(Array.isArray(e)){if(e.length!==1)throw Error(`Document Question Answering pipeline currently only supports a batch size of 1.`);e=e[0]}let r=(await gA(e))[0],{pixel_values:i}=await this.processor(r),a=`${t}`,o=this.tokenizer(a,{add_special_tokens:!1,padding:!0,truncation:!0}).input_ids,s=await this.model.generate({inputs:i,max_length:this.model.config.decoder.max_position_embeddings,decoder_input_ids:o,...this._default_generation_config,...n}),c=this.tokenizer.batch_decode(s)[0].match(/(.*?)<\/s_answer>/),l=null;return c&&c.length>=2&&(l=c[1].trim()),[{answer:l}]}},model:fA,default:{model:`Xenova/donut-base-finetuned-docvqa`},type:`multimodal`},"image-to-image":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),r=await this.model(n),i=[];for(let e of r.reconstruction){let t=e.squeeze().clamp_(0,1).mul_(255).round_().to(`uint8`);i.push(Vf.fromTensor(t))}return Array.isArray(e)?i:i[0]}},model:pA,default:{model:`Xenova/swin2SR-classical-sr-x2-64`},type:`image`},"depth-estimation":{pipeline:class extends yA{async _call(e){let t=await gA(e),n=await this.processor(t),{predicted_depth:r}=await this.model(n),i=[];for(let e=0;et).sort((e,t)=>o[t]-o[e]).slice(0,r).map(e=>({index:e,score:o[e]}))}const WA={amp:`&`,lt:`<`,gt:`>`,quot:`"`,apos:`'`,nbsp:` `,hellip:`…`,mdash:`—`,ndash:`–`,laquo:`«`,raquo:`»`,middot:`·`,deg:`°`,times:`×`,euro:`€`,pound:`£`,reg:`®`,copy:`©`,bull:`•`,trade:`™`,rsquo:`’`,lsquo:`‘`,ldquo:`“`,rdquo:`”`};function GA(e){return typeof e!=`string`||!e?``:e.replace(/<[^>]*>/g,` `).replace(/&#x([0-9a-f]+);/gi,(e,t)=>KA(parseInt(t,16))).replace(/&#(\d+);/g,(e,t)=>KA(parseInt(t,10))).replace(/&([a-z]+);/gi,(e,t)=>WA[t.toLowerCase()]??e).replace(/\s+/g,` `).trim()}function KA(e){return Number.isFinite(e)&&e>0&&e<=1114111?String.fromCodePoint(e):``}function qA(e){return String(e??``).normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}const JA=/* @__PURE__ */ new Set(/* @__PURE__ */ `va.hoac.cua.cho.voi.mot.nung.khong.duoc.de.theo.loai.tinh.gia.thuoc.ve.tai.nha.mat.neu.thi.la.cac.nhan.bi.ra.nay`.split(`.`));function YA(e){let t=[];for(let n of qA(e).split(/[^a-z0-9]+/))n.length>1&&!JA.has(n)&&t.push(n);return t}function $(...e){for(let t of e)if(typeof t==`string`&&t.trim())return GA(t);return``}function XA(e){let t=/* @__PURE__ */ new Set,n=[],r=e=>{if(typeof e!=`string`)return;let r=e.trim();r&&!t.has(r)&&(/^https?:\/\//i.test(r)||/^data:image\//i.test(r))&&(t.add(r),n.push(r))};return Array.isArray(e.imgs)&&e.imgs.forEach(r),Array.isArray(e.images)&&e.images.forEach(r),r(e.i),r(e.image),n}function ZA(e){for(let t of[e.pn,e.salePn,e.priceNum,e.price_number,e.priceNumber]){let e=Number(t);if(Number.isFinite(e)&&e>0)return e}return 0}function QA(e){let t=Math.round(Number(e)||0);return t<=0?``:`${String(t).replace(/\B(?=(\d{3})+(?!\d))/g,`.`)}₫`}function $A(e){return $(e.p,e.priceText,e.price)||QA(ZA(e))}function ej(e){let t=e;if(typeof t==`string`&&t.trim()){let e=t.trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{t=JSON.parse(e)}catch{t=null}else t=null}let n=[];if(Array.isArray(t))for(let e of t)Array.isArray(e)&&e.length>=2?n.push([$(e[0]),$(e[1])]):e&&typeof e==`object`&&n.push([$(e.name,e.key),$(e.value)]);else if(t&&typeof t==`object`)for(let[e,r]of Object.entries(t)){let t=$(r)||(r==null?``:String(r));t&&n.push([$(e),t])}return n.filter(([e,t])=>e&&t)}function tj(e){return(Array.isArray(e.feats)?e.feats:Array.isArray(e.features)?e.features:[]).map(e=>$(e)).filter(Boolean)}function nj(e){if(!e||typeof e!=`object`)return null;let t=$(e.sku,e.mod,e.model,e.SAP),n=$(e.slug),r=$(e.n,e.name,e.title_clean,e.title)||t||n,i=t||n;return!i||!r?null:{sku:i,slug:n,model:$(e.mod,e.model,t),name:r,brand:$(e.brand),category:$(e.c,e.category,e.cs,e.category_slug),link:$(e.l,e.link),price:$A(e),priceNum:ZA(e),images:XA(e),summary:$(e.sum,e.summary,e.description,e.desc),specs:ej(e.specs),feats:tj(e),addedBy:$(e._addedBy,e._source),addedAt:e._added_at||e.addedAt||null}}const rj={"catalogue/products.json":`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_url_added.json`,"catalogue/promos.json":`https://huggingface.co/datasets/bep40/vaistudio-data/resolve/main/promos.json`};let ij=null;function aj(){return import.meta.url.replace(/\/dist\/assets\/[^/]*$/,`/`)}function oj(e){let t=aj(),n=[new URL(`dist/`+e,t).href,new URL(e,t).href];return typeof document<`u`&&document.baseURI&&(n.push(new URL(e.replace(/^catalogue\//,`dist/catalogue/`),document.baseURI).href),n.push(new URL(e,document.baseURI).href)),[...new Set(n)]}async function sj(e){let t=rj[e],n=t?[t,...oj(e)]:oj(e),r;for(let t of n)try{let n={cache:`no-store`};typeof AbortSignal<`u`&&typeof AbortSignal.timeout==`function`&&(n.signal=AbortSignal.timeout(2e4));let i=await fetch(t,n);if(!i.ok){r=/* @__PURE__ */ Error(`HTTP ${i.status}`);continue}let a=await i.text(),o;try{o=JSON.parse(a)}catch{r=/* @__PURE__ */ Error(`body is not valid JSON`);continue}if(Array.isArray(o)?o.length===0&&e.includes(`products`):!o||typeof o!=`object`){r=/* @__PURE__ */ Error(`unexpected shape`);continue}return o}catch(e){r=e}throw Error(`Không tìm thấy ${e} (${r?.message||`không rõ`}). Chạy \`node scripts/sync-catalogue.mjs\` để nhân bản dữ liệu từ vai-avatar vào Space.`)}async function cj(){try{let e=await fetch(`https://huggingface.co/api/datasets/bep40/grob-products-updated/revision/main`,{cache:`no-store`});if(!e.ok)return null;let t=await e.json();return typeof t?.sha==`string`?t.sha:null}catch{return null}}let lj=null,uj=null;async function dj(){let e=await cj();if(e&&ij&&e===ij)return lj;let t=await fetch(`https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_with_slugs.json`,{cache:`no-store`});if(!t.ok)throw Error(`HTTP ${t.status}`);let n=JSON.parse(await t.text());if(!Array.isArray(n)||!n.length)throw Error(`unexpected shape`);return lj=n,ij=e??`len:${n.length}`,n}function fj(){return uj||(uj=dj().catch(e=>{if(lj)return lj;throw e}).finally(()=>{uj=null}),uj)}function pj(e){return $(e.sku,e.mod,e.model).toUpperCase()?0:$(e.slug)?1:2}function mj(e){let t=[],n=/* @__PURE__ */ new Map,r=/* @__PURE__ */ new Map;for(let i of vj(Array.isArray(e)?e:[])){if(!i||typeof i!=`object`)continue;let e=$(i.slug).toLowerCase(),a=qA($(i.n,i.name,i.title)).trim(),o=$(i.imgs?.[0],i.i,i.image).split(`?`)[0],s=a&&o?`${a}\u0000${o}`:null;if(!e&&!s)continue;let c=pj(i),l=[];e&&l.push(n.get(e)),s&&l.push(r.get(s));let u=l.find(e=>e!==void 0);if(u&&u.ranke.described)).size===1&&(i.sort((e,t)=>t.images.length-e.images.length),r.set(e,i[0].images));return r}function vj(e){if(!Array.isArray(e))return e;let t=e.filter(gj);if(!t.length)return e;let n=_j(e),r=[],i=0,a=0;for(let t of e){if(!gj(t)){r.push(t);continue}let e=null;for(let r of hj($(t.n,t.name,t.title)))if(n.has(r)){e=n.get(r);break}if(e){r.push({...t,imgs:e,i:e[0],brand:`Malloca`}),i++;continue}r.push({...t,brand:`Malloca`}),a++}return t.length&&console.info(`[catalogue] Malloca misbranding: ${t.length} rows (name says Malloca, brand says otherwise). ${i} swapped to a real Malloca photo, ${a} relabelled, ${t.length-i-a} hidden.`),r}function yj(e){let t=[],n=e=>{let n=$(e).toUpperCase();n&&!t.includes(n)&&t.push(n)};n(e.sku),n(e.mod),n(e.model),n(e.SAP),n(e._source_alias),n(e.slug);let r=qA($(e.n,e.name,e.title_clean,e.title)).replace(/\s+/g,` `).trim();return r.length>8&&n(r),t}const bj=[[`name`,[`n`,`title_clean`,`title`]],[`priceNum`,[`p`,`pn`,`salePn`,`price_number`,`priceNumber`,`price`]],[`description`,[`sum`,`summary`,`desc`]],[`features`,[`feats`]],[`images`,[`imgs`,`i`,`image`]]];function xj(e){let t=e&&e.deleted;return t===!0||t===1||t===`true`||t===`1`}function Sj(e,t,n){let r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Set;function o(e,t){for(let n of t){if(a.has(n))continue;let t=i.get(n);t===void 0?i.set(n,e):t!==e&&(i.delete(n),a.add(n))}}function s(e,t,n){let i=r.get(e);if(!i){r.set(e,{...t});return}let a={...i};if(n){for(let[e,r]of n)if(t[e]!==void 0)for(let e of r)delete a[e]}r.set(e,{...a,...t})}for(let e of Array.isArray(n)?n:[]){if(!e||typeof e!=`object`)continue;let t=yj(e);t.length&&(s(t[0],e),o(t[0],t))}for(let t of Array.isArray(e)?e:[]){if(!t||typeof t!=`object`)continue;let e=yj(t);if(!e.length)continue;let n=e.map(e=>i.get(e)).find(e=>e!==void 0)??e[0];s(n,t,bj),o(n,e)}let c=t&&typeof t==`object`&&t.productEdits&&typeof t.productEdits==`object`?t.productEdits:{};for(let[e,t]of Object.entries(c)){if(!t||typeof t!=`object`)continue;let n=yj(t),r=$(e).toUpperCase();if(!n.length&&!r)continue;let a=[...n,r].map(e=>i.get(e)).find(e=>e!==void 0)??r;s(a,t,bj),o(a,[...n,r])}let l=/* @__PURE__ */ new Map;for(let[e,t]of r){if(xj(t))continue;let n=nj(t);n&&l.set(e,n)}return l}function Cj(e){let t=2166136261,n=e=>{let n=String(e);for(let e=0;e>>0).toString(36)}-${e.size}`}let wj=null,Tj=null;function Ej(){return Tj||(Tj=(async()=>{let[e,t,n]=await Promise.all([sj(`catalogue/products.json`),sj(`catalogue/promos.json`).then(e=>(wj=e,e)).catch(()=>wj??{}),fj().then(e=>mj(e)).catch(()=>lj?mj(lj):[])]),r=Sj(e,t,n);return{items:r,signature:Cj(r),syncedAt:Date.now(),partial:!n.length}})().finally(()=>{Tj=null}),Tj)}async function Dj(){try{return await Ej()}catch{return null}}const Oj={name:6,model:4,brand:3,category:3,summary:1,feats:1,specs:1};function kj(e){let t={name:YA(e.name),model:YA(e.model),brand:YA(e.brand),category:YA(e.category),summary:YA(e.summary.slice(0,600)),feats:e.feats.flatMap(YA),specs:e.specs.flatMap(([e,t])=>YA(e).concat(YA(t)))},n=/* @__PURE__ */ new Map;for(let[e,r]of Object.entries(Oj))for(let i of new Set(t[e]||[]))(n.get(i)||0)2&&e.length>2&&(r.startsWith(e)||e.startsWith(r))&&(n=Math.max(n,i*.7));n&&(o+=n,s++)}s&&(o*=.55+.45*(s/r.length),i.length>3&&n.includes(i)&&(o*=1.35),a.push({sku:e.sku,score:o,product:e}))}return a.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),a.slice(0,n)}const Nj=qA;function Pj(e){return Nj(e).split(/\s+/).filter(e=>e.length>1)}const Fj=[`inox 304`,`inox sus304`,`inox304`,`inox`,`sus304`,`sus 304`,`nan oval`,`nan vuông`,`nan tron`,`nan dẹt`,`nan det`,`khung nhôm`,`nhôm`,`hợp kim`,`kính`,`gốm`,`đá granite`,`da granite`,`mây`,`thép`,`gang`,`nhựa abs`,`abs`,`thủy tinh`],Ij=[`malloca`,`eurogold`,`grob`,`canzy`,`demax`,`sunhouse`,`kangaroo`,`sharp`,`toshiba`,`panasonic`,`samsung`,`lg`,`electrolux`,`bosch`,`fischer`];function Lj(e){let t=/* @__PURE__ */ new Set,n=/(\d{1,4})\s*mm/gi,r=/[wdh]\s*[:=]?\s*(\d{1,4})/gi,i;for(;i=n.exec(e);)t.add(parseInt(i[1],10));for(;i=r.exec(e);)t.add(parseInt(i[1],10));return t}function Rj(e){let t=Nj((e.specs||[]).map(([e,t])=>`${e} ${t}`).join(` `));return{name:Nj(e.name||``),sku:Nj(e.model||e.sku||``),brand:Nj(e.brand||``),category:Nj(e.category||``),summary:Nj(e.summary||``),feats:Nj((e.feats||[]).join(` `)),specsText:t}}function zj(e,t,n){let{name:r,sku:i,brand:a,category:o,summary:s,feats:c,specsText:l}=Rj(e),u=Nj(String(t||``).trim()),d=0,f=u.replace(/[^a-z0-9]/g,``),p=r.replace(/[^a-z0-9]/g,``),m=i.replace(/[^a-z0-9]/g,``);f.length>=4&&(m===f?d+=1e3:p===f?d+=900:p.includes(f)||m.includes(f)?d+=550:m.length>=Math.max(5,f.length/2)&&f.includes(m)&&(d+=400));let h=n.filter(e=>e.length>1&&!/^\d{2,4}mm/.test(e));h.length&&h.every(e=>r.includes(e))&&(d+=300);let g=[r,a,o,Nj(e.summary||``),c,l].join(` `),_=String(t||``).trim();r===_?d+=200:i===_?d+=180:r.includes(_)?d+=100:i.includes(_)?d+=80:g.includes(_)&&(d+=50);let v=Lj(`${r} ${l} ${Nj(e.summary||``)} ${c} ${s}`),y=Lj(_);[...y].some(e=>v.has(e))?r.includes(_)?d+=40:r.split(` `).some(e=>/^\d{1,4}mm$/i.test(e))?d+=55:d+=l===``?40:50:y.size&&(d-=10);for(let e of n.filter(e=>/^\d{2,4}\s*mm$/.test(e))){let t=e.replace(/\s+/g,``);r.includes(t)?d+=60:i.includes(t)?d+=40:g.includes(t)&&(d+=25)}for(let t of Fj){let n=Nj(t);if(u.includes(n)&&(r.includes(n)||l.includes(n)||Nj(e.summary||``).includes(n))){d+=30;break}}let b=0,x=n.filter(e=>e.length>1&&!/^\d{2,4}\s*mm$/.test(e));for(let e of x)r.includes(e)?(d+=16,b++):i.includes(e)?d+=12:a.includes(e)?d+=8:o.includes(e)?d+=10:g.includes(e)&&(d+=3);b>=2?d+=35:b===1&&x.length>=2&&(d+=10);for(let e of x)o.includes(e)&&(d+=6);for(let e of Ij)u.includes(e)&&a.includes(e)&&(d+=50);return d}function Bj(e,t,n=24){let r=Pj(e);if(!r.length||!t?.size)return[];let i=[];for(let n of t.values()){let t=zj(n,String(e||``).trim(),r);t>=24&&i.push({sku:n.sku,score:t,product:n})}return i.sort((e,t)=>t.score-e.score||e.sku.localeCompare(t.sku)),i.slice(0,n)}function Vj(e){let t=String(e?.image_id||``).trim();return t?`https://bep40-vai-avatar2-interior-api.hf.space/image/${encodeURIComponent(t)}.jpg`:``}function Hj(e){return String(e??``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).replace(/đ/g,`d`).replace(/Đ/g,`D`).toLowerCase()}function Uj(e){let t=String(e?.image_id||``).trim();if(!t)return null;let n=Vj(e);if(!n)return null;let r=String(e.desc||e.alt||(e.post_titles||[])[0]||``).trim(),i=[].concat(e.categories||[],e.room_hints||[],e.labels||[]).map(e=>String(e||``).trim()).filter(Boolean),a=(e.keywords||[]).map(e=>String(e||``).trim()).filter(Boolean),o=Number(e.w),s=Number(e.h),c=Number.isFinite(o)&&Number.isFinite(s)&&o>0&&s>0?o/s:1;return{sku:`avatarimg:${t}`,avatarImageId:t,title:r,name:r,description:String(e.desc||``).trim(),categories:i,keywords:a,source:String(e.source||``).trim(),link:String((e.post_urls||[])[0]||``).trim(),ar:Math.max(.5,Math.min(2,c)),images:[n],src:n,addedAt:String(e.created_at||``).trim()}}async function Wj(e=60){try{let t=await fetch(`https://huggingface.co/datasets/bep40/vai-avatar2-interior/resolve/main/index.json`,{cache:`no-cache`});if(!t.ok)return[];let n=await t.json();if(!Array.isArray(n))return[];let r=n.filter(e=>e&&typeof e.created_at==`string`&&e.created_at).sort((e,t)=>e.created_att.created_at?-1:0).slice(0,200),i=[];for(let e of r){let t=Uj(e);t&&i.push(t)}return i.sort((e,t)=>e.addedAtt.addedAt?-1:0),i.slice(0,e)}catch{return[]}}function Gj(e,t,n=60){let r=Hj(String(e||``).trim());if(r.length<2||!t?.length)return[];let i=r.split(/\s+/).filter(e=>e.length>1),a=[];for(let e of t){let t=Hj([e.title,e.description,...e.categories||[],...e.keywords||[]].join(` `)),n=0;r.length>=3&&t.includes(r)&&(n+=900);let o=0;for(let e of i)t.includes(e)&&(n+=25,o++);if(o&&n<900){n+=o*10;if(n<60)continue}a.push({...e,score:n})}return a.sort((e,t)=>t.score-e.score||(e.addedAtself.postMessage(e);function Xj(){return Kj??=(async()=>{Yj({status:`loading`,label:`Đang tải mô hình tìm kiếm`});let[e,t,n,r]=await Promise.all([W.from_pretrained(`sentence-transformers/clip-ViT-B-32-multilingual-v1`),ev.from_pretrained(`bep40/clip-vit-b32-multilingual-vi-text`,{dtype:`fp32`,device:`wasm`,revision:`9e1d53553228b17abfe6986fbe92e22bd6bd6bad`,progress_callback:e=>{e.status===`progress`&&e.file?.endsWith(`.onnx`)&&Yj({status:`loading`,label:`Đang tải mô hình tìm kiếm`,progress:e.progress})}}),VA(BA+`image-embeddings.json`).then(e=>JSON.parse(new TextDecoder().decode(e))),VA(BA+`image-embeddings_25k-512-32bit.bin`)]),i=new Float32Array(r);if(i.length!==n.length*512)throw Error(`The image database and embeddings do not match.`);return HA(i,512),Yj({status:`loading`,label:`Đang khởi động tìm kiếm`,progress:100}),await t(e(`a photograph`,{padding:!0,truncation:!0})),Yj({status:`ready`,count:n.length}),{tokenizer:e,model:t,metadata:n,embeddings:i}})().catch(e=>{throw Kj=null,e})}async function Zj(){if(!Jj){Jj=!0;try{let{tokenizer:e,model:t,metadata:n,embeddings:r}=await Xj();for(;qj;){let i=qj;qj=null;let a=performance.now();try{let{text_embeds:o}=await t(e(i.text,{padding:!0,truncation:!0}));if(qj)continue;let s=UA(o.data,r,512,96).map(({index:e,score:t})=>({...n[e],score:t}));Yj({status:`complete`,id:i.id,text:i.text,output:s,elapsed:performance.now()-a})}catch(e){Yj({status:`error`,id:i.id,message:e.message})}}}catch(e){Yj({status:`error`,id:qj?.id,message:e.message}),qj=null}finally{Jj=!1}}}let Qj=null;function $j(){return Qj??Ej().then(e=>(Qj=e,e))}async function eM(e=!1){let t=e?await Ej():await Dj();return t&&(Qj=t),t}let tM=null,nM=``,qM=``;async function rM(){return tM||(tM=await Wj(60),nM=tM.map(e=>e.avatarImageId).join(`,`),tM)}async function iM(){let e=await Wj(60),t=e.map(e=>e.avatarImageId).join(`,`);let c=await $j().catch(()=>({items:null})),r=c?.items?cJ(c.items):[],sk=r.map(p=>p.sku+`@`+(p.addedAt||``)).join(`,`),n=(t!==nM)||(sk!==qM);tM=e,nM=t,qM=sk;Yj({status:`avatar-updated`,items:e,signature:t,changed:n,count:e.length,recentProducts:r})}function cJ(e){if(!e?.size)return[];let a=[];for(let p of e.values()){if(!p?.addedAt)continue;let ok=Array.isArray(p.images)&&p.images.some(s=>typeof s===`string`&&/^(https?:\/\/|data:image\/)/i.test(s));if(!ok)continue;a.push({...p,score:1})}a.sort((x,y)=>String(y.addedAt||``).localeCompare(String(x.addedAt||``)));return a.slice(0,12)}async function aM(e,t,n){let r=performance.now();try{Yj({status:`products-loading`});let{items:i,signature:a}=await $j(),o=Bj(e,i,n),s=Mj(e,i,n),c=Gj(e,await rM());Yj({status:`products-complete`,id:t,text:e,output:o,legacy:s,interiors:c,signature:a,count:i.size,elapsed:performance.now()-r})}catch(e){Yj({status:`products-error`,id:t,message:e.message})}}self.addEventListener(`message`,({data:e})=>{e.type===`init`?(Xj().catch(e=>Yj({status:`error`,message:e.message})),$j().catch(()=>{}),iM().catch(()=>{})):e.type===`search`?(qj={id:e.id,text:e.text},Zj()):e.type===`search-products`?aM(e.text,e.id,e.limit??24):e.type===`refresh-catalogue`?(eM(e.force===!0).then(e=>e&&Yj({status:`catalogue-updated`,signature:e.signature,count:e.items.size,syncedAt:e.syncedAt})).catch(e=>Yj({status:`catalogue-error`,message:e.message})),iM().catch(()=>{})):e.type===`clear`&&(qj=null)}); \ No newline at end of file diff --git a/dist/brand/vaistudio_center.png b/dist/brand/vaistudio_center.png deleted file mode 100644 index 8ab6d3d5bb7b3ea8718087e8bdab5ebcd849f4bc..0000000000000000000000000000000000000000 --- a/dist/brand/vaistudio_center.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00d1a10cdcb4e150b51ae6636b9a06c4aa184c9ff72f2a65c84636dcde08b513 -size 656398 diff --git a/dist/catalogue/products.json b/dist/catalogue/products.json deleted file mode 100644 index a605a69c945e32d8246715ee98e44b51a5d5ce48..0000000000000000000000000000000000000000 --- a/dist/catalogue/products.json +++ /dev/null @@ -1 +0,0 @@ -[{"n":"CS30471 | Grob | Kệ Đựng Xoong Nồi Nan Vuông Inox Xước Mờ Sus304 - cánh/phủ bì 700mm, lọt lòng 664mm","l":"","i":"https://www.grobhcm.com/wp-content/uploads/2024/09/KE-CHEN-DIA-INOX-304-NAN-VUONG-GROB-800x533.jpg","p":"2.930.000đ","pn":2930000,"listPn":0,"salePn":2930000,"priceMode":"sale","c":"","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://www.grobhcm.com/wp-content/uploads/2024/09/KE-CHEN-DIA-INOX-304-NAN-VUONG-GROB-800x533.jpg"],"sum":"KỆ ĐỰNG XOONG NỒI NAN VUÔNG INOX XƯỚC MỜ SUS304","desc":"KỆ ĐỰNG XOONG NỒI NAN VUÔNG INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"664*500*250 mm","Khoang tủ":"700 mm","Kích thước cánh/phủ bì":"700 mm","Khoang tủ/chiều rộng tủ":"700 mm","Kích thước lọt lòng/thực tế phụ kiện":"700 mm","Quy cách (Rộng x Sâu x Cao)":"R664 * S500 * C250 mm","kich_thuoc":"664 x 500 x 250mm","khoang_tu":"700mm"},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"san-pham","_source":"avatar2-bulk-import","_added_at":"2026-10-17T04:24:42.738Z"},{"n":"Khay chia ngăn kéo nhựa cao cấp GTP0370","l":"https://garis.vn/khay-chia-nhua-cao-cap-gt03.html","i":"https://garis.vn/uploaded/Khay%20chia%20nh%E1%BB%B1a%20cao%20c%E1%BA%A5p%20GT03%20(3).jpg","p":"972.000đ","pn":972000,"listPn":0,"salePn":972000,"priceMode":"both","c":"Khay chia nhựa ABS cao cấp ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Khay%20chia%20nh%E1%BB%B1a%20cao%20c%E1%BA%A5p%20GT03%20(3).jpg"],"sum":"Khay chia nhựa cao cấp GT03 màu xám Dùng đặt trong ngăn kéo tủ bếp, để dao, thìa, dĩa và dụng cụ nhà bếp. Hàng Garis chính hãng, giá tốt nhất!","desc":"Khay chia nhựa cao cấp GT03 màu xám Dùng đặt trong ngăn kéo tủ bếp, để dao, thìa, dĩa và dụng cụ nhà bếp. Hàng Garis chính hãng, giá tốt nhất!","specs":{},"feats":[],"sku":"GTP0370","vid":"","mod":"GTP0370","brand":"Garis","slug":"gtp0370-khay-chia-ngan-keo-nhua-cao-cap-gtp0370","_source":"avatar2-add-product","_source_url":"https://garis.vn/khay-chia-nhua-cao-cap-gt03.html","_added_at":"2026-10-17T04:18:38.812Z"},{"n":"Giá bát đĩa, rổ nan dẹt, cánh kéo GD0260E","l":"https://garis.vn/gia-bat-dia-da-nang-gd02e.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%20%C4%91a%20n%C4%83ng%20GD02E%20(4).jpg","p":"3.326.400đ","pn":3326400,"listPn":0,"salePn":3326400,"priceMode":"both","c":"Giá bát đĩa đa năng","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%20%C4%91a%20n%C4%83ng%20GD02E%20(4).jpg"],"sum":"Giá bát đĩa đa năng GD02E tích hợp thiết kế đa năng, GD02E không chỉ giúp sắp xếp bát đĩa gọn gàng mà còn phù hợp để lưu trữ các vật dụng bếp khác như ly, chén, hoặc nồi nhỏ","desc":"Giá bát đĩa đa năng GD02E tích hợp thiết kế đa năng, GD02E không chỉ giúp sắp xếp bát đĩa gọn gàng mà còn phù hợp để lưu trữ các vật dụng bếp khác như ly, chén, hoặc nồi nhỏ","specs":{},"feats":[],"sku":"GD0260E","vid":"","mod":"GD0260E","brand":"Giá bát đĩa, rổ nan dẹt, cánh kéo GD0260E","slug":"gd0260e-gia-bat-dia-ro-nan-det-canh-keo-gd0260e","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-bat-dia-da-nang-gd02e.html","_added_at":"2026-10-17T04:18:34.767Z"},{"n":"Giá bát nâng hạ 800mm Euplus EV180","l":"https://grob-vn.com/san-pham/gia-bat-nang-ha-800mm-euplus-ev-i80/","i":"https://grob-vn.com/wp-content/uploads/2025/10/Gia-bat-nang-ha-Euplus.jpg","p":"8.013.000đ","pn":8013000,"listPn":0,"salePn":8013000,"priceMode":"both","c":"Giá bát nâng hạ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grob-vn.com/wp-content/uploads/2025/10/Gia-bat-nang-ha-Euplus.jpg"],"sum":"Giá bát nâng hạ 800mm Euplus EV.180 \nMÔ TẢ SẢN PHẨM \n+ Chất liệu : Inox SUS304, tiêu chuẩn Nhật Bản JIS G4305\n+ Kích thước : 765*300*650\n+  Màu sắc : Inox\n+ Tải trọng: 12kg (6kg/tầng)\n+ Bảo hành sản phẩm 24 tháng, bảo hành hoen gỉ 15 năm\nXem thêm: Phụ kiện bếp Euplus – Hotline: 0988 078 900 \nGiá bát đĩa nâng hạ Euplus nan vuông – Chất lượng đảm bảo – Không lo về giá!\nGiá bát đĩa nâng hạ Euplus  là dòng sản phẩm được đại đa số người tiêu dùng lựa chọn với thương hiệu đã được khẳng định trên thị trường, chi phí vô cùng hợp lý và dịch vụ bảo hành nhanh chóng, chuyên nghiệp.\nPhụ kiện bếp hiện đại  không chỉ mang lại cho bạn sự tiện lợi mà còn giúp “nâng tầm đẳng cấp” cho căn bếp nhà bạn.  Giá bát đĩa nâng hạ  là một trong Top 11 những phụ kiện tủ bếp thông minh được người tiêu dùng lựa chọn nhiều nhất cho tủ bếp gia đình.\nGiá bát đĩa nâng hạ Euplus nan vuông sẽ mang lại cho bạn những trải nghiệm tuyệt vời nhất trong chính căn bếp nhà mình bởi tính năng tiện dụng, thiết kế chắc chắn nhưng cũng không kém phần đẹp mắt; kèm theo đó còn có những chính sách khuyến mại và bảo hành hấp dẫn.\nThiết kế giá bát đĩa nâng hạ 2 tầng thông thoáng \nSản phẩm được thiết kế với 2 sàn đựng chuyên biệt. Sàn dưới thiết kế nan chữ V ngược úp đĩa gọn gàng, tiện lợi. Sàn trên thiết kế nan thông thoáng giúp việc úp bát dễ dàng hơn, không bị đọng nước hay ẩm ướt.\nChất liệu Inox 304 bền đẹp, trường tồn với thời gian \nGiá bát đĩa nâng hạ  Euplus nan vuông được làm từ chất liệu inox 304 theo tiêu chuẩn Nhật Bản JISG4303, khẳng định chất lượng bền bỉ, trường tồn với thời gian.\nCơ cấu giảm chấn thông minh \nBạn sẽ không còn lo lắng bát đĩa bị va chạm mỗi khi nâng lên hay hạ xuống. Cơ cấu giảm chấn luôn hoạt động một cách hiệu quả giúp bát đĩa luôn ổn định khi nâng hạ, sắp xếp.\n2 nút trợ lực thiết kế linh hoạt \nSản phẩm có tải trọng 12kg rất vững chãi và chắc chắn, bạn có thể điều chỉnh 2 nút ở hai bên của bộ cơ cấu để tăng mức trợ lực từ 5 – 12kg.\nKhay nhựa đựng nước và ngăn để đĩa tiện dụng \nSản phẩm được thiết kế bởi 2 khay đựng nước cho 2 tầng trên và dưới, giúp bát đĩa nhà bạn luôn khô ráo, sạch sẽ. Ngăn để bát đĩa được thiết kế bởi chất liệu Inox cao cấp cực bền bỉ, nỗi lo rỉ sét sẽ không còn tồn tại với các bà nội trợ.\nPhụ kiện nhập khẩu chính hãng \nEuplus  là nhãn hàng phụ kiện bếp nổi tiếng và lâu đời chuyên cung cấp các sản phẩm chất lượng với mức giá hợp lý.\nMột vài lưu ý khi sử dụng giá bát đĩa nâng hạ \nNên vệ sinh định kỳ để giữ được sản phẩm inox luôn trắng sáng và kéo dài thời gian sử dụng cho sản phẩm.\nNên vệ sinh lau chùi bề mặt inox bằng những sản phẩm tẩy rửa chuyên dụng để tránh sự ăn mòn gây tổn hại đến bề mặt inox.\nKhông nên để nhiều bát đĩa bị quá so với trọng lượng tối đa của giá bát.","desc":"Giá bát nâng hạ 800mm Euplus EV.180 \nMÔ TẢ SẢN PHẨM \n+ Chất liệu : Inox SUS304, tiêu chuẩn Nhật Bản JIS G4305\n+ Kích thước : 765*300*650\n+  Màu sắc : Inox\n+ Tải trọng: 12kg (6kg/tầng)\n+ Bảo hành sản phẩm 24 tháng, bảo hành hoen gỉ 15 năm\nXem thêm: Phụ kiện bếp Euplus – Hotline: 0988 078 900 \nGiá bát đĩa nâng hạ Euplus nan vuông – Chất lượng đảm bảo – Không lo về giá!\nGiá bát đĩa nâng hạ Euplus  là dòng sản phẩm được đại đa số người tiêu dùng lựa chọn với thương hiệu đã được khẳng định trên thị trường, chi phí vô cùng hợp lý và dịch vụ bảo hành nhanh chóng, chuyên nghiệp.\nPhụ kiện bếp hiện đại  không chỉ mang lại cho bạn sự tiện lợi mà còn giúp “nâng tầm đẳng cấp” cho căn bếp nhà bạn.  Giá bát đĩa nâng hạ  là một trong Top 11 những phụ kiện tủ bếp thông minh được người tiêu dùng lựa chọn nhiều nhất cho tủ bếp gia đình.\nGiá bát đĩa nâng hạ Euplus nan vuông sẽ mang lại cho bạn những trải nghiệm tuyệt vời nhất trong chính căn bếp nhà mình bởi tính năng tiện dụng, thiết kế chắc chắn nhưng cũng không kém phần đẹp mắt; kèm theo đó còn có những chính sách khuyến mại và bảo hành hấp dẫn.\nThiết kế giá bát đĩa nâng hạ 2 tầng thông thoáng \nSản phẩm được thiết kế với 2 sàn đựng chuyên biệt. Sàn dưới thiết kế nan chữ V ngược úp đĩa gọn gàng, tiện lợi. Sàn trên thiết kế nan thông thoáng giúp việc úp bát dễ dàng hơn, không bị đọng nước hay ẩm ướt.\nChất liệu Inox 304 bền đẹp, trường tồn với thời gian \nGiá bát đĩa nâng hạ  Euplus nan vuông được làm từ chất liệu inox 304 theo tiêu chuẩn Nhật Bản JISG4303, khẳng định chất lượng bền bỉ, trường tồn với thời gian.\nCơ cấu giảm chấn thông minh \nBạn sẽ không còn lo lắng bát đĩa bị va chạm mỗi khi nâng lên hay hạ xuống. Cơ cấu giảm chấn luôn hoạt động một cách hiệu quả giúp bát đĩa luôn ổn định khi nâng hạ, sắp xếp.\n2 nút trợ lực thiết kế linh hoạt \nSản phẩm có tải trọng 12kg rất vững chãi và chắc chắn, bạn có thể điều chỉnh 2 nút ở hai bên của bộ cơ cấu để tăng mức trợ lực từ 5 – 12kg.\nKhay nhựa đựng nước và ngăn để đĩa tiện dụng \nSản phẩm được thiết kế bởi 2 khay đựng nước cho 2 tầng trên và dưới, giúp bát đĩa nhà bạn luôn khô ráo, sạch sẽ. Ngăn để bát đĩa được thiết kế bởi chất liệu Inox cao cấp cực bền bỉ, nỗi lo rỉ sét sẽ không còn tồn tại với các bà nội trợ.\nPhụ kiện nhập khẩu chính hãng \nEuplus  là nhãn hàng phụ kiện bếp nổi tiếng và lâu đời chuyên cung cấp các sản phẩm chất lượng với mức giá hợp lý.\nMột vài lưu ý khi sử dụng giá bát đĩa nâng hạ \nNên vệ sinh định kỳ để giữ được sản phẩm inox luôn trắng sáng và kéo dài thời gian sử dụng cho sản phẩm.\nNên vệ sinh lau chùi bề mặt inox bằng những sản phẩm tẩy rửa chuyên dụng để tránh sự ăn mòn gây tổn hại đến bề mặt inox.\nKhông nên để nhiều bát đĩa bị quá so với trọng lượng tối đa của giá bát.","specs":{"Chất liệu":"Inox SUS304, tiêu chuẩn Nhật Bản JIS G4305","Kích thước":"765*300*650","Màu sắc":"Inox","Tải trọng":"12kg (6kg/tầng)"},"feats":["Giá bát đĩa nâng hạ Euplus nan vuông được làm từ chất liệu inox 304 theo tiêu chuẩn Nhật Bản JISG4303, khẳng định chất lượng bền bỉ, trường tồn với thời gian.","Sản phẩm có tải trọng 12kg rất vững chãi và chắc chắn, bạn có thể điều chỉnh 2 nút ở hai bên của bộ cơ cấu để tăng mức trợ lực từ 5 – 12kg."],"sku":"EV180","vid":"","mod":"EV180","brand":"Euplus","slug":"ev180-gia-bat-nang-ha-800mm-euplus-ev180","_source":"avatar2-add-product","_source_url":"https://grob-vn.com/san-pham/gia-bat-nang-ha-800mm-euplus-ev-i80/","_added_at":"2026-10-17T04:18:14.374Z"},{"n":"Giá Bát Đĩa Đa Năng Euplus Inox 304, Nan Vuông EV80","l":"https://euplus.com.vn/gia-bat-dia-da-nang-euplus-ev80-inox-304-nan-vuong/","i":"https://euplus.com.vn/wp-content/uploads/2021/03/BAT-DA-NANG-1.jpg","p":"2.937.000đ","pn":2937000,"listPn":0,"salePn":2937000,"priceMode":"both","c":"Giá Để Xoong Nồi Chén Dĩa","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://euplus.com.vn/wp-content/uploads/2021/03/BAT-DA-NANG-1.jpg"],"sum":"Nội dung chính\nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở Đặc điểm nổi bật : \nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở\nGiá bát đĩa đa năng Euplus EV Inox 304 xước mờ cánh mở nan vuông  là  Phụ kiện tủ bế p  được nhập khẩu chính hãng từ thương hiệu nổi tiếng Euplus. Thiết kế của sản phẩm tuy đơn giản nhưng rất sang trọng và hiện đại, nổi bật với các thanh inox sáng bóng không tì vết.\nĐặc điểm nổi bật :\nChất liệu làm bằng inox nan theo tiêu chuẩn Nhật Bản JIS G4303 cao cấp chống gỉ bền bỉ theo thời gian.\nSàn để úp bát đĩa tiện dụng, có thể dùng đề đồ khô và các vật dụng khác trong không gian bếp\nCó khay hứng nước để khi úp trực tiếp xoong nồi ướt nước không bị rây ra ngoài, khay hứng nước được tháo lắp dễ dàng.\nTích hợp bộ ray giảm chấn có tác dụng đóng mở nhẹ nhàng, không gây tiếng ồn.","desc":"Nội dung chính\nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở Đặc điểm nổi bật : \nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở\nGiá bát đĩa đa năng Euplus EV Inox 304 xước mờ cánh mở nan vuông  là  Phụ kiện tủ bế p  được nhập khẩu chính hãng từ thương hiệu nổi tiếng Euplus. Thiết kế của sản phẩm tuy đơn giản nhưng rất sang trọng và hiện đại, nổi bật với các thanh inox sáng bóng không tì vết.\nĐặc điểm nổi bật :\nChất liệu làm bằng inox nan theo tiêu chuẩn Nhật Bản JIS G4303 cao cấp chống gỉ bền bỉ theo thời gian.\nSàn để úp bát đĩa tiện dụng, có thể dùng đề đồ khô và các vật dụng khác trong không gian bếp\nCó khay hứng nước để khi úp trực tiếp xoong nồi ướt nước không bị rây ra ngoài, khay hứng nước được tháo lắp dễ dàng.\nTích hợp bộ ray giảm chấn có tác dụng đóng mở nhẹ nhàng, không gây tiếng ồn.","specs":{"Bảo hành":"20 năm rỉ rổ và bảo hành khác 2 năm","Thương hiệu":"EUPLUS","Xuất xứ":"Việt Nam","Kích thước":"800mm"},"feats":["Thông số kỹ thuật","Đánh giá (0)","Giá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở Đặc điểm nổi bật :","Chất liệu làm bằng inox nan theo tiêu chuẩn Nhật Bản JIS G4303 cao cấp chống gỉ bền bỉ theo thời gian.","Sàn để úp bát đĩa tiện dụng, có thể dùng đề đồ khô và các vật dụng khác trong không gian bếp","Có khay hứng nước để khi úp trực tiếp xoong nồi ướt nước không bị rây ra ngoài, khay hứng nước được tháo lắp dễ dàng.","Tích hợp bộ ray giảm chấn có tác dụng đóng mở nhẹ nhàng, không gây tiếng ồn."],"sku":"EV80","vid":"","mod":"EV80","brand":"EUPLUS","slug":"ev80-gia-bat-dia-da-nang-euplus-inox-304-nan-vuong-ev80","_source":"avatar2-add-product","_source_url":"https://euplus.com.vn/gia-bat-dia-da-nang-euplus-ev80-inox-304-nan-vuong/","_added_at":"2026-10-17T04:18:08.785Z"},{"n":"Giá gia vị, chai lọ, rổ nan dẹt, cánh kéo GKE225","l":"https://garis.vn/gia-gia-vi-chai-lo-gk02-25e-new.html?srsltid=AU7gw4We5Dd2JvtvXEV1w7N-jCSaO5si1kA9RBWlBZ2Nx7j80GG5_y7x","i":"https://garis.vn/uploaded/GK02_25E%201.jpg","p":"3.942.000đ","pn":3942000,"listPn":0,"salePn":3942000,"priceMode":"both","c":"Giá gia vị, chai lọ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/GK02_25E%201.jpg"],"sum":"Giá gia vị, chai lọ GK02.30E (new) thiết kế thông minh, tiện ích, chất liệu cao cấp, giúp sắp xếp gọn gàng, tối ưu không gian bếp hiện đại.","desc":"Giá gia vị, chai lọ GK02.30E (new) thiết kế thông minh, tiện ích, chất liệu cao cấp, giúp sắp xếp gọn gàng, tối ưu không gian bếp hiện đại.","specs":{},"feats":[],"sku":"GKE225001","vid":"","mod":"GKE225001","brand":"Garis","slug":"gke225001-gia-gia-vi-chai-lo-ro-nan-det-canh-keo-gke225","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-gia-vi-chai-lo-gk02-25e-new.html?srsltid=AU7gw4We5Dd2JvtvXEV1w7N-jCSaO5si1kA9RBWlBZ2Nx7j80GG5_y7x","_added_at":"2026-10-17T04:18:05.632Z"},{"n":"Giá dao thớt, gia vị, chai lọ, rổ nan dẹt cánh kéo GME230","l":"https://garis.vn/gia-dao-thot-chai-lo-gm02-30e.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20dao%20th%E1%BB%9Bt%2C%20chai%20l%E1%BB%8D%20GM02%2030E%20(3).jpg","p":"3.996.000đ","pn":3996000,"listPn":0,"salePn":3996000,"priceMode":"both","c":"Giá dao thớt, gia vị, chai lọ, rổ nan dẹt, cánh kéo","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20dao%20th%E1%BB%9Bt%2C%20chai%20l%E1%BB%8D%20GM02%2030E%20(3).jpg"],"sum":"Giá dao thớt, chai lọ GM02.30E Nan dẹt, inox 304, bề mặt điện hóa xước mờ, dùng cho cánh kéo, ray giảm chấn hiệu quả, bền bỉ và sang trọng. Mua hàng chính hãng tại Garis Việt Nam!","desc":"Giá dao thớt, chai lọ GM02.30E Nan dẹt, inox 304, bề mặt điện hóa xước mờ, dùng cho cánh kéo, ray giảm chấn hiệu quả, bền bỉ và sang trọng. Mua hàng chính hãng tại Garis Việt Nam!","specs":{},"feats":["Giá dao thớt, chai lọ có hệ thống bắt mặt cánh tủ dạng 3D duy nhất trên thị trường. Điều này mang lại sự ổn định và độ chắc chắn cho giá dao thớt, chai lọ khi sử dụng.","Giá dao thớt, chai lọ đi kèm với rổ phụ gia vị có thể nhấc ra dễ dàng. Điều này giúp tiện lợi trong việc lấy và sắp xếp các chai lọ và phụ gia vị."],"sku":"GM0230E","vid":"","mod":"GM0230E","brand":"Garis","slug":"gm0230e-gia-dao-thot-gia-vi-chai-lo-ro-nan-det-canh-keo-gme230","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-dao-thot-chai-lo-gm02-30e.html","_added_at":"2026-10-17T04:18:03.036Z"},{"n":"Hệ khay chia thìa đũa độc lập GT0370AG","l":"https://garis.vn/he-khay-chia-thia-dua-doc-lap-gt03ag.html","i":"https://garis.vn/uploaded/GT03_6AG%20(1).jpg","p":"4.201.200đ","pn":4201200,"listPn":0,"salePn":4201200,"priceMode":"both","c":"Hệ khay chia thìa đũa độc lập GTAG3","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/GT03_6AG%20(1).jpg"],"sum":"Thanh chia có thể tháo rời, chỉnh khoảng cách linh hoạt Khung bằng nhôm hàng không AA (Aviation Aluminium) Đáy có tấm chống trơn trượt Tải trọng 25kg Bảo hành 24 tháng, bảo hành gì 20 năm","desc":"Thanh chia có thể tháo rời, chỉnh khoảng cách linh hoạt Khung bằng nhôm hàng không AA (Aviation Aluminium) Đáy có tấm chống trơn trượt Tải trọng 25kg Bảo hành 24 tháng, bảo hành gì 20 năm","specs":{},"feats":[],"sku":"GT0370AG","vid":"","mod":"GT0370AG","brand":"Garis","slug":"gt0370ag-he-khay-chia-thia-dua-doc-lap-gt0370ag","_source":"avatar2-add-product","_source_url":"https://garis.vn/he-khay-chia-thia-dua-doc-lap-gt03ag.html","_added_at":"2026-10-17T04:17:59.609Z"},{"n":"Giá xoong nồi + bát đĩa, rổ nan oval, cánh mở hoặc kéo GD0470N","l":"https://garis.vn/gia-xoong-noi-bat-dia-md04n.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%2C%20b%C3%A1t%20%C4%91%C4%A9a%20MD04N%20(1).jpg","p":"3.985.200đ","pn":3985200,"listPn":0,"salePn":3985200,"priceMode":"both","c":"Giá xoong nồi + bát đĩa, rổ nan oval, cánh mở hoặc kéo GDN4","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%2C%20b%C3%A1t%20%C4%91%C4%A9a%20MD04N%20(1).jpg"],"sum":"Thiết kế thông minh với nhiều ngăn chứa rộng rãi, phù hợp với nhiều loại xoong nồi, bát đĩa khác nhau. MD04N không chỉ mang đến sự tiện lợi tối ưu mà còn góp phần tăng tính thẩm mỹ cho căn bếp hiện đại.","desc":"Thiết kế thông minh với nhiều ngăn chứa rộng rãi, phù hợp với nhiều loại xoong nồi, bát đĩa khác nhau. MD04N không chỉ mang đến sự tiện lợi tối ưu mà còn góp phần tăng tính thẩm mỹ cho căn bếp hiện đại.","specs":{},"feats":[],"sku":"GD0470N","vid":"","mod":"GD0470N","brand":"Garis","slug":"gd0470n-gia-xoong-noi-bat-dia-ro-nan-oval-canh-mo-hoac-keo-gd0470n","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-xoong-noi-bat-dia-md04n.html","_added_at":"2026-10-17T04:17:56.919Z"},{"n":"Giá bát đĩa, thìa đũa vách hộp, rổ nan oval, cánh kéo MDV0260","l":"https://garis.vn/gia-bat-dia-thia-dua-vach-hop-md02v.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%2C%20th%C3%ACa%20%C4%91%C5%A9a%20v%C3%A1ch%20h%E1%BB%99p%20MD02V%20(3).jpg","p":"6.685.200đ","pn":6685200,"listPn":0,"salePn":6685200,"priceMode":"both","c":"Giá bát đĩa, thìa đũa vách hộp MDV2 màu Titan chính hãng","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%2C%20th%C3%ACa%20%C4%91%C5%A9a%20v%C3%A1ch%20h%E1%BB%99p%20MD02V%20(3).jpg"],"sum":"Thiết kế vách hộp tiện lợi, giúp phân chia không gian lưu trữ hiệu quả, phù hợp với mọi không gian bếp. MD02V mang đến sự tiện nghi và tính thẩm mỹ cao cho căn bếp của bạn.","desc":"Thiết kế vách hộp tiện lợi, giúp phân chia không gian lưu trữ hiệu quả, phù hợp với mọi không gian bếp. MD02V mang đến sự tiện nghi và tính thẩm mỹ cao cho căn bếp của bạn.","specs":{},"feats":[],"sku":"MDV0260","vid":"","mod":"MDV0260","brand":"Garis","slug":"mdv0260-gia-bat-dia-thia-dua-vach-hop-ro-nan-oval-canh-keo-mdv0260","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-bat-dia-thia-dua-vach-hop-md02v.html","_added_at":"2026-10-17T04:17:36.542Z"},{"n":"Giá xoong nồi vách hộp, rổ nan oval, cánh kéo MPV0260","l":"https://garis.vn/gia-xoong-noi-vach-hop-mp02v.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%20v%C3%A1ch%20h%E1%BB%99p%20MP02V%20(1).jpg","p":"6.145.200đ","pn":6145200,"listPn":0,"salePn":6145200,"priceMode":"both","c":"Giá xoong nồi vách hộp MPV2 cánh kéo màu Titan MV Series","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%20v%C3%A1ch%20h%E1%BB%99p%20MP02V%20(1).jpg"],"sum":"Với thiết kế vách hộp thông minh, giúp phân chia không gian lưu trữ hiệu quả, MP02V giúp tiết kiệm diện tích bếp, đồng thời giữ cho các dụng cụ bếp luôn trong tầm tay khi cần sử dụng","desc":"Với thiết kế vách hộp thông minh, giúp phân chia không gian lưu trữ hiệu quả, MP02V giúp tiết kiệm diện tích bếp, đồng thời giữ cho các dụng cụ bếp luôn trong tầm tay khi cần sử dụng","specs":{},"feats":[],"sku":"MPV0260","vid":"","mod":"MPV0260","brand":"Garis","slug":"mpv0260-gia-xoong-noi-vach-hop-ro-nan-oval-canh-keo-mpv0260","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-xoong-noi-vach-hop-mp02v.html","_added_at":"2026-10-17T04:17:33.673Z"},{"n":"Bếp Từ Canzy CZTL869IMAX","l":"https://khobep.vn/bep-tu-canzy-cz-tl869imax","i":"https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","p":"Giá niêm yết: 14.980.000đ — Giá KM: 6.200.000đ","pn":6200000,"listPn":14980000,"salePn":6200000,"priceMode":"both","c":"Bếp Từ Canzy CZ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742205457-be482ddf736ace36ea7308fe3a2b6806.jpg","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742322070-a36944508c279d6b99c2ae58d77621bd.jpg","https://bizweb.dktcdn.net/100/344/152/products/1-4dfb6f78-f7ff-4322-b4fb-70815e12b95f.png","https://bizweb.dktcdn.net/100/344/152/products/2-59f34d91-4f3f-4477-a43b-2cac5dae561a.png"],"sum":"BẾP TỪ ĐÔI CANZY CZ TL869I MAX Canzy CZ TL869I MAX là dòng bếp từ đôi cao cấp hội tụ những tính năng hiện đại nhất, mang lại trải nghiệm nấu nướng an toàn, nhanh chóng và cực kỳ tiết kiệm điện năng cho gia đình bạn. ĐẶC ĐIỂM NỔI BẬT VỀ THIẾT KẾ Mặt kính Kanger vát cạnh tinh tế: Được bo viền nhôm 4 cạnh chắc chắn, vừa t","desc":"BẾP TỪ ĐÔI CANZY CZ TL869I MAX Canzy CZ TL869I MAX là dòng bếp từ đôi cao cấp hội tụ những tính năng hiện đại nhất, mang lại trải nghiệm nấu nướng an toàn, nhanh chóng và cực kỳ tiết kiệm điện năng cho gia đình bạn. ĐẶC ĐIỂM NỔI BẬT VỀ THIẾT KẾ Mặt kính Kanger vát cạnh tinh tế: Được bo viền nhôm 4 cạnh chắc chắn, vừa t","specs":{},"feats":[],"sku":"TL869IMAX","vid":"","mod":"TL869IMAX","brand":"Canzy","slug":"tl869imax-bep-tu-canzy-cztl869imax","_source":"avatar2-add-product","_source_url":"https://khobep.vn/bep-tu-canzy-cz-tl869imax","_added_at":"2026-10-19T06:23:59.773Z"},{"n":"Máy rửa bát độc lập Bosch SMS6ZCI16E serie 6","l":"https://bosch-house.com.vn/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6/?gad_source=1&gad_campaignid=22675708288&gbraid=0AAAAACJJNAhi1J59JZUupQPYnQt3j8jgI&gclid=CjwKCAjw25fWBhAVEiwAMopNjjt1tlze2nw3H4h06t2S5Jn34Ct9-EK5k8FQSeJtEYb9ApMh4A2IqhoC0h8QAvD_BwE","i":"https://b1.congngheviet.com.vn/file/s3-vn01/bosch-house-com-vn/wp-content/uploads/2024/01/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6.jpg","p":"Giá niêm yết: 28.790.000đ — Giá KM: 19.200.000đ","pn":19200000,"listPn":28790000,"salePn":19200000,"priceMode":"both","c":"Máy rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://b1.congngheviet.com.vn/file/s3-vn01/bosch-house-com-vn/wp-content/uploads/2024/01/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6.jpg"],"sum":"Máy rửa bát Bosch SMS6ZCI16E có xuất xứ từ Châu Âu được trang bị nhiều công nghệ hiện đại như Sấy Zeolith – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo…, mang đến cho người dùng những trải nghiệm hoàn toàn mới.\nĐặc điểm nổi bật của máy rửa bát Bosch SMS6ZCI16E \nThiết kế độc lập linh hoạt vị trí lắp đặt (có thể đặt âm). Máy được làm từ chất liệu thép không gỉ, bề mặt màu inox có lớp phủ chống bám vân tay. Tổng thể của chiếc máy giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn.\nBảng điều khiển đặt ở phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng.\nHệ thống phân phối viên rửa dosing assistant thông minh\nTự vệ sinh: tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo.\nẢnh thực tế của máy rửa bát độc lập Bosch SMS6ZCI16E serie 6 \nHệ thống khay rửa  \nHệ thống giàn rửa gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn.\nNgăn kéo VarioDrawer để đựng các đồ dùng nhỏ như đũa, thìa, dĩa…  Đồng thời giúp giải phóng và tăng diện tích chứa cho ngăn dưới cùng.\nHệ thống Rackmatic điều chỉnh chiều cao giàn rửa theo nhu cầu. Bạn có thể dễ dàng thay đổi vị trí độ cao giàn rửa thông qua khớp nâng hạ, ngay cả khi giàn chứa đang đầy.\nHệ thống vòi phun Extra Clean Zone: giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa.\nChương trình rửa  \n8 chương trình rửa: \nRửa Eco 50°C\nRửa tự động 45-65°C\nRửa thông minh (Intelligent)\nRửa chuyên sâu 70°C\nRửa nhanh 60°C (Express)\nRửa ly 40°C (Glass)\nRửa yên tĩnh 50°C\nRửa tráng (Favorite)\nBảng điều khiển của máy rửa bát độc lập Bosch SMS6ZCI16E  \nChương trình rửa đặc biệt \nTăng tốc độ rửa (SpeedPerfect Plus)\nRửa chuyên sâu (IntensiveZone)\nSấy tăng cường (Extra Dry)\nCông nghệ và cảm biến  \nExtra Dry (sấy tăng cường ): tăng nhiệt độ nước ở lần tráng cuối cùng và kéo dài thời gian sấy khô hơn. Đồng thời, các hạt nước đọng trên bát đĩa sẽ bốc hơi, ngưng tụ và rơi xuống đáy máy\nIntensiveZone (vùng rửa chuyên sâu) : được kích hoạt để tăng áp suất phun kết hợp nhiệt độ cao để rửa sạch hoàn toàn các vết bẩn cứng đầu, bám lâu ngày trên những vật dụng ở giàn dưới cùng.\nZeolith (công nghệ sấy Zeolith) : hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm giúp  bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn\nCông nghệ rửa thông minh , tối ưu quá trình rửa: máy sẽ tự động điều chỉnh các cài đặt và cung cấp một số lựa chọn thay thế cho người dùng\nHome Connect : giúp bạn dễ dàng điều khiển máy rửa bát mà không cần lại gần máy: lượng tiêu thụ điện nước và chất tẩy rửa, hoạt động của máy rửa bát\nCảm biến nước và cảm biến tải giúp tiết kiệm điện năng mà vẫn đảm bảo rửa sạch sẽ bát đũa\nĐộng cơ không chổi than hoạt động bền bỉ, tiếng ồn nhỏ không làm ảnh hưởng đến sinh hoạt của các thành viên khác trong gia đình\nHệ thống làm sạch sâu của máy rửa bát độc lập Bosch SMS6ZCI16E  \nHoạt động và tiêu thụ năng lượng  \nNhãn năng lượng: B\nĐiện / nước: 65 kWh / 9 liters\nThời gian Eco: 3h35′\nĐộ ồn: 40 dB\nNhãn độ ồn: B\nĐộ ồn yên lượng: 39 dB\nTính năng an toàn  \nKhóa trẻ em (ChildLock) : là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển.\nHệ thống AquaStop : là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài.\nHệ thống chống sét lan truyền : là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan.\nThông số kỹ kỹ thuật","desc":"Máy rửa bát Bosch SMS6ZCI16E có xuất xứ từ Châu Âu được trang bị nhiều công nghệ hiện đại như Sấy Zeolith – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo…, mang đến cho người dùng những trải nghiệm hoàn toàn mới.\nĐặc điểm nổi bật của máy rửa bát Bosch SMS6ZCI16E \nThiết kế độc lập linh hoạt vị trí lắp đặt (có thể đặt âm). Máy được làm từ chất liệu thép không gỉ, bề mặt màu inox có lớp phủ chống bám vân tay. Tổng thể của chiếc máy giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn.\nBảng điều khiển đặt ở phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng.\nHệ thống phân phối viên rửa dosing assistant thông minh\nTự vệ sinh: tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo.\nẢnh thực tế của máy rửa bát độc lập Bosch SMS6ZCI16E serie 6 \nHệ thống khay rửa  \nHệ thống giàn rửa gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn.\nNgăn kéo VarioDrawer để đựng các đồ dùng nhỏ như đũa, thìa, dĩa…  Đồng thời giúp giải phóng và tăng diện tích chứa cho ngăn dưới cùng.\nHệ thống Rackmatic điều chỉnh chiều cao giàn rửa theo nhu cầu. Bạn có thể dễ dàng thay đổi vị trí độ cao giàn rửa thông qua khớp nâng hạ, ngay cả khi giàn chứa đang đầy.\nHệ thống vòi phun Extra Clean Zone: giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa.\nChương trình rửa  \n8 chương trình rửa: \nRửa Eco 50°C\nRửa tự động 45-65°C\nRửa thông minh (Intelligent)\nRửa chuyên sâu 70°C\nRửa nhanh 60°C (Express)\nRửa ly 40°C (Glass)\nRửa yên tĩnh 50°C\nRửa tráng (Favorite)\nBảng điều khiển của máy rửa bát độc lập Bosch SMS6ZCI16E  \nChương trình rửa đặc biệt \nTăng tốc độ rửa (SpeedPerfect Plus)\nRửa chuyên sâu (IntensiveZone)\nSấy tăng cường (Extra Dry)\nCông nghệ và cảm biến  \nExtra Dry (sấy tăng cường ): tăng nhiệt độ nước ở lần tráng cuối cùng và kéo dài thời gian sấy khô hơn. Đồng thời, các hạt nước đọng trên bát đĩa sẽ bốc hơi, ngưng tụ và rơi xuống đáy máy\nIntensiveZone (vùng rửa chuyên sâu) : được kích hoạt để tăng áp suất phun kết hợp nhiệt độ cao để rửa sạch hoàn toàn các vết bẩn cứng đầu, bám lâu ngày trên những vật dụng ở giàn dưới cùng.\nZeolith (công nghệ sấy Zeolith) : hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm giúp  bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn\nCông nghệ rửa thông minh , tối ưu quá trình rửa: máy sẽ tự động điều chỉnh các cài đặt và cung cấp một số lựa chọn thay thế cho người dùng\nHome Connect : giúp bạn dễ dàng điều khiển máy rửa bát mà không cần lại gần máy: lượng tiêu thụ điện nước và chất tẩy rửa, hoạt động của máy rửa bát\nCảm biến nước và cảm biến tải giúp tiết kiệm điện năng mà vẫn đảm bảo rửa sạch sẽ bát đũa\nĐộng cơ không chổi than hoạt động bền bỉ, tiếng ồn nhỏ không làm ảnh hưởng đến sinh hoạt của các thành viên khác trong gia đình\nHệ thống làm sạch sâu của máy rửa bát độc lập Bosch SMS6ZCI16E  \nHoạt động và tiêu thụ năng lượng  \nNhãn năng lượng: B\nĐiện / nước: 65 kWh / 9 liters\nThời gian Eco: 3h35′\nĐộ ồn: 40 dB\nNhãn độ ồn: B\nĐộ ồn yên lượng: 39 dB\nTính năng an toàn  \nKhóa trẻ em (ChildLock) : là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển.\nHệ thống AquaStop : là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài.\nHệ thống chống sét lan truyền : là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan.\nThông số kỹ kỹ thuật","specs":{"Rất phù hợp với các loại món ăn":"Bình sữa trẻ em, Chảo nướng, Bát đĩa nửa tải, Nồi và chảo lớn, Hộp nhựa, Ly uống rượu (23cm)","Chiếu sáng nội thất":"Có","Chương trình giặt":"Chu kỳ tự động, tiết kiệm, chuyên sâu, ngắn, im lặng","Chức năng nửa tải":"–","Cảm biến tải":"–","Chức năng chu kỳ rút ngắn":"Có","Chiếu sàn":"KHÔNG","Giá đỡ dưới có chức năng nâng":"–","Phát hiện chất tẩy rửa":"Co","Nạp chất tẩy rửa máy rửa chén tự động":"–","Chỉ báo nạp muối":"Có","Chỉ báo nạp nước trợ xả":"Có","Tín hiệu kết thúc chu kỳ":"Có","Loại tín hiệu kết thúc chu kỳ":"Quang học","Khóa an toàn trẻ em":"Có","Chất lượng giặt":"Cao cấp","Số nhiệt độ làm sạch":"6","Nhiệt độ làm sạch tối đa":"70°C","Phương pháp sấy":"Zeolit ​​(bát khô thêm)","Vùng chuyên sâu":"Nhanh","Điều khiển qua ứng dụng":"Có","Điều khiển máy sấy qua ứng dụng":"Vận hành từ xa, Đọc thông tin qua ứng dụng","Bắt đầu trì hoãn":"Có","Bắt đầu phân chia độ trễ":"1 – 24 giờ","Tùy chọn tắt tự động":"Có","Ngôn ngữ bảng điều khiển":"Tiếng Anh, Ký hiệu","Nhãn năng lượng":"B","Chi phí năng lượng hàng năm":"72,8 euro","Tiêu thụ năng lượng hàng năm":"182 kWh","Tiêu thụ năng lượng trên mỗi chu kỳ":"0,65 kWh","Chức năng tiết kiệm năng lượng":"Tự động tắt, Chu trình tiết kiệm năng lượng, Cấp nước nóng, Lượng nước sử dụng được xác định theo mức độ bẩn","Thời lượng chu kỳ sinh thái":"215 phút","Chi phí nước hàng năm":"3,43 euro","Lượng nước sử dụng hàng năm":"2520 lít","Lượng nước sử dụng mỗi chu kỳ":"9 lít","Thân thiện với môi trường":"Đúng","Xây dựng chất lượng":"Cao cấp","Số lượng vòi phun tay phun":"2","Loại động cơ":"Biến tần","Chất liệu nội thất":"Thép không gỉ","Đầu nối nước":"Nước lạnh và nước ấm","Bảo vệ rò rỉ":"Có","Loại bảo vệ rò rỉ":"Cảm biến rò rỉ đáy, Bảo vệ chống tràn, Ống an toàn","Ống đầu vào có thể tháo rời":"–","Ống thoát nước có thể tháo rời":"–","Chiều dài ống đầu vào":"1,65 m","Loại nguồn điện":"Mạng lưới điện","Nguồn điện tối thiểu":"2400W"},"feats":["Bảng điều khiển đặt ở phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng.","Hệ thống phân phối viên rửa dosing assistant thông minh","Tự vệ sinh: tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo.","Ngăn kéo VarioDrawer để đựng các đồ dùng nhỏ như đũa, thìa, dĩa… Đồng thời giúp giải phóng và tăng diện tích chứa cho ngăn dưới cùng.","Hệ thống Rackmatic điều chỉnh chiều cao giàn rửa theo nhu cầu. Bạn có thể dễ dàng thay đổi vị trí độ cao giàn rửa thông qua khớp nâng hạ, ngay cả khi giàn chứa đang đầy."],"sku":"SMS6ZCI16E","vid":"","mod":"SMS6ZCI16E","brand":"Bosch","slug":"sms6zci16e-may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6","_source":"avatar2-add-product","_source_url":"https://bosch-house.com.vn/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6/?gad_source=1&gad_campaignid=22675708288&gbraid=0AAAAACJJNAhi1J59JZUupQPYnQt3j8jgI&gclid=CjwKCAjw25fWBhAVEiwAMopNjjt1tlze2nw3H4h06t2S5Jn34Ct9-EK5k8FQSeJtEYb9ApMh4A2IqhoC0h8QAvD_BwE","_added_at":"2026-10-19T06:24:05.655Z"},{"n":"Bếp Từ Canzy CZ","l":"https://khobep.vn/bep-tu-canzy-cz-tl869imax","i":"https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","p":"Giá niêm yết: 14.980.000đ — Giá KM: 6.200.000đ","pn":6200000,"listPn":14980000,"salePn":6200000,"priceMode":"both","c":"Bếp Từ Canzy CZ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742205457-be482ddf736ace36ea7308fe3a2b6806.jpg","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742322070-a36944508c279d6b99c2ae58d77621bd.jpg","https://bizweb.dktcdn.net/100/344/152/products/1-4dfb6f78-f7ff-4322-b4fb-70815e12b95f.png","https://bizweb.dktcdn.net/100/344/152/products/2-59f34d91-4f3f-4477-a43b-2cac5dae561a.png"],"sum":"BẾP TỪ ĐÔI CANZY CZ TL869I MAX Canzy CZ TL869I MAX là dòng bếp từ đôi cao cấp hội tụ những tính năng hiện đại nhất, mang lại trải nghiệm nấu nướng an toàn, nhanh chóng và cực kỳ tiết kiệm điện năng cho gia đình bạn. ĐẶC ĐIỂM NỔI BẬT VỀ THIẾT KẾ Mặt kính Kanger vát cạnh tinh tế: Được bo viền nhôm 4 cạnh chắc chắn, vừa t","desc":"BẾP TỪ ĐÔI CANZY CZ TL869I MAX Canzy CZ TL869I MAX là dòng bếp từ đôi cao cấp hội tụ những tính năng hiện đại nhất, mang lại trải nghiệm nấu nướng an toàn, nhanh chóng và cực kỳ tiết kiệm điện năng cho gia đình bạn. ĐẶC ĐIỂM NỔI BẬT VỀ THIẾT KẾ Mặt kính Kanger vát cạnh tinh tế: Được bo viền nhôm 4 cạnh chắc chắn, vừa t","specs":{},"feats":[],"sku":"TL869IMAX","vid":"","mod":"TL869IMAX","brand":"Canzy","slug":"tl869imax-bep-tu-canzy-cz","_source":"avatar2-add-product","_source_url":"https://khobep.vn/bep-tu-canzy-cz-tl869imax","_added_at":"2026-10-10T09:53:51.600Z"},{"n":"Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 Chính Hãng","l":"https://vattutonghopgiasi.com/voi-boss-co-dinh-co-tron-xoay-360-do-bv101/","i":"https://vattutonghopgiasi.com/wp-content/uploads/2026/07/voi-boss-co-dinh-co-tron-xoay-360-do-bv101-2.jpg","p":"1.740.000đ","pn":1740000,"listPn":0,"salePn":1740000,"priceMode":"both","c":"Chậu rửa, Vòi rửa","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://vattutonghopgiasi.com/wp-content/uploads/2026/07/voi-boss-co-dinh-co-tron-xoay-360-do-bv101-2.jpg"],"sum":"Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 là một thiết bị nhà bếp tối giản nhưng sở hữu hiệu năng vận hành ấn tượng và bền bỉ. Được chế tác từ chất liệu inox 304 mờ cao cấp kết hợp kiểu dáng cổ tròn mềm mại, dòng vòi cố định này mang lại sự vững chãi cùng tính linh hoạt tối đa cho bồn rửa bát. Đây chắc chắn là giải pháp tinh tế, dễ sử dụng giúp công việc nội trợ hằng ngày của gia đình bạn trở nên nhẹ nhàng hơn bao giờ hết.\nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nThông Số Kỹ Thuật Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nChất liệu cấu tạo: Inox 304 mờ cao cấp\nChức năng chính: Thân vòi cố định, cổ tròn xoay hướng 360 độ mượt mà\nChế độ nước: 2 đường nước Nóng và Lạnh liên hoàn\nChiều cao tổng thể từ chân vòi: 355 mm\nChiều cao từ mặt đá đến đầu xả nước: 250 mm\nKhoảng cách vươn vòi (Từ tâm thân vòi đến đầu vòi): 200 mm\nChiều cao phần bầu vòi cố định: 90 mm\nKích thước: Chân đế Ø50 mm / Thân dưới Ø45 mm / Thân trên Ø25 mm\nKích thước vòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nĐặc Điểm Nổi Bật Của Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \n1. Chất liệu Inox 304 mờ cao cấp \nSản phẩm được làm hoàn toàn từ chất liệu inox 304 mờ thượng hạng, đem lại độ bền vượt trội, chịu nhiệt tốt từ đường nước nóng và không lo hoen rỉ.\nBề mặt inox mờ có khả năng chống bám bẩn, hạn chế tối đa các vệt ố của nước cứng hay cặn dầu mỡ, giúp việc vệ sinh, lau chùi vòi nước bồn rửa bát hằng ngày trở nên cực kỳ đơn giản.\n2. Thiết kế cố định bền vững kết hợp tính năng xoay 360 độ linh hoạt \nCấu trúc cố định cứng cáp: Khác biệt với dòng dây rút, mẫu vòi rửa chén Boss mã BV101 sở hữu kết cấu thân cố định vững vàng, cho cảm giác sử dụng đầm tay, bền bỉ lâu dài và không lo các lỗi hỏng vặt.\nXoay hướng đa chiều: Cổ vòi tròn cong mềm mại có khả năng xoay 360 độ cực kỳ trơn tru, giúp bạn dễ dàng dẫn nước đến mọi góc của chậu rửa hoặc xoay gọn vòi sang một bên khi cần đặt các loại xoong nồi lớn vào bồn.\n3. Tích hợp 2 đường nước nóng lạnh tiện dụng \nDòng vòi rửa bát này tích hợp sẵn hai đường nước nóng và lạnh đáp ứng mọi nhu cầu sinh hoạt:\nNước nóng: Giúp rửa trôi dầu mỡ bám trên bát đĩa nhanh chóng, đồng thời hỗ trợ khử khuẩn đồ dùng nhà bếp một cách an toàn.\nNước lạnh: Tiện lợi cho công việc sơ chế thực phẩm, rửa dọn thông thường hằng ngày.\nHướng Dẫn Sử Dụng Và Lưu Ý Lắp Đặt Để Tăng Tuổi Thọ Vòi \nXả sạch đường ống trước khi lắp: Mở van cho nước chảy tự do từ 1 – 2 phút trước khi lắp vòi để đẩy sạch các loại cát sỏi, cặn bẩn xây dựng ra ngoài, tránh làm nghẹt lưới lọc đầu vòi.\nVệ sinh vòi đúng cách: Chỉ lau chùi thân vòi bằng khăn mềm ẩm hoặc nước rửa chén pha loãng. Tuyệt đối không dùng bùi nhùi sắt hoặc chất tẩy rửa có tính axit mạnh chà xát lên vòi để tránh gây trầy xước bề mặt inox mờ.\nThao tác gạt nước nhẹ nhàng: Gạt cần điều chỉnh lượng nước và nhiệt độ nóng lạnh với lực vừa phải, giúp lõi chia nước bên trong vòi vận hành êm ái, bền bỉ qua năm tháng.\nĐặt Mua Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 Chính Hãng Tại Đâu? \nVòi Boss Cố Định Cổ Tronfn Xoay 360 Độ BV101 hiện đang được phân phối chính hãng tại hệ thống của Vật tư tổng hợp giá sỉ , cam kết bảo đảm đầy đủ mọi quyền lợi tiêu dùng từ nhà sản xuất cùng chính sách độc quyền Bảo hành gỉ vĩnh viễn.\nLiên hệ ngay Hotline hoặc chat trực tiếp để được tư vấn kích thước chậu rửa phù hợp, nhận thông tin ưu đãi tốt nhất và hỗ trợ kỹ thuật lắp đặt nhanh chóng ngay hôm nay!","desc":"Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 là một thiết bị nhà bếp tối giản nhưng sở hữu hiệu năng vận hành ấn tượng và bền bỉ. Được chế tác từ chất liệu inox 304 mờ cao cấp kết hợp kiểu dáng cổ tròn mềm mại, dòng vòi cố định này mang lại sự vững chãi cùng tính linh hoạt tối đa cho bồn rửa bát. Đây chắc chắn là giải pháp tinh tế, dễ sử dụng giúp công việc nội trợ hằng ngày của gia đình bạn trở nên nhẹ nhàng hơn bao giờ hết.\nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nThông Số Kỹ Thuật Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nChất liệu cấu tạo: Inox 304 mờ cao cấp\nChức năng chính: Thân vòi cố định, cổ tròn xoay hướng 360 độ mượt mà\nChế độ nước: 2 đường nước Nóng và Lạnh liên hoàn\nChiều cao tổng thể từ chân vòi: 355 mm\nChiều cao từ mặt đá đến đầu xả nước: 250 mm\nKhoảng cách vươn vòi (Từ tâm thân vòi đến đầu vòi): 200 mm\nChiều cao phần bầu vòi cố định: 90 mm\nKích thước: Chân đế Ø50 mm / Thân dưới Ø45 mm / Thân trên Ø25 mm\nKích thước vòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nĐặc Điểm Nổi Bật Của Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \n1. Chất liệu Inox 304 mờ cao cấp \nSản phẩm được làm hoàn toàn từ chất liệu inox 304 mờ thượng hạng, đem lại độ bền vượt trội, chịu nhiệt tốt từ đường nước nóng và không lo hoen rỉ.\nBề mặt inox mờ có khả năng chống bám bẩn, hạn chế tối đa các vệt ố của nước cứng hay cặn dầu mỡ, giúp việc vệ sinh, lau chùi vòi nước bồn rửa bát hằng ngày trở nên cực kỳ đơn giản.\n2. Thiết kế cố định bền vững kết hợp tính năng xoay 360 độ linh hoạt \nCấu trúc cố định cứng cáp: Khác biệt với dòng dây rút, mẫu vòi rửa chén Boss mã BV101 sở hữu kết cấu thân cố định vững vàng, cho cảm giác sử dụng đầm tay, bền bỉ lâu dài và không lo các lỗi hỏng vặt.\nXoay hướng đa chiều: Cổ vòi tròn cong mềm mại có khả năng xoay 360 độ cực kỳ trơn tru, giúp bạn dễ dàng dẫn nước đến mọi góc của chậu rửa hoặc xoay gọn vòi sang một bên khi cần đặt các loại xoong nồi lớn vào bồn.\n3. Tích hợp 2 đường nước nóng lạnh tiện dụng \nDòng vòi rửa bát này tích hợp sẵn hai đường nước nóng và lạnh đáp ứng mọi nhu cầu sinh hoạt:\nNước nóng: Giúp rửa trôi dầu mỡ bám trên bát đĩa nhanh chóng, đồng thời hỗ trợ khử khuẩn đồ dùng nhà bếp một cách an toàn.\nNước lạnh: Tiện lợi cho công việc sơ chế thực phẩm, rửa dọn thông thường hằng ngày.\nHướng Dẫn Sử Dụng Và Lưu Ý Lắp Đặt Để Tăng Tuổi Thọ Vòi \nXả sạch đường ống trước khi lắp: Mở van cho nước chảy tự do từ 1 – 2 phút trước khi lắp vòi để đẩy sạch các loại cát sỏi, cặn bẩn xây dựng ra ngoài, tránh làm nghẹt lưới lọc đầu vòi.\nVệ sinh vòi đúng cách: Chỉ lau chùi thân vòi bằng khăn mềm ẩm hoặc nước rửa chén pha loãng. Tuyệt đối không dùng bùi nhùi sắt hoặc chất tẩy rửa có tính axit mạnh chà xát lên vòi để tránh gây trầy xước bề mặt inox mờ.\nThao tác gạt nước nhẹ nhàng: Gạt cần điều chỉnh lượng nước và nhiệt độ nóng lạnh với lực vừa phải, giúp lõi chia nước bên trong vòi vận hành êm ái, bền bỉ qua năm tháng.\nĐặt Mua Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 Chính Hãng Tại Đâu? \nVòi Boss Cố Định Cổ Tronfn Xoay 360 Độ BV101 hiện đang được phân phối chính hãng tại hệ thống của Vật tư tổng hợp giá sỉ , cam kết bảo đảm đầy đủ mọi quyền lợi tiêu dùng từ nhà sản xuất cùng chính sách độc quyền Bảo hành gỉ vĩnh viễn.\nLiên hệ ngay Hotline hoặc chat trực tiếp để được tư vấn kích thước chậu rửa phù hợp, nhận thông tin ưu đãi tốt nhất và hỗ trợ kỹ thuật lắp đặt nhanh chóng ngay hôm nay!","specs":{},"feats":["Sản phẩm được làm hoàn toàn từ chất liệu inox 304 mờ thượng hạng, đem lại độ bền vượt trội, chịu nhiệt tốt từ đường nước nóng và không lo hoen rỉ.","Bề mặt inox mờ có khả năng chống bám bẩn, hạn chế tối đa các vệt ố của nước cứng hay cặn dầu mỡ, giúp việc vệ sinh, lau chùi vòi nước bồn rửa bát hằng ngày trở nên cực kỳ đơn giản.","Cấu trúc cố định cứng cáp: Khác biệt với dòng dây rút, mẫu vòi rửa chén Boss mã BV101 sở hữu kết cấu thân cố định vững vàng, cho cảm giác sử dụng đầm tay, bền bỉ lâu dài và không lo các lỗi hỏng vặt.","Xoay hướng đa chiều: Cổ vòi tròn cong mềm mại có khả năng xoay 360 độ cực kỳ trơn tru, giúp bạn dễ dàng dẫn nước đến mọi góc của chậu rửa hoặc xoay gọn vòi sang một bên khi cần đặt các loại xoong nồi lớn vào bồn.","Dòng vòi rửa bát này tích hợp sẵn hai đường nước nóng và lạnh đáp ứng mọi nhu cầu sinh hoạt: Nước nóng: Giúp rửa trôi dầu mỡ bám trên bát đĩa nhanh chóng, đồng thời hỗ trợ khử khuẩn đồ dùng nhà bếp một cách an toàn.","Nước lạnh: Tiện lợi cho công việc sơ chế thực phẩm, rửa dọn thông thường hằng ngày.","Xả sạch đường ống trước khi lắp: Mở van cho nước chảy tự do từ 1 – 2 phút trước khi lắp vòi để đẩy sạch các loại cát sỏi, cặn bẩn xây dựng ra ngoài, tránh làm nghẹt lưới lọc đầu vòi.","Vệ sinh vòi đúng cách: Chỉ lau chùi thân vòi bằng khăn mềm ẩm hoặc nước rửa chén pha loãng. Tuyệt đối không dùng bùi nhùi sắt hoặc chất tẩy rửa có tính axit mạnh chà xát lên vòi để tránh gây trầy xước bề mặt inox mờ."],"sku":"BV101","vid":"","mod":"BV101","brand":"Boss","slug":"bv101-voi-boss-co-dinh-co-tron-xoay-360-do-bv101-chinh-hang","_source":"avatar2-add-product","_source_url":"https://vattutonghopgiasi.com/voi-boss-co-dinh-co-tron-xoay-360-do-bv101/","_added_at":"2026-10-17T04:16:52.837Z"},{"n":"Kệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V GM- Garis V","l":"https://garis-vn.com/ke-dao-thot-gia-vi-chai-lo-canh-mo-keo-ke-rong-295mm-mm02-35v/","i":"https://garis-vn.com/wp-content/uploads/2024/03/1-MM02V-2.png","p":"7.128.000đ","pn":7128000,"listPn":0,"salePn":7128000,"priceMode":"both","c":"Kệ đựng gia vị dao thớt","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis-vn.com/wp-content/uploads/2024/03/1-MM02V-2.png"],"sum":"Nan quả trám, inox 304, bề mặt điện hóa bóng gương, dùng cho cánh mở và kéo (duy nhất tại Việt Nam)\nGợi ý kết hợp phụ kiện khi thiết kế căn bếp : Căn bếp sẽ đẹp hơn khi kết hợp giá dao thớt, gia vị, chai lọ MM02V với các sản phẩm khác trong MV Series.\nKèm theo: Ray âm giảm chấn MEGKEL (bắt vách tủ), 1 bộ bắt mặt tùy chọn dùng cho cánh kéo, 1 khay hứng nước, phiếu bảo hành, giấy chứng nhận inox 304\nKệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V Quý Khách có thể tham khảo Hướng dẫn lắp đặt phía dưới:","desc":"Nan quả trám, inox 304, bề mặt điện hóa bóng gương, dùng cho cánh mở và kéo (duy nhất tại Việt Nam)\nGợi ý kết hợp phụ kiện khi thiết kế căn bếp : Căn bếp sẽ đẹp hơn khi kết hợp giá dao thớt, gia vị, chai lọ MM02V với các sản phẩm khác trong MV Series.\nKèm theo: Ray âm giảm chấn MEGKEL (bắt vách tủ), 1 bộ bắt mặt tùy chọn dùng cho cánh kéo, 1 khay hứng nước, phiếu bảo hành, giấy chứng nhận inox 304\nKệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V Quý Khách có thể tham khảo Hướng dẫn lắp đặt phía dưới:","specs":{"Chất liệu":"Inox 304, tiêu chuẩn Nhật Bản JIS G4305","Bề mặt":"Bề mặt rổ bóng sáng với công nghệ điện hóa bóng gương Mirror BA","Tải trọng":"25kg","Bảo hành":"25 năm (bảo hành rỉ rổ)"},"feats":["Nan quả trám, inox 304, bề mặt điện hóa bóng gương, dùng cho cánh mở và kéo (duy nhất tại Việt Nam)","Kệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V"],"sku":"MM0235V","vid":"","mod":"MM0235V","brand":"Garis","slug":"mm0235v-ke-dao-thot-gia-vi-chai-lo-canh-mo-keo-mm02-35v-gm-garis-v","_source":"avatar2-add-product","_source_url":"https://garis-vn.com/ke-dao-thot-gia-vi-chai-lo-canh-mo-keo-ke-rong-295mm-mm02-35v/","_added_at":"2026-10-17T04:16:31.165Z"},{"n":"Giá xoong nồi, rổ nan dẹt, cánh kéo Garis GP0270E","l":"https://garis.vn/gia-xoong-noi-gp02e-new.html","i":"https://garis.vn/uploaded/Gia%CC%81%20xoong%20no%CC%82%CC%80i%20GP02E1-1.jpg","p":"3.716.280đ","pn":3716280,"listPn":0,"salePn":3716280,"priceMode":"both","c":"Giá xoong nồi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gia%CC%81%20xoong%20no%CC%82%CC%80i%20GP02E1-1.jpg"],"sum":"Giá xoong nồi GP02E được thiết kế thông minh với kiểu dáng hiện đại, giúp tổ chức không gian bếp một cách gọn gàng và tiện lợi","desc":"Giá xoong nồi GP02E được thiết kế thông minh với kiểu dáng hiện đại, giúp tổ chức không gian bếp một cách gọn gàng và tiện lợi","specs":{},"feats":[],"sku":"GP0270E","vid":"","mod":"GP0270E","brand":"Garis","slug":"gp0270e-gia-xoong-noi-ro-nan-det-canh-keo-garis-gp0270e","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-xoong-noi-gp02e-new.html","_added_at":"2026-10-17T04:16:10.471Z"},{"n":"Thùng rác đôi GW0630G","l":"https://garis.vn/thung-rac-doi-gw06-30g.html","i":"https://garis.vn/uploaded/GS06_30G%20N%204.jpg","p":"4.248.720đ","pn":4248720,"listPn":0,"salePn":4248720,"priceMode":"both","c":"Thùng rác","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/GS06_30G%20N%204.jpg"],"sum":"Thùng rác đôi GW06.30G Ray bi giảm chấn toàn phần, khung bắt đáy, Khung bằng thép sơn tĩnh điện, dày dặn, chắc chắn bằng thép!","desc":"Thùng rác đôi GW06.30G Ray bi giảm chấn toàn phần, khung bắt đáy, Khung bằng thép sơn tĩnh điện, dày dặn, chắc chắn bằng thép!","specs":{},"feats":[],"sku":"GW0630G","vid":"","mod":"GW0630G","brand":"Garis","slug":"gw0630g-thung-rac-doi-gw0630g","_source":"avatar2-add-product","_source_url":"https://garis.vn/thung-rac-doi-gw06-30g.html","_added_at":"2026-10-17T04:15:50.077Z"},{"n":"THÙNG GẠO MẶT KÍNH NÚT NHẤN XR.G302B - Grandx","l":"https://grandx.com.vn/product/thung-gao-mat-kinh-nut-nhan-xr-g302b","i":"https://grandx.com.vn/wp-content/uploads/2024/12/XR.G302B-1024x683.jpg","p":"2.920.000đ","pn":2920000,"listPn":0,"salePn":2920000,"priceMode":"both","c":"Thùng gạo","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/XR.G302B-1024x683.jpg"],"sum":"ĐẶC TÍNH SẢN PHẨM \nThùng gạo mặt kính cường lực cao cấp \nChất liệu vỏ thùng đựng gạo INOX cao cấp \nĐạt các tiêu chuẩn vệ sinh an toàn cho sức khỏe được kiểm tra chứng nhận bởi FDA \nMặt trước kính cường lực \nNhấn nút để lấy gạo dễ dàng \nDung tích chứa tối đa: 25kg \nLắp đặt âm tủ \nKích thước sản phẩm R300*S405*C650 mm \nKích thước khoét âm tủ R264*S410*C630 mm \n","desc":"ĐẶC TÍNH SẢN PHẨM \nThùng gạo mặt kính cường lực cao cấp \nChất liệu vỏ thùng đựng gạo INOX cao cấp \nĐạt các tiêu chuẩn vệ sinh an toàn cho sức khỏe được kiểm tra chứng nhận bởi FDA \nMặt trước kính cường lực \nNhấn nút để lấy gạo dễ dàng \nDung tích chứa tối đa: 25kg \nLắp đặt âm tủ \nKích thước sản phẩm R300*S405*C650 mm \nKích thước khoét âm tủ R264*S410*C630 mm \n","specs":{"Mã sản phẩm":"XR.G302B","Chất liệu":"SUS304 + Kính","Đặc tính sản phẩm":"Màu đen","Kích thước sản phẩm (mm)":"R300*S396*C650","Chiều rộng tủ (mm)":"300","Đơn vị":"Bộ"},"feats":["ĐẶC TÍNH SẢN PHẨM","Thùng gạo mặt kính cường lực cao cấp","Chất liệu vỏ thùng đựng gạo INOX cao cấp","Đạt các tiêu chuẩn vệ sinh an toàn cho sức khỏe được kiểm tra chứng nhận bởi FDA","Mặt trước kính cường lực","Nhấn nút để lấy gạo dễ dàng","Dung tích chứa tối đa: 25kg","Lắp đặt âm tủ","Kích thước sản phẩm R300*S405*C650 mm","Kích thước khoét âm tủ R264*S410*C630 mm"],"sku":"XR.G302B","vid":"","mod":"XR.G302B","brand":"GrandX","slug":"xr-g302b-thung-gao-mat-kinh-nut-nhan-xr-g302b-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/thung-gao-mat-kinh-nut-nhan-xr-g302b","_added_at":"2026-10-17T04:15:29.337Z"},{"n":"Tủ đồ khô cánh mở GrandX XPR.450S","l":"https://grandx.com.vn/product/tu-do-kho-canh-mo-xpr-450s1","i":"https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg","p":"13.120.000đ","pn":13120000,"listPn":0,"salePn":13120000,"priceMode":"both","c":"Tủ đồ khô","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg"],"sum":"Tủ đồ khô cánh mở XPR.450S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.450S1 \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.450S1 được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.450S1 còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.450S1 nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 415mm , dành riêng cho các khoang tủ rộng 450mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.450S1 được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.450S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.450S1 chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\n","desc":"Tủ đồ khô cánh mở XPR.450S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.450S1 \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.450S1 được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.450S1 còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.450S1 nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 415mm , dành riêng cho các khoang tủ rộng 450mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.450S1 được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.450S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.450S1 chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\n","specs":{"Mã sản phẩm":"XPR.450S1","Chất liệu":"INOX SUS 304","Kích thước sản phẩm (mm)":"R385*S500*C(1650-1950)","Kích thước lọt lòng tủ (mm)":"≥ 415","Chiều rộng tủ (mm)":"450","Số tầng rổ":"6 tầng","Tải trọng mỗi tầng":"Tối đa 5kg"},"feats":["Khả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.","Bề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.","Khung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp."],"sku":"XPR.450S1","vid":"","mod":"XPR.450S1","brand":"GrandX","slug":"xpr-450s1-tu-do-kho-canh-mo-grandx-xpr-450s","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/tu-do-kho-canh-mo-xpr-450s1","_added_at":"2026-10-17T04:14:48.509Z"},{"n":"Bếp Từ Canzy CZTL869IMAX","l":"","i":"https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","p":"6.200.000đ","pn":6200000,"listPn":14980000,"salePn":6200000,"priceMode":"both","c":"Bếp Từ Canzy CZ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742205457-be482ddf736ace36ea7308fe3a2b6806.jpg","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742322070-a36944508c279d6b99c2ae58d77621bd.jpg","https://bizweb.dktcdn.net/100/344/152/products/1-4dfb6f78-f7ff-4322-b4fb-70815e12b95f.png","https://bizweb.dktcdn.net/100/344/152/products/2-59f34d91-4f3f-4477-a43b-2cac5dae561a.png"],"sum":"","desc":"","specs":{},"feats":[],"sku":"TL869IMAX","vid":"","mod":"TL869IMAX","brand":"Canzy","slug":"tl869imax-bep-tu-canzy-cztl869imax","_source":"avatar2-bulk-import","_added_at":"2026-10-06T10:59:12.132Z"},{"n":"Chậu Đúc 1 Hố Âm Bàn BA7545 - Boss Việt Nam","l":"","i":"https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-duc-1-ho-am-ban.jpg","p":"5.720.000đ","pn":5720000,"listPn":0,"salePn":5720000,"priceMode":"both","c":"Chậu rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-duc-1-ho-am-ban.jpg"],"sum":"Chậu Đúc 1 Hố Âm Bàn là một trong những sản phẩm đang được ưa chuộng trên thị trường hiện nay, nhờ vào thiết kế tinh tế, chất liệu bền bỉ và tính năng vượt trội. Được chế tạo từ inox 304 chất lượng cao, sản phẩm này không chỉ mang đến sự hiện đại, sang trọng cho không gian bếp, mà còn đảm bảo độ bền theo thời gian. Nếu bạn đang tìm kiếm một sản phẩm bếp tiện lợi và thẩm mỹ, Chậu Đúc 1 Hố Âm Bàn chính là lựa chọn lý tưởng. \n1. Chất Liệu Inox 304 Cao Cấp \nChậu Đúc 1 Hố Âm Bàn của Boss được làm từ inox 304, một loại inox phổ biến trong ngành sản xuất đồ dùng bếp cao cấp. Với tính năng chống ăn mòn, chống oxi hóa và bền bỉ trong môi trường ẩm ướt, inox 304 giúp sản phẩm không chỉ giữ được vẻ đẹp sáng bóng mà còn có tuổi thọ lâu dài. Bề mặt inox mịn màng, dễ dàng vệ sinh, giúp chậu luôn sạch sẽ và không bị bám bẩn. \n2. Thiết Kế Đúc Âm Bàn Tinh Tế \nMột trong những ưu điểm nổi bật của Chậu Đúc 1 Hố Âm Bàn chính là thiết kế khoét âm bàn, tạo ra một không gian bếp gọn gàng và hiện đại. Việc lắp đặt chậu âm bàn không chỉ tiết kiệm diện tích mà còn dễ dàng trong việc vệ sinh, không bị bụi bẩn bám vào các đường viền như các loại chậu truyền thống. Thiết kế này mang đến sự sang trọng, nâng tầm không gian bếp của bạn. \n3. Các Kích Thước Phù Hợp Với Mọi Không Gian \nChậu Đúc 1 Hố Âm Bàn có nhiều kích thước khác nhau, giúp bạn dễ dàng lựa chọn sao cho phù hợp với không gian bếp của mình. Ba loại kích thước phổ biến của chậu đúc âm bàn bao gồm: \nChậu đúc 1 hố âm bàn \nBA6845 : Kích thước khoét đá 64 x 41 cm, phù hợp với không gian bếp có diện tích vừa phải. \nBA7545 : Kích thước khoét đá 71 x 41 cm, là lựa chọn lý tưởng cho những căn bếp rộng rãi, mang đến sự thoải mái trong việc sử dụng. \nBA7845 : Kích thước khoét đá 74 x 41 cm, với không gian rộng rãi hơn, mang đến sự tiện lợi cho việc nấu nướng và vệ sinh. \nMỗi kích thước đều được thiết kế để đảm bảo tính thẩm mỹ và công năng, giúp bạn lựa chọn được sản phẩm phù hợp nhất với nhu cầu sử dụng. \n4. Độ Dày Vượt Trội \nChậu Đúc 1 Hố Âm Bàn có độ dày viền 3.0mm và dày thùng 1.0mm, mang lại độ bền cao và khả năng chống va đập hiệu quả. Với thiết kế này, chậu có thể chịu được lực tác động mạnh mà không bị biến dạng, giúp sản phẩm duy trì hình dáng hoàn hảo suốt thời gian sử dụng. Độ dày của inox cũng giúp chậu không bị móp méo, đồng thời giữ được tính thẩm mỹ và độ bền lâu dài. \n5. Dễ Dàng Vệ Sinh Và Bảo Quản \nChậu Đúc 1 Hố Âm Bàn không chỉ nổi bật với thiết kế tinh tế mà còn rất dễ dàng vệ sinh. Với bề mặt inox mịn màng và không có các khe hở, việc lau chùi, rửa chén bát hay làm sạch sau khi nấu nướng trở nên đơn giản hơn bao giờ hết. Không chỉ giúp tiết kiệm thời gian, chậu còn giúp không gian bếp của bạn luôn sạch sẽ và gọn gàng. \n6. Tính Năng Tiện Dụng Và Hiện Đại \nChậu Đúc 1 Hố Âm Bàn mang lại sự tiện nghi tối đa cho người sử dụng. Bạn có thể dễ dàng rửa thực phẩm, chén bát hoặc các vật dụng nhà bếp khác mà không lo bị tràn ra ngoài. Bề mặt chậu phẳng, tạo sự thuận tiện khi đặt đồ vật lên, tránh việc nước tràn hoặc bẩn ra ngoài. Đặc biệt, thiết kế âm bàn còn giúp tiết kiệm diện tích, làm cho không gian bếp của bạn trở nên rộng rãi và gọn gàng hơn. \n7. Đặc Điểm Kỹ Thuật Sản Phẩm \nChất liệu : Inox 304 \nĐộ dày viền : 3.0mm \nĐộ dày thùng : 1.0mm \nKích thước khoét đá : BA6845 : 64 x 41 cm \nBA7545 : 71 x 41 cm \nBA7845 : 74 x 41 cm \n8. Lý Do Nên Chọn Chậu Đúc 1 Hố Âm Bàn \nChất lượng vượt trội : Sản phẩm được làm từ inox 304, bền bỉ và không bị ăn mòn, giúp chậu duy trì vẻ sáng bóng lâu dài. \nThiết kế sang trọng : Với kiểu dáng khoét âm bàn, chậu giúp không gian bếp trở nên hiện đại và gọn gàng hơn. \nDễ dàng vệ sinh : Bề mặt inox mịn màng và không có các khe hở giúp việc vệ sinh trở nên dễ dàng. \nChống va đập tốt : Độ dày viền và thùng inox giúp chậu chống chịu lực tốt và có độ bền lâu dài. \nPhù hợp với mọi không gian : Các kích thước khác nhau giúp bạn dễ dàng lựa chọn sản phẩm phù hợp với không gian bếp của mình. \nChậu Đúc 1 Hố Âm Bàn là sự kết hợp hoàn hảo giữa tính năng, chất lượng và thẩm mỹ. Sản phẩm này không chỉ đáp ứng nhu cầu sử dụng của bạn trong bếp mà còn tạo điểm nhấn cho không gian bếp hiện đại, sang trọng. Với chất liệu inox 304, thiết kế thông minh và dễ dàng vệ sinh, đây là lựa chọn lý tưởng cho mọi gia đình. \nHãy lựa chọn Chậu Đúc 1 Hố Âm Bàn để mang đến sự tiện lợi và vẻ đẹp cho không gian bếp của bạn","desc":"Chậu Đúc 1 Hố Âm Bàn là một trong những sản phẩm đang được ưa chuộng trên thị trường hiện nay, nhờ vào thiết kế tinh tế, chất liệu bền bỉ và tính năng vượt trội. Được chế tạo từ inox 304 chất lượng cao, sản phẩm này không chỉ mang đến sự hiện đại, sang trọng cho không gian bếp, mà còn đảm bảo độ bền theo thời gian. Nếu bạn đang tìm kiếm một sản phẩm bếp tiện lợi và thẩm mỹ, Chậu Đúc 1 Hố Âm Bàn chính là lựa chọn lý tưởng. \n1. Chất Liệu Inox 304 Cao Cấp \nChậu Đúc 1 Hố Âm Bàn của Boss được làm từ inox 304, một loại inox phổ biến trong ngành sản xuất đồ dùng bếp cao cấp. Với tính năng chống ăn mòn, chống oxi hóa và bền bỉ trong môi trường ẩm ướt, inox 304 giúp sản phẩm không chỉ giữ được vẻ đẹp sáng bóng mà còn có tuổi thọ lâu dài. Bề mặt inox mịn màng, dễ dàng vệ sinh, giúp chậu luôn sạch sẽ và không bị bám bẩn. \n2. Thiết Kế Đúc Âm Bàn Tinh Tế \nMột trong những ưu điểm nổi bật của Chậu Đúc 1 Hố Âm Bàn chính là thiết kế khoét âm bàn, tạo ra một không gian bếp gọn gàng và hiện đại. Việc lắp đặt chậu âm bàn không chỉ tiết kiệm diện tích mà còn dễ dàng trong việc vệ sinh, không bị bụi bẩn bám vào các đường viền như các loại chậu truyền thống. Thiết kế này mang đến sự sang trọng, nâng tầm không gian bếp của bạn. \n3. Các Kích Thước Phù Hợp Với Mọi Không Gian \nChậu Đúc 1 Hố Âm Bàn có nhiều kích thước khác nhau, giúp bạn dễ dàng lựa chọn sao cho phù hợp với không gian bếp của mình. Ba loại kích thước phổ biến của chậu đúc âm bàn bao gồm: \nChậu đúc 1 hố âm bàn \nBA6845 : Kích thước khoét đá 64 x 41 cm, phù hợp với không gian bếp có diện tích vừa phải. \nBA7545 : Kích thước khoét đá 71 x 41 cm, là lựa chọn lý tưởng cho những căn bếp rộng rãi, mang đến sự thoải mái trong việc sử dụng. \nBA7845 : Kích thước khoét đá 74 x 41 cm, với không gian rộng rãi hơn, mang đến sự tiện lợi cho việc nấu nướng và vệ sinh. \nMỗi kích thước đều được thiết kế để đảm bảo tính thẩm mỹ và công năng, giúp bạn lựa chọn được sản phẩm phù hợp nhất với nhu cầu sử dụng. \n4. Độ Dày Vượt Trội \nChậu Đúc 1 Hố Âm Bàn có độ dày viền 3.0mm và dày thùng 1.0mm, mang lại độ bền cao và khả năng chống va đập hiệu quả. Với thiết kế này, chậu có thể chịu được lực tác động mạnh mà không bị biến dạng, giúp sản phẩm duy trì hình dáng hoàn hảo suốt thời gian sử dụng. Độ dày của inox cũng giúp chậu không bị móp méo, đồng thời giữ được tính thẩm mỹ và độ bền lâu dài. \n5. Dễ Dàng Vệ Sinh Và Bảo Quản \nChậu Đúc 1 Hố Âm Bàn không chỉ nổi bật với thiết kế tinh tế mà còn rất dễ dàng vệ sinh. Với bề mặt inox mịn màng và không có các khe hở, việc lau chùi, rửa chén bát hay làm sạch sau khi nấu nướng trở nên đơn giản hơn bao giờ hết. Không chỉ giúp tiết kiệm thời gian, chậu còn giúp không gian bếp của bạn luôn sạch sẽ và gọn gàng. \n6. Tính Năng Tiện Dụng Và Hiện Đại \nChậu Đúc 1 Hố Âm Bàn mang lại sự tiện nghi tối đa cho người sử dụng. Bạn có thể dễ dàng rửa thực phẩm, chén bát hoặc các vật dụng nhà bếp khác mà không lo bị tràn ra ngoài. Bề mặt chậu phẳng, tạo sự thuận tiện khi đặt đồ vật lên, tránh việc nước tràn hoặc bẩn ra ngoài. Đặc biệt, thiết kế âm bàn còn giúp tiết kiệm diện tích, làm cho không gian bếp của bạn trở nên rộng rãi và gọn gàng hơn. \n7. Đặc Điểm Kỹ Thuật Sản Phẩm \nChất liệu : Inox 304 \nĐộ dày viền : 3.0mm \nĐộ dày thùng : 1.0mm \nKích thước khoét đá : BA6845 : 64 x 41 cm \nBA7545 : 71 x 41 cm \nBA7845 : 74 x 41 cm \n8. Lý Do Nên Chọn Chậu Đúc 1 Hố Âm Bàn \nChất lượng vượt trội : Sản phẩm được làm từ inox 304, bền bỉ và không bị ăn mòn, giúp chậu duy trì vẻ sáng bóng lâu dài. \nThiết kế sang trọng : Với kiểu dáng khoét âm bàn, chậu giúp không gian bếp trở nên hiện đại và gọn gàng hơn. \nDễ dàng vệ sinh : Bề mặt inox mịn màng và không có các khe hở giúp việc vệ sinh trở nên dễ dàng. \nChống va đập tốt : Độ dày viền và thùng inox giúp chậu chống chịu lực tốt và có độ bền lâu dài. \nPhù hợp với mọi không gian : Các kích thước khác nhau giúp bạn dễ dàng lựa chọn sản phẩm phù hợp với không gian bếp của mình. \nChậu Đúc 1 Hố Âm Bàn là sự kết hợp hoàn hảo giữa tính năng, chất lượng và thẩm mỹ. Sản phẩm này không chỉ đáp ứng nhu cầu sử dụng của bạn trong bếp mà còn tạo điểm nhấn cho không gian bếp hiện đại, sang trọng. Với chất liệu inox 304, thiết kế thông minh và dễ dàng vệ sinh, đây là lựa chọn lý tưởng cho mọi gia đình. \nHãy lựa chọn Chậu Đúc 1 Hố Âm Bàn để mang đến sự tiện lợi và vẻ đẹp cho không gian bếp của bạn","specs":{"BA7545":"Kích thước khoét đá 71 x 41 cm, là lựa chọn lý tưởng cho những căn bếp rộng rãi, mang đến sự thoải mái trong việc sử dụng.","BA7845":"Kích thước khoét đá 74 x 41 cm, với không gian rộng rãi hơn, mang đến sự tiện lợi cho việc nấu nướng và vệ sinh.","Chất liệu":"Inox 304","Độ dày viền":"3.0mm","Độ dày thùng":"1.0mm","BA6845":"64 x 41 cm"},"feats":["1. Chất Liệu Inox 304 Cao Cấp","2. Thiết Kế Đúc Âm Bàn Tinh Tế","3. Các Kích Thước Phù Hợp Với Mọi Không Gian","Chậu đúc 1 hố âm bàn","4. Độ Dày Vượt Trội","5. Dễ Dàng Vệ Sinh Và Bảo Quản","6. Tính Năng Tiện Dụng Và Hiện Đại","7. Đặc Điểm Kỹ Thuật Sản Phẩm","Chất liệu : Inox 304","Độ dày viền : 3.0mm"],"sku":"BA7545","vid":"","mod":"BA7545","brand":"Boss","slug":"ba7545-chau-duc-1-ho-am-ban-ba7545-boss-viet-nam","_source":"avatar2-bulk-import","_added_at":"2026-10-05T15:00:53.672Z"},{"n":"Vòi Cố Định Cổ Tròn Xoay 360 Độ BV101 - Thiết bị nhà bếp Boss","l":"https://bossvn.vn/voi-co-dinh-co-tron-xoay-360-do-bv101/","i":"data:image/jpeg;base64,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5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x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9NL3xOwpy5txqZot1dAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAt0V017NjU0y4AAAAAAAAAAAAAAAAA1nPNwJZR/atLwCXmkTnm4Eso/tWl4BLzS6hIAAQAAAAAAAAAAAAAAAAPgsvYgjjFCMTSdqPdiS2JIvapeaSKbbjNuKdlmklY4U7PcAYtGSPVrOunpH2zeecXZ4yXgCG5uPuK/wDqDN55xdhL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GpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBjHFPNleunsSnDYR3ZZU+/Sk1I3VW7JAZxkvlqCapdmJp3eNvPMsAAAAAAAAAAAAAAf/9k=","p":"1.740.000đ","pn":1740000,"listPn":0,"salePn":1740000,"priceMode":"both","c":"Vòi rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["data:image/jpeg;base64,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5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x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9NL3xOwpy5txqZot1dAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAt0V017NjU0y4AAAAAAAAAAAAAAAAA1nPNwJZR/atLwCXmkTnm4Eso/tWl4BLzS6hIAAQAAAAAAAAAAAAAAAAPgsvYgjjFCMTSdqPdiS2JIvapeaSKbbjNuKdlmklY4U7PcAYtGSPVrOunpH2zeecXZ4yXgCG5uPuK/wDqDN55xdhL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GpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBjHFPNleunsSnDYR3ZZU+/Sk1I3VW7JAZxkvlqCapdmJp3eNvPMsAAAAAAAAAAAAAAf/9k="],"sum":"Lựa chọn thiết bị nhà bếp không chỉ dừng lại ở công năng mà còn là yếu tố góp phần làm nên vẻ đẹp hiện đại của không gian sống. Vòi cố định cổ tròn xoay 360 độ BV101 chính là sản phẩm đáp ứng trọn vẹn các tiêu chí về tính năng, chất liệu, và thiết kế. Hãy cùng tìm hiểu chi tiết về sản phẩm này để hiểu vì sao BV101 là sự lựa chọn hoàn hảo cho mọi gia đình.\nTính Năng Nổi Bật Của Vòi Cố Định BV101 \nHai Đường Nước Nóng Lạnh \nVòi cố định BV101 được trang bị hai đường nước nóng lạnh, giúp bạn dễ dàng điều chỉnh nhiệt độ theo nhu cầu sử dụng. Tính năng này đặc biệt tiện lợi khi cần nước ấm để rửa thực phẩm hoặc làm sạch dụng cụ trong mùa đông.\nVòi Xoay 360 Độ \nKhả năng xoay linh hoạt 360 độ của BV101 mang lại sự tiện lợi tối đa. Bạn có thể dễ dàng điều chỉnh hướng dòng nước để làm sạch mọi ngóc ngách của bồn rửa, kể cả khi sử dụng những dụng cụ nấu nướng lớn.\nChất Liệu Cao Cấp: Inox 304 Xước Mờ \nBV101 được chế tạo từ inox 304 xước mờ, không chỉ đảm bảo độ bền vượt trội mà còn mang lại vẻ đẹp sang trọng cho không gian bếp. Đặc biệt, chất liệu này chống gỉ sét, chống bám bẩn và dễ dàng lau chùi.\nKích Thước Lý Tưởng \nVới kích thước D355 x R200 mm, BV101 phù hợp với nhiều kiểu bồn rửa và không gian bếp khác nhau. Thiết kế này mang lại sự cân đối và hài hòa, giúp nâng cao tính thẩm mỹ của gian bếp.\nƯu Điểm Khi Sử Dụng Vòi Cố Định BV101 \nTiện Lợi Và Linh Hoạt \nTính năng xoay 360 độ và hai đường nước nóng lạnh giúp bạn thực hiện các công việc bếp núc một cách nhanh chóng và tiện lợi hơn. Bạn không cần mất thời gian di chuyển hay điều chỉnh thiết bị, mọi thứ đều trong tầm tay.\nVòi Cố Định Cổ Tròn Xoay 360 Độ BV101 \nDễ Dàng Vệ Sinh Và Bảo Dưỡng \nBề mặt inox 304 xước mờ không chỉ giúp sản phẩm trông luôn mới mà còn dễ lau chùi, không bị ảnh hưởng bởi các hóa chất tẩy rửa thông thường. Điều này giúp bạn tiết kiệm thời gian và công sức trong việc bảo quản.\nAn Toàn Cho Sức Khỏe \nInox 304 là vật liệu được kiểm chứng an toàn, không gây thôi nhiễm các chất độc hại vào nguồn nước. Điều này đảm bảo nước sử dụng luôn sạch sẽ, an toàn cho sức khỏe gia đình bạn.\nChính Sách Bảo Hành Hấp Dẫn \nBV101 được bảo hành bề mặt trọn đời, khẳng định chất lượng và độ bền của sản phẩm. Đây là cam kết của nhà sản xuất đối với khách hàng, mang lại sự an tâm trong quá trình sử dụng.\nLàm Thế Nào Để Lựa Chọn Vòi Cố Định Phù Hợp? \nChất Liệu: Hãy chọn sản phẩm làm từ inox 304 để đảm bảo độ bền và an toàn.\nThiết Kế: Đảm bảo thiết kế phù hợp với phong cách và kích thước không gian bếp.\nTính Năng: Kiểm tra các tính năng như xoay linh hoạt, điều chỉnh nhiệt độ nước.\nChính Sách Bảo Hành: Lựa chọn sản phẩm có bảo hành dài hạn để đảm bảo lợi ích lâu dài.\nMẹo Làm Sạch Và Bảo Quản Vòi Cố Định BV101 \nVệ Sinh Hàng Ngày: Lau chùi nhẹ nhàng bằng khăn mềm và nước sạch để giữ bề mặt luôn sáng bóng.\nTránh Hóa Chất Mạnh: Không sử dụng các chất tẩy rửa có tính ăn mòn cao để bảo vệ lớp inox xước mờ.\nKiểm Tra Định Kỳ: Đảm bảo các khớp nối, đầu vòi và dây dẫn nước luôn hoạt động tốt, tránh rò rỉ.\nTại Sao Nên Chọn Vòi Cố Định BV101? \nBV101 của Boss không chỉ là một chiếc vòi rửa thông thường mà còn là điểm nhấn quan trọng trong không gian bếp. Với thiết kế hiện đại, chất liệu cao cấp và tính năng vượt trội, sản phẩm này đáp ứng hoàn hảo cả nhu cầu sử dụng và thẩm mỹ. Hơn nữa, chính sách bảo hành trọn đời là một sự đảm bảo tuyệt đối về chất lượng, giúp bạn hoàn toàn yên tâm khi sử dụng.\nVòi cố định cổ tròn xoay 360 độ BV101 là sự lựa chọn lý tưởng cho những ai đang tìm kiếm một sản phẩm vừa tiện ích, vừa bền đẹp cho gian bếp. Hãy để BV101 trở thành trợ thủ đắc lực trong công việc bếp núc, nâng cao chất lượng cuộc sống của bạn ngay hôm nay","desc":"Lựa chọn thiết bị nhà bếp không chỉ dừng lại ở công năng mà còn là yếu tố góp phần làm nên vẻ đẹp hiện đại của không gian sống. Vòi cố định cổ tròn xoay 360 độ BV101 chính là sản phẩm đáp ứng trọn vẹn các tiêu chí về tính năng, chất liệu, và thiết kế. Hãy cùng tìm hiểu chi tiết về sản phẩm này để hiểu vì sao BV101 là sự lựa chọn hoàn hảo cho mọi gia đình.\nTính Năng Nổi Bật Của Vòi Cố Định BV101 \nHai Đường Nước Nóng Lạnh \nVòi cố định BV101 được trang bị hai đường nước nóng lạnh, giúp bạn dễ dàng điều chỉnh nhiệt độ theo nhu cầu sử dụng. Tính năng này đặc biệt tiện lợi khi cần nước ấm để rửa thực phẩm hoặc làm sạch dụng cụ trong mùa đông.\nVòi Xoay 360 Độ \nKhả năng xoay linh hoạt 360 độ của BV101 mang lại sự tiện lợi tối đa. Bạn có thể dễ dàng điều chỉnh hướng dòng nước để làm sạch mọi ngóc ngách của bồn rửa, kể cả khi sử dụng những dụng cụ nấu nướng lớn.\nChất Liệu Cao Cấp: Inox 304 Xước Mờ \nBV101 được chế tạo từ inox 304 xước mờ, không chỉ đảm bảo độ bền vượt trội mà còn mang lại vẻ đẹp sang trọng cho không gian bếp. Đặc biệt, chất liệu này chống gỉ sét, chống bám bẩn và dễ dàng lau chùi.\nKích Thước Lý Tưởng \nVới kích thước D355 x R200 mm, BV101 phù hợp với nhiều kiểu bồn rửa và không gian bếp khác nhau. Thiết kế này mang lại sự cân đối và hài hòa, giúp nâng cao tính thẩm mỹ của gian bếp.\nƯu Điểm Khi Sử Dụng Vòi Cố Định BV101 \nTiện Lợi Và Linh Hoạt \nTính năng xoay 360 độ và hai đường nước nóng lạnh giúp bạn thực hiện các công việc bếp núc một cách nhanh chóng và tiện lợi hơn. Bạn không cần mất thời gian di chuyển hay điều chỉnh thiết bị, mọi thứ đều trong tầm tay.\nVòi Cố Định Cổ Tròn Xoay 360 Độ BV101 \nDễ Dàng Vệ Sinh Và Bảo Dưỡng \nBề mặt inox 304 xước mờ không chỉ giúp sản phẩm trông luôn mới mà còn dễ lau chùi, không bị ảnh hưởng bởi các hóa chất tẩy rửa thông thường. Điều này giúp bạn tiết kiệm thời gian và công sức trong việc bảo quản.\nAn Toàn Cho Sức Khỏe \nInox 304 là vật liệu được kiểm chứng an toàn, không gây thôi nhiễm các chất độc hại vào nguồn nước. Điều này đảm bảo nước sử dụng luôn sạch sẽ, an toàn cho sức khỏe gia đình bạn.\nChính Sách Bảo Hành Hấp Dẫn \nBV101 được bảo hành bề mặt trọn đời, khẳng định chất lượng và độ bền của sản phẩm. Đây là cam kết của nhà sản xuất đối với khách hàng, mang lại sự an tâm trong quá trình sử dụng.\nLàm Thế Nào Để Lựa Chọn Vòi Cố Định Phù Hợp? \nChất Liệu: Hãy chọn sản phẩm làm từ inox 304 để đảm bảo độ bền và an toàn.\nThiết Kế: Đảm bảo thiết kế phù hợp với phong cách và kích thước không gian bếp.\nTính Năng: Kiểm tra các tính năng như xoay linh hoạt, điều chỉnh nhiệt độ nước.\nChính Sách Bảo Hành: Lựa chọn sản phẩm có bảo hành dài hạn để đảm bảo lợi ích lâu dài.\nMẹo Làm Sạch Và Bảo Quản Vòi Cố Định BV101 \nVệ Sinh Hàng Ngày: Lau chùi nhẹ nhàng bằng khăn mềm và nước sạch để giữ bề mặt luôn sáng bóng.\nTránh Hóa Chất Mạnh: Không sử dụng các chất tẩy rửa có tính ăn mòn cao để bảo vệ lớp inox xước mờ.\nKiểm Tra Định Kỳ: Đảm bảo các khớp nối, đầu vòi và dây dẫn nước luôn hoạt động tốt, tránh rò rỉ.\nTại Sao Nên Chọn Vòi Cố Định BV101? \nBV101 của Boss không chỉ là một chiếc vòi rửa thông thường mà còn là điểm nhấn quan trọng trong không gian bếp. Với thiết kế hiện đại, chất liệu cao cấp và tính năng vượt trội, sản phẩm này đáp ứng hoàn hảo cả nhu cầu sử dụng và thẩm mỹ. Hơn nữa, chính sách bảo hành trọn đời là một sự đảm bảo tuyệt đối về chất lượng, giúp bạn hoàn toàn yên tâm khi sử dụng.\nVòi cố định cổ tròn xoay 360 độ BV101 là sự lựa chọn lý tưởng cho những ai đang tìm kiếm một sản phẩm vừa tiện ích, vừa bền đẹp cho gian bếp. Hãy để BV101 trở thành trợ thủ đắc lực trong công việc bếp núc, nâng cao chất lượng cuộc sống của bạn ngay hôm nay","specs":{"Thiết Kế":"Đảm bảo thiết kế phù hợp với phong cách và kích thước không gian bếp.","Tính Năng":"Kiểm tra các tính năng như xoay linh hoạt, điều chỉnh nhiệt độ nước.","Chính Sách Bảo Hành":"Lựa chọn sản phẩm có bảo hành dài hạn để đảm bảo lợi ích lâu dài.","Tránh Hóa Chất Mạnh":"Không sử dụng các chất tẩy rửa có tính ăn mòn cao để bảo vệ lớp inox xước mờ.","Kiểm Tra Định Kỳ":"Đảm bảo các khớp nối, đầu vòi và dây dẫn nước luôn hoạt động tốt, tránh rò rỉ."},"feats":["Chất Liệu: Hãy chọn sản phẩm làm từ inox 304 để đảm bảo độ bền và an toàn.","Thiết Kế: Đảm bảo thiết kế phù hợp với phong cách và kích thước không gian bếp.","Tính Năng: Kiểm tra các tính năng như xoay linh hoạt, điều chỉnh nhiệt độ nước.","Chính Sách Bảo Hành: Lựa chọn sản phẩm có bảo hành dài hạn để đảm bảo lợi ích lâu dài."],"sku":"BV101","vid":"","mod":"BV101","brand":"Boss","slug":"bv101-voi-co-dinh-co-tron-xoay-360-do-bv101-thiet-bi-nha-bep-boss","_source":"avatar2-add-product","_source_url":"https://bossvn.vn/voi-co-dinh-co-tron-xoay-360-do-bv101/","_added_at":"2026-10-05T11:47:25.908Z"},{"n":"MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E","l":"https://boschs.com.vn/san-pham/may-rua-chen-am-tu-bosch-smi6zcs16e/","i":"https://boschs.com.vn/wp-content/uploads/2025/02/fef-Sao-chep.jpg","p":"Giá niêm yết: 46.750.000đ — Giá KM: 24.500.000đ","pn":24500000,"listPn":46750000,"salePn":24500000,"priceMode":"both","c":"Máy rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://boschs.com.vn/wp-content/uploads/2025/02/fef-Sao-chep.jpg"],"sum":"Trang chủ / Sản phẩm / MÁY RỬA CHÉN BOSCH / MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E \nChi tiết sản phẩm\nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E\n33,300,000 ₫ 26,590,000 ₫ \r\nLượt xem : 5154 \r\nMáy Rửa Chén Bosch SMI6ZCS16E- Nhập Khẩu Đức – Bảo Hành 3 Năm\nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E số lượng \nMua hàng \nDanh mục: MÁY RỬA CHÉN BOSCH \nTừ khóa: bosch SMI6ZCS16E , máy rửa chén bosch , SMI6ZCS16E \nMô tả \nĐánh giá \nMô tả\nMáy Rửa Chén Bosch SMI6ZCS16E \n* THÔNG TIN KỸ THUẬT: \nMáy rửa bát Bosch SMI6ZCS16E có xuất xứ từ Châu Âu, mang đến bước đột phá cho người dùng những trải nghiệm hoàn toàn mới. Máy được trang bị nhiều công nghệ hiện đại như Sấy Zeolite® (Zeolith) – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo. \nGiàn Max Flex: tải máy rửa chén linh hoạt và thoải mái, có bánh xe chạy êm. \nNgăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn. \nGiá đỡ 3 tầng: Chiều cao có thể điều chỉnh theo 3 mức lên đến 5 cm, ngay cả khi giàn phía trên đã được chất đầy đồ. \nSilence Pro: máy rửa chén cực kỳ yên tĩnh (40 decibel). \nChương trình im lặng: Với chương trình này, tiếng ồn khi vận hành máy rửa chén của bạn sẽ tự động giảm xuống mức độ ồn thấp nhất. \nNgoại hình và thiết kế \nMáy rửa bát Bosch SMI6ZCS16E có thiết kế bán âm, được làm từ chất liệu thép không gỉ, bạn cần ốp thêm tấm gỗ vào mặt trước của máy cho đồng bộ với hệ tủ giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn \nBảng điều khiển của Máy rửa bát Bosch SMI6ZCS16E được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng. \n2 Giàn rửa + 1 ngăn kéo: Hệ thống giàn rửa của Máy rửa bát Bosch SMI6ZCS16E gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn. Máy có sức chứa lên tới 14 bộ chén bát, phù hợp cho gia đình từ 4-6 thành viên. \nKích thước thiết bị: Máy rửa bát Bosch SMI6ZCS16E có kích thước Cao 815-875 x Rộng 598 x Sâu 573 mm với trọng lượng 47 kg. \nKích thước lắp đặt: Cao 815-875 x Rộng 600 x Sâu min 550 mm. \nTính năng và công nghệ \n8 Chương trình rửa \nTùy vào số lượng, chất liệu và độ bẩn của bát đĩa mà người dùng lựa chọn chương trình rửa phù hợp để tối ưu hiệu quả rửa và sấy. Máy rửa bát Bosch SMI6ZCS16E được trang bị 8 chương trình rửa đa dạng: \nRửa tiết kiệm 50°C (Eco) \nRửa tự động 45 – 65°C (Auto 45 – 65°C) \nRửa thông minh (Intelligence) \nRửa chuyên sâu 70°C (Intensive) \nRửa nhanh 60°C (Express) \nRửa ly 40°C  \nRửa yên tĩnh 50°C \nRửa yêu thích/ Rửa tráng (Favourite) \nChương trình rửa đặc biệt: \nRửa nhanh tăng cường (SpeedPerfect Plus) \nSấy tăng cường (ExtraDry) \nĐiều khiển từ xa (Home Connect) \nRửa tăng cường giàn dưới cùng (IntensizeZone) \nZeolith \nVới Công nghệ sấy Zeolith trên Máy rửa bát Bosch SMI6ZCS16E giúp bát đĩa khô hoàn hảo hơn. Đây là một khoáng chất tự nhiên có tác dụng hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm. Quá trình hút hơi ẩm này được lặp đi lặp lại nhiều lần cho đến khi kết thúc quá trình rửa. Nhờ công nghệ Zeolith mà bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn. Bởi sấy Zeolith không sử dụng điện năng để sấy khô. \nFavourite / Rửa tráng \nTính năng Favourite giúp quá trình rửa và sấy bát đĩa trở nên dễ dàng hơn. Đồng thời tận dụng tối đa công dụng mà máy rửa bát mang lại. \nMặc định, chương trình Favourite sẽ là tính năng rửa tráng bát đĩa (PreWash). Khi tùy chọn Favourite, người dùng có thể kết hợp một chương trình cơ bản với một tính năng đặc biệt mà bạn yêu thích. Chẳng hạn như bạn kết hợp rửa Eco 50 độ với sấy hé cửa hiệu quả EfficientDry. Sau đó, bạn có thể lưu lại chương trình kết hợp này bằng cách nhấn giữ nút Favourite trong vòng 3 giây. Và khi cần sử dụng tính năng kết hợp này, người dùng chỉ việc kích hoạt Favourite với một lần chạm để bắt đầu. \nNgoài ra, người dùng cũng có thể tự thiết lập chương trình Favourite ngay trên ứng dụng Home Connect. \nExtra Clean Zone \nMáy rửa bát Bosch SMI6ZCS16E được trang bị hệ thống vòi phun Extra Clean Zone. Đây là hệ thống vòi phun thủy lực giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa. Người dùng cũng có thể chủ động bật tắt thông qua công tắc ON/OFF ngay trên hệ thống. \nMachine Care \nDầu mỡ và các cặn bẩn thức ăn có thể làm tăng sự phát triển của mùi hôi và các loại vi khuẩn, nấm mốc bám bên trong khoang máy. Điều này gây ảnh hưởng không nhỏ đến kết quả làm sạch bát đĩa của máy và sức khỏe con người. Vì vậy, người dùng nên có thói quen thường xuyên vệ sinh máy rửa bát theo định kỳ. \nMachine Care là chương trình vệ sinh tự động buồng máy rửa bát. Khi kích hoạt, tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo. \nChương trình này được sử dụng bằng cách cho chạy không tải (Không bát đĩa, đũa muỗng, thìa dĩa,…) kết hợp với chất tẩy rửa vệ sinh máy đặc biệt. Người dùng chỉ việc kích hoạt Machine Care và chọn Start để bắt đầu mà không cần kết hợp với chương trình nào khác. Thời lượng của tính năng Machine Care là 135 phút. \nNgoài ra, sau 30 chu kỳ rửa, Machine Care sẽ nhắc nhở bạn vệ sinh máy. Hoặc nếu thiết bị không nhắc nhở, chúng tôi khuyên bạn nên thực hiện vệ sinh khoang máy theo định kỳ (sau 30 lần rửa). \nChức năng an toàn \nMáy rửa bát Bosch SMI6ZCS16E được trang bị các tính năng và hệ thống bảo vệ an toàn cho người sử dụng: \nKhóa trẻ em (ChildLock): là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển. \nHệ thống AquaStop: là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài. \nHệ thống chống sét lan truyền: là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan. \nSản phẩm tương tự \nGiảm giá! \nMÁY RỬA CHÉN ĐỂ BÀN BOSCH SKS62E32EU\n21,400,000 ₫ 15,890,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ĐỘC LẬP BOSCH SMS6ZCI00P\n30,790,000 ₫ 24,790,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMV4HCX48E\n30,390,000 ₫ 24,190,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN BOSCH SMS4HMC25M\n27,990,000 ₫ 18,690,000 ₫ \r\nMua hàng","desc":"Trang chủ / Sản phẩm / MÁY RỬA CHÉN BOSCH / MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E \nChi tiết sản phẩm\nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E\n33,300,000 ₫ 26,590,000 ₫ \r\nLượt xem : 5154 \r\nMáy Rửa Chén Bosch SMI6ZCS16E- Nhập Khẩu Đức – Bảo Hành 3 Năm\nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E số lượng \nMua hàng \nDanh mục: MÁY RỬA CHÉN BOSCH \nTừ khóa: bosch SMI6ZCS16E , máy rửa chén bosch , SMI6ZCS16E \nMô tả \nĐánh giá \nMô tả\nMáy Rửa Chén Bosch SMI6ZCS16E \n* THÔNG TIN KỸ THUẬT: \nMáy rửa bát Bosch SMI6ZCS16E có xuất xứ từ Châu Âu, mang đến bước đột phá cho người dùng những trải nghiệm hoàn toàn mới. Máy được trang bị nhiều công nghệ hiện đại như Sấy Zeolite® (Zeolith) – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo. \nGiàn Max Flex: tải máy rửa chén linh hoạt và thoải mái, có bánh xe chạy êm. \nNgăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn. \nGiá đỡ 3 tầng: Chiều cao có thể điều chỉnh theo 3 mức lên đến 5 cm, ngay cả khi giàn phía trên đã được chất đầy đồ. \nSilence Pro: máy rửa chén cực kỳ yên tĩnh (40 decibel). \nChương trình im lặng: Với chương trình này, tiếng ồn khi vận hành máy rửa chén của bạn sẽ tự động giảm xuống mức độ ồn thấp nhất. \nNgoại hình và thiết kế \nMáy rửa bát Bosch SMI6ZCS16E có thiết kế bán âm, được làm từ chất liệu thép không gỉ, bạn cần ốp thêm tấm gỗ vào mặt trước của máy cho đồng bộ với hệ tủ giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn \nBảng điều khiển của Máy rửa bát Bosch SMI6ZCS16E được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng. \n2 Giàn rửa + 1 ngăn kéo: Hệ thống giàn rửa của Máy rửa bát Bosch SMI6ZCS16E gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn. Máy có sức chứa lên tới 14 bộ chén bát, phù hợp cho gia đình từ 4-6 thành viên. \nKích thước thiết bị: Máy rửa bát Bosch SMI6ZCS16E có kích thước Cao 815-875 x Rộng 598 x Sâu 573 mm với trọng lượng 47 kg. \nKích thước lắp đặt: Cao 815-875 x Rộng 600 x Sâu min 550 mm. \nTính năng và công nghệ \n8 Chương trình rửa \nTùy vào số lượng, chất liệu và độ bẩn của bát đĩa mà người dùng lựa chọn chương trình rửa phù hợp để tối ưu hiệu quả rửa và sấy. Máy rửa bát Bosch SMI6ZCS16E được trang bị 8 chương trình rửa đa dạng: \nRửa tiết kiệm 50°C (Eco) \nRửa tự động 45 – 65°C (Auto 45 – 65°C) \nRửa thông minh (Intelligence) \nRửa chuyên sâu 70°C (Intensive) \nRửa nhanh 60°C (Express) \nRửa ly 40°C  \nRửa yên tĩnh 50°C \nRửa yêu thích/ Rửa tráng (Favourite) \nChương trình rửa đặc biệt: \nRửa nhanh tăng cường (SpeedPerfect Plus) \nSấy tăng cường (ExtraDry) \nĐiều khiển từ xa (Home Connect) \nRửa tăng cường giàn dưới cùng (IntensizeZone) \nZeolith \nVới Công nghệ sấy Zeolith trên Máy rửa bát Bosch SMI6ZCS16E giúp bát đĩa khô hoàn hảo hơn. Đây là một khoáng chất tự nhiên có tác dụng hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm. Quá trình hút hơi ẩm này được lặp đi lặp lại nhiều lần cho đến khi kết thúc quá trình rửa. Nhờ công nghệ Zeolith mà bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn. Bởi sấy Zeolith không sử dụng điện năng để sấy khô. \nFavourite / Rửa tráng \nTính năng Favourite giúp quá trình rửa và sấy bát đĩa trở nên dễ dàng hơn. Đồng thời tận dụng tối đa công dụng mà máy rửa bát mang lại. \nMặc định, chương trình Favourite sẽ là tính năng rửa tráng bát đĩa (PreWash). Khi tùy chọn Favourite, người dùng có thể kết hợp một chương trình cơ bản với một tính năng đặc biệt mà bạn yêu thích. Chẳng hạn như bạn kết hợp rửa Eco 50 độ với sấy hé cửa hiệu quả EfficientDry. Sau đó, bạn có thể lưu lại chương trình kết hợp này bằng cách nhấn giữ nút Favourite trong vòng 3 giây. Và khi cần sử dụng tính năng kết hợp này, người dùng chỉ việc kích hoạt Favourite với một lần chạm để bắt đầu. \nNgoài ra, người dùng cũng có thể tự thiết lập chương trình Favourite ngay trên ứng dụng Home Connect. \nExtra Clean Zone \nMáy rửa bát Bosch SMI6ZCS16E được trang bị hệ thống vòi phun Extra Clean Zone. Đây là hệ thống vòi phun thủy lực giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa. Người dùng cũng có thể chủ động bật tắt thông qua công tắc ON/OFF ngay trên hệ thống. \nMachine Care \nDầu mỡ và các cặn bẩn thức ăn có thể làm tăng sự phát triển của mùi hôi và các loại vi khuẩn, nấm mốc bám bên trong khoang máy. Điều này gây ảnh hưởng không nhỏ đến kết quả làm sạch bát đĩa của máy và sức khỏe con người. Vì vậy, người dùng nên có thói quen thường xuyên vệ sinh máy rửa bát theo định kỳ. \nMachine Care là chương trình vệ sinh tự động buồng máy rửa bát. Khi kích hoạt, tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo. \nChương trình này được sử dụng bằng cách cho chạy không tải (Không bát đĩa, đũa muỗng, thìa dĩa,…) kết hợp với chất tẩy rửa vệ sinh máy đặc biệt. Người dùng chỉ việc kích hoạt Machine Care và chọn Start để bắt đầu mà không cần kết hợp với chương trình nào khác. Thời lượng của tính năng Machine Care là 135 phút. \nNgoài ra, sau 30 chu kỳ rửa, Machine Care sẽ nhắc nhở bạn vệ sinh máy. Hoặc nếu thiết bị không nhắc nhở, chúng tôi khuyên bạn nên thực hiện vệ sinh khoang máy theo định kỳ (sau 30 lần rửa). \nChức năng an toàn \nMáy rửa bát Bosch SMI6ZCS16E được trang bị các tính năng và hệ thống bảo vệ an toàn cho người sử dụng: \nKhóa trẻ em (ChildLock): là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển. \nHệ thống AquaStop: là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài. \nHệ thống chống sét lan truyền: là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan. \nSản phẩm tương tự \nGiảm giá! \nMÁY RỬA CHÉN ĐỂ BÀN BOSCH SKS62E32EU\n21,400,000 ₫ 15,890,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ĐỘC LẬP BOSCH SMS6ZCI00P\n30,790,000 ₫ 24,790,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMV4HCX48E\n30,390,000 ₫ 24,190,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN BOSCH SMS4HMC25M\n27,990,000 ₫ 18,690,000 ₫ \r\nMua hàng","specs":{"Lượt xem":"5154"},"feats":["Giàn Max Flex: tải máy rửa chén linh hoạt và thoải mái, có bánh xe chạy êm.","Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn.","Giá đỡ 3 tầng: Chiều cao có thể điều chỉnh theo 3 mức lên đến 5 cm, ngay cả khi giàn phía trên đã được chất đầy đồ.","Silence Pro: máy rửa chén cực kỳ yên tĩnh (40 decibel).","Chương trình im lặng: Với chương trình này, tiếng ồn khi vận hành máy rửa chén của bạn sẽ tự động giảm xuống mức độ ồn thấp nhất."],"sku":"SMI6ZCS16E","vid":"","mod":"SMI6ZCS16E","brand":"BOSCH","slug":"smi6zcs16e-may-rua-chen-am-tu-bosch-smi6zcs16e","_source":"avatar2-add-product","_source_url":"https://boschs.com.vn/san-pham/may-rua-chen-am-tu-bosch-smi6zcs16e/","_added_at":"2026-10-05T14:43:26.379Z"},{"n":"Máy rửa bát bán âm Bosch SMI6ZCS16E","l":"https://boschhome.com.vn/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6/?gad_source=1&gad_campaignid=22745767436&gbraid=0AAAAADb_g-0El2armGKS39qd1R78_yI48&gclid=CjwKCAjwoOjVBhArEiwAUwDak0nrb40nNozRXxxsskhVCjxPMlk1m3LuWIO62B0qSStfBLeOrLwNURoCITEQAvD_BwEhe&gclid=CjwKCAjwoOjVBhArEiwAUwDak8ZiRw14XwGNOwXbbV8yd7PcMcea4meRjuQ-PZY0im_HG9Z-qIFTPRoCpz4QAvD_BwEjwKCAjwoOjVBhArEiwAUwDakxtuAv3vMNheBF7y8iFuvYwR7dyzBXqRBguZh1xF2AQ0c-1uySLETBoCI2wQAvD_BwE","i":"https://b1.congngheviet.com.vn/file/s2-hc03/boschhome-com-vn/wp-content/uploads/2024/11/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6.jpg","p":"Giá niêm yết: 38.500.000đ — Giá KM: 23.200.000đ","pn":23200000,"listPn":38500000,"salePn":23200000,"priceMode":"both","c":"Máy rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://b1.congngheviet.com.vn/file/s2-hc03/boschhome-com-vn/wp-content/uploads/2024/11/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6.jpg"],"sum":"Với dung tích rửa lớn lên đến 14 bộ chén đĩa châu Âu cùng 8 chương trình rửa cơ bản đa dạng, 3 chương trình rửa bổ sung và được tích hợp rất nhiều công nghệ hiện đại như tính năng điều khiển từ xa Home Connect, công nghệ sấy khô Zeolith cao cấp, hệ thống 3 giàn rửa linh hoạt,… SMI6ZCS16E chính là trợ thủ đắc lực giúp công việc dọn dẹp sau nấu nướng trở nên dễ dàng và đơn giản hơn bao giờ hết. \nƯu điểm \nThời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng. \nKiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. . \nChất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng. \nBảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa. \nDung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa. \nSở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình. \nChức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn. \nCông nghệ Home Connect giúp bạn kết nối và điều khiển máy rửa bát từ xa. Giúp bạn cập nhật lượng tiêu thụ điện nước và chất tẩy rửa, cập nhật tình trạng máy, điều khiển từ xa, điều khiển từ xa bằng giọng nói một cách vô cùng tiện lợi với các thao tác dễ dàng. \nSấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn. \nChương trình rửa thông minh Intelligent được tích hợp ở những dòng máy rửa bát cao cấp của Bosch, giúp tự động điều chỉnh quá trình rửa bát. Sau khi chương trình rửa kết thúc, người dùng có thể đánh giá kết quả làm sạch và làm khô thông qua ứng dụng Home Connect. Dựa vào dữ liệu trên, máy rửa bát sẽ tự động điều chỉnh các cài đặt và đề xuất người dùng một vài lựa chọn thay thế. \nChương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại. \nTăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus. \nTăng áp lực nước rửa giàn dưới cùng với tính năng vùng rửa chuyên sâu IntensiveZone và giàn giữa với hệ thống thủy lực Extra Clean Zone giúp bạn loại bỏ hoàn toàn các vết bẩn cứng đầu trên những vật dụng khó rửa. \nThiết kế 3 khay rửa thông minh, linh hoạt giúp tối ưu lượng bát đĩa, nồi chảo khi xếp vào máy. Đặc biệt, giàn giữa có thể điều chỉnh nâng lên và hạ xuống thêm 5 cm dễ dàng chỉ bằng thao tác chạm cần gạt. \nĐộng cơ không chổi than EcoSilence Drive mang lại chất lượng rửa cao với độ ồn thấp, đảm bảo thiết bị hoạt động trơn tru và yên tĩnh. \nNhược điểm \nChưa được trang bị tính năng rửa nửa tải (HalfLoad). \nTính năng  \nHẹn giờ. \nKhóa phím điều khiển bảo vệ trẻ em. \nCảm biến nhận biết độ sạch của nước. \n8 chương trình cài đặt sẵn: rửa tự động (Auto 45 – 65°C), rửa tiết kiệm (Eco 50°C), rửa chuyên sâu (Intensive 70°C), rửa thông minh (Intelligent), rửa nhanh (Express 60°C), rửa yên tĩnh (Silence 50°C), chương trình rửa yêu thích (Favourite), rửa ly (Glass 40°C). \n3 chương trình rửa bổ sung: tăng tốc độ rửa SpeedPerfect Plus, vùng rửa chuyên sâu Intensize Zone, sấy tăng cường Extra Dry. \nCông nghệ Home Connect kết nối và điều khiển máy rửa bát từ xa. \nCông nghệ ActiveWater giúp tối ưu lượng nước rửa từng chu kỳ. \nChức năng Machine Care tự động vệ sinh khoang máy rửa bát. \nVùng làm sạch thêm ExtraClean Zone với 3 vòi phun nước xoay giúp làm sạch triệt để bát đũa của bạn với lượng nước gấp 3 lần mà không cần thêm chất tẩy rửa hay tăng nhiệt độ. \nHệ thống Dosage Assistant giúp hòa tan và phân bổ đồng đều chất tẩy rửa. \nCảm biến tải LoadSensor giúp tiết kiệm nước và năng lượng khi làm sạch số lượng bát đĩa ít hơn. \nCảm biến nước AquaSensor giúp điều chỉnh lượng nước dựa vào độ bẩn của bát đĩa. \nKhử khuẩn bằng nước nóng. \nBáo thiếu muối. \nBáo thiếu chất tẩy rửa. \nBáo thiếu nước làm bóng. \nTự động báo lỗi và dừng hoạt động khi có vấn đề về nguồn cấp nước (Cảm biến AquaStop). \nThiết bị bảo vệ chống sét lan truyền. \nThông số kỹ thuật","desc":"Với dung tích rửa lớn lên đến 14 bộ chén đĩa châu Âu cùng 8 chương trình rửa cơ bản đa dạng, 3 chương trình rửa bổ sung và được tích hợp rất nhiều công nghệ hiện đại như tính năng điều khiển từ xa Home Connect, công nghệ sấy khô Zeolith cao cấp, hệ thống 3 giàn rửa linh hoạt,… SMI6ZCS16E chính là trợ thủ đắc lực giúp công việc dọn dẹp sau nấu nướng trở nên dễ dàng và đơn giản hơn bao giờ hết. \nƯu điểm \nThời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng. \nKiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. . \nChất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng. \nBảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa. \nDung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa. \nSở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình. \nChức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn. \nCông nghệ Home Connect giúp bạn kết nối và điều khiển máy rửa bát từ xa. Giúp bạn cập nhật lượng tiêu thụ điện nước và chất tẩy rửa, cập nhật tình trạng máy, điều khiển từ xa, điều khiển từ xa bằng giọng nói một cách vô cùng tiện lợi với các thao tác dễ dàng. \nSấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn. \nChương trình rửa thông minh Intelligent được tích hợp ở những dòng máy rửa bát cao cấp của Bosch, giúp tự động điều chỉnh quá trình rửa bát. Sau khi chương trình rửa kết thúc, người dùng có thể đánh giá kết quả làm sạch và làm khô thông qua ứng dụng Home Connect. Dựa vào dữ liệu trên, máy rửa bát sẽ tự động điều chỉnh các cài đặt và đề xuất người dùng một vài lựa chọn thay thế. \nChương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại. \nTăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus. \nTăng áp lực nước rửa giàn dưới cùng với tính năng vùng rửa chuyên sâu IntensiveZone và giàn giữa với hệ thống thủy lực Extra Clean Zone giúp bạn loại bỏ hoàn toàn các vết bẩn cứng đầu trên những vật dụng khó rửa. \nThiết kế 3 khay rửa thông minh, linh hoạt giúp tối ưu lượng bát đĩa, nồi chảo khi xếp vào máy. Đặc biệt, giàn giữa có thể điều chỉnh nâng lên và hạ xuống thêm 5 cm dễ dàng chỉ bằng thao tác chạm cần gạt. \nĐộng cơ không chổi than EcoSilence Drive mang lại chất lượng rửa cao với độ ồn thấp, đảm bảo thiết bị hoạt động trơn tru và yên tĩnh. \nNhược điểm \nChưa được trang bị tính năng rửa nửa tải (HalfLoad). \nTính năng  \nHẹn giờ. \nKhóa phím điều khiển bảo vệ trẻ em. \nCảm biến nhận biết độ sạch của nước. \n8 chương trình cài đặt sẵn: rửa tự động (Auto 45 – 65°C), rửa tiết kiệm (Eco 50°C), rửa chuyên sâu (Intensive 70°C), rửa thông minh (Intelligent), rửa nhanh (Express 60°C), rửa yên tĩnh (Silence 50°C), chương trình rửa yêu thích (Favourite), rửa ly (Glass 40°C). \n3 chương trình rửa bổ sung: tăng tốc độ rửa SpeedPerfect Plus, vùng rửa chuyên sâu Intensize Zone, sấy tăng cường Extra Dry. \nCông nghệ Home Connect kết nối và điều khiển máy rửa bát từ xa. \nCông nghệ ActiveWater giúp tối ưu lượng nước rửa từng chu kỳ. \nChức năng Machine Care tự động vệ sinh khoang máy rửa bát. \nVùng làm sạch thêm ExtraClean Zone với 3 vòi phun nước xoay giúp làm sạch triệt để bát đũa của bạn với lượng nước gấp 3 lần mà không cần thêm chất tẩy rửa hay tăng nhiệt độ. \nHệ thống Dosage Assistant giúp hòa tan và phân bổ đồng đều chất tẩy rửa. \nCảm biến tải LoadSensor giúp tiết kiệm nước và năng lượng khi làm sạch số lượng bát đĩa ít hơn. \nCảm biến nước AquaSensor giúp điều chỉnh lượng nước dựa vào độ bẩn của bát đĩa. \nKhử khuẩn bằng nước nóng. \nBáo thiếu muối. \nBáo thiếu chất tẩy rửa. \nBáo thiếu nước làm bóng. \nTự động báo lỗi và dừng hoạt động khi có vấn đề về nguồn cấp nước (Cảm biến AquaStop). \nThiết bị bảo vệ chống sét lan truyền. \nThông số kỹ thuật","specs":{"Loại máy rửa chén":"Bán tích hợp","Bảng điều khiển phía trước":"Có","Nhãn năng lượng":"B","Độ ồn tối đa":"40dB","Xây dựng chất lượng":"Cao cấp","Chất lượng giặt":"Cao cấp","Bảng điều khiển vị trí":"Ngoài","Vị trí thiết bị":"Được xây dựng trong","Chiều cao thích hợp":"81,5 – 87,5cm","Chiều rộng thích hợp":"60 – 60,8cm","Chiều sâu thích hợp":"55 cm","Chiều cao của bảng điều khiển phía trước":"54,1 – 61,1cm","Hệ thống bản lề":"Cửa trên cửa","Chiều cao":"81,5 cm","Chiều rộng":"59,8 cm","Chiều sâu":"57,3 cm","Chân có thể điều chỉnh":"Có","Đầu có thể tháo rời":"–","Cân nặng":"47,1kg","Loại ngăn đựng dao kéo":"Ngăn kéo","Khay dao kéo có thể điều chỉnh độ cao":"–","Không gian để bát đĩa":"Nhiều, Trung bình","Số lượng cài đặt địa điểm":"14","Bố cục có thể tùy chỉnh":"Có","Giá trên có thể điều chỉnh":"Có","Giá đỡ trên có thể gập lại":"Có","Có thể gập lại hỗ trợ giá đỡ thấp hơn":"Có","Rất phù hợp với các loại món ăn":"Bình sữa trẻ em, Chảo nướng, Bát đĩa nửa tải, Nồi và chảo lớn, Hộp nhựa, Ly uống rượu (23cm)","Chiếu sáng nội thất":"Có","Chương trình giặt":"Chu kỳ tự động, tiết kiệm, chuyên sâu, ngắn, im lặng","Chức năng nửa tải":"–","Cảm biến tải":"–","Chức năng chu kỳ rút ngắn":"Có","Chiếu sàn":"Không","Giá đỡ dưới có chức năng nâng":"–","Phát hiện chất tẩy rửa":"Có","Nạp chất tẩy rửa máy rửa chén tự động":"–","Chỉ báo nạp muối":"Có","Chỉ báo nạp nước trợ xả":"Có","Tín hiệu kết thúc chu kỳ":"Có","Loại tín hiệu kết thúc chu kỳ":"Quang học","Khóa an toàn trẻ em":"Có","Số nhiệt độ làm sạch":"6","Nhiệt độ làm sạch tối đa":"70°C","Phương pháp sấy":"Zeolit ​​(bát khô thêm)","Vùng chuyên sâu":"Có","Hạng tốc độ":"Nhanh","Điều khiển qua ứng dụng":"Có","Điều khiển máy sấy qua ứng dụng":"Vận hành từ xa, Đọc thông tin qua ứng dụng","Bắt đầu trì hoãn":"Có","Bắt đầu phân chia độ trễ":"1 – 24 giờ","Tùy chọn tắt tự động":"Có","Ngôn ngữ bảng điều khiển":"Tiếng Anh, Ký hiệu","Chi phí năng lượng hàng năm":"72,8 euro","Tiêu thụ năng lượng hàng năm":"182 kWh","Tiêu thụ năng lượng trên mỗi chu kỳ":"0,65 kWh","Chức năng tiết kiệm năng lượng":"Tự động tắt, Chu trình tiết kiệm năng lượng, Cấp nước nóng, Lượng nước sử dụng được xác định theo mức độ bẩn","Thời lượng chu kỳ sinh thái":"215 phút","Chi phí nước hàng năm":"3,53 euro","Lượng nước sử dụng hàng năm":"2520 lít","Lượng nước sử dụng mỗi chu kỳ":"9 lít","Thân thiện với môi trường":"Đúng","Số lượng vòi phun tay phun":"2","Loại động cơ":"Biến tần","Chất liệu nội thất":"Thép không gỉ","Đầu nối nước":"Nước lạnh và nước ấm","Bảo vệ rò rỉ":"Có","Loại bảo vệ rò rỉ":"Cảm biến rò rỉ đáy, Bảo vệ chống tràn, Ống an toàn","Ống đầu vào có thể tháo rời":"–","Ống thoát nước có thể tháo rời":"–","Chiều dài ống đầu vào":"1,65 m","Loại nguồn điện":"Mạng lưới điện","Nguồn điện tối thiểu":"2400W"},"feats":["Thời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng.","Kiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. .","Chất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng.","Bảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa.","Dung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa.","Sở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình.","Chức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn.","Sấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn.","Chương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại.","Tăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus."],"sku":"SMI6ZCS16E","vid":"","mod":"SMI6ZCS16E","brand":"Bosch","slug":"smi6zcs16e-may-rua-bat-ban-am-bosch-smi6zcs16e","_source":"avatar2-add-product","_source_url":"https://boschhome.com.vn/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6/?gad_source=1&gad_campaignid=22745767436&gbraid=0AAAAADb_g-0El2armGKS39qd1R78_yI48&gclid=CjwKCAjwoOjVBhArEiwAUwDak0nrb40nNozRXxxsskhVCjxPMlk1m3LuWIO62B0qSStfBLeOrLwNURoCITEQAvD_BwEhe&gclid=CjwKCAjwoOjVBhArEiwAUwDak8ZiRw14XwGNOwXbbV8yd7PcMcea4meRjuQ-PZY0im_HG9Z-qIFTPRoCpz4QAvD_BwEjwKCAjwoOjVBhArEiwAUwDakxtuAv3vMNheBF7y8iFuvYwR7dyzBXqRBguZh1xF2AQ0c-1uySLETBoCI2wQAvD_BwE","_added_at":"2026-10-05T11:47:18.605Z"},{"n":"GIÁ DAO THỚT GIA VỊ NAN OVAL XK.40M2 - Grandx","l":"https://grandx.com.vn/product/gia-dao-thot-gia-vi-nan-oval-xk-40m2","i":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-5-2.png","p":"5.230.000đ","pn":5230000,"listPn":0,"salePn":5230000,"priceMode":"both","c":"Giá dao thớt, gia vị","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-5-2.png"],"sum":"Đặc tính sản phẩm \nGiá dao thớt gia vị nan Oval\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho tủ cánh kéo \nTính năng đột phá \nTích hợp giỏ đựng thìa, dĩa\nKhay đựng nước nhựa cao cấp ABS có viền nhôm 2 mặt chống cong vênh\nHệ chuyển động sử dụng bộ ray âm hoạt động ổn định, độ bền cao \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ DAO THỚT GIA VỊ NAN OVAL XK.40M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"Đặc tính sản phẩm \nGiá dao thớt gia vị nan Oval\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho tủ cánh kéo \nTính năng đột phá \nTích hợp giỏ đựng thìa, dĩa\nKhay đựng nước nhựa cao cấp ABS có viền nhôm 2 mặt chống cong vênh\nHệ chuyển động sử dụng bộ ray âm hoạt động ổn định, độ bền cao \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ DAO THỚT GIA VỊ NAN OVAL XK.40M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XK.40M2","Chất liệu rổ":"SUS304 Oval","Chất liệu khung":"INOX 304 sơn nhiệt","Kích thước sản phẩm (mm)":"R357*S438*C506","Chiều rộng tủ (mm)":"400mm"},"feats":["Tích hợp giỏ đựng thìa, dĩa Khay đựng nước nhựa cao cấp ABS có viền nhôm 2 mặt chống cong vênh Hệ chuyển động sử dụng bộ ray âm hoạt động ổn định, độ bền cao"],"sku":"XK.40M2","vid":"","mod":"XK.40M2","brand":"GrandX","slug":"xk-40m2-gia-dao-thot-gia-vi-nan-oval-xk-40m2-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-dao-thot-gia-vi-nan-oval-xk-40m2","_added_at":"2026-10-05T14:43:24.675Z"},{"n":"GIÁ GIA VỊ TITANIUM XS.40T - Grandx","l":"https://grandx.com.vn/product/gia-gia-vi-titanium-xs-40t","i":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-copy.png","p":"6.680.000đ","pn":6680000,"listPn":0,"salePn":6680000,"priceMode":"both","c":"Giá dao thớt, gia vị","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-copy.png"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị Grand X với ngăn kéo thu gọn trong hộc tủ, tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng nhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ TITANIUM XS.40T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị Grand X với ngăn kéo thu gọn trong hộc tủ, tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng nhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ TITANIUM XS.40T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{},"feats":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"sku":"XS.40T","vid":"","mod":"XS.40T","brand":"GrandX","slug":"xs-40t-gia-gia-vi-titanium-xs-40t-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-gia-vi-titanium-xs-40t","_added_at":"2026-10-05T14:43:21.504Z"},{"n":"GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S1 - Grandx","l":"https://grandx.com.vn/product/gia-dung-chai-lo-gia-vi-nan-det-xs-40s1","i":"https://grandx.com.vn/wp-content/uploads/2024/12/XS.25S.40S2-PHOI-CANH.png","p":"3.630.000đ","pn":3630000,"listPn":0,"salePn":3630000,"priceMode":"both","c":"Giá dao thớt, gia vị","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/XS.25S.40S2-PHOI-CANH.png"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XS.40S1","Chất liệu rổ":"SUS304","Chất liệu khung":"Thép Carbon sơn nhiệt","Kích thước sản phẩm (mm)":"R335*S485*C450","Chiều rộng tủ (mm)":"400"},"feats":["ĐẶC TÍNH SẢN PHẨM","Giá đựng chai lọ gia vị nan dẹt","Chất liệu SUS304","Bề mặt hoàn thiện điện hóa xước mờ","Dùng cho cánh kéo","Hệ chuyển động sử dụng bộ ray âm","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"sku":"XS.40S1","vid":"","mod":"XS.40S1","brand":"GrandX","slug":"xs-40s1-gia-dung-chai-lo-gia-vi-nan-det-xs-40s1-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-dung-chai-lo-gia-vi-nan-det-xs-40s1","_added_at":"2026-10-05T14:43:17.222Z"},{"n":"GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S2 - Grandx","l":"https://grandx.com.vn/product/gia-dung-chai-lo-gia-vi-nan-det-xs-40s2","i":"https://grandx.com.vn/wp-content/uploads/2025/01/XS.25S.40S2.png","p":"3.950.000đ","pn":3950000,"listPn":0,"salePn":3950000,"priceMode":"both","c":"Giá dao thớt, gia vị","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2025/01/XS.25S.40S2.png"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\n","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\n","specs":{"Mã sản phẩm":"XS.40S2","Chất liệu rổ":"SUS304","Chất liệu khung":"INOX 304","Kích thước sản phẩm (mm)":"R335*S485*C450","Chiều rộng tủ (mm)":"400"},"feats":["ĐẶC TÍNH SẢN PHẨM","Giá đựng chai lọ gia vị nan dẹt","Chất liệu SUS304","Bề mặt hoàn thiện điện hóa xước mờ","Dùng cho cánh kéo","Hệ chuyển động sử dụng bộ ray âm","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"sku":"XS.40S2","vid":"","mod":"XS.40S2","brand":"GrandX","slug":"xs-40s2-gia-dung-chai-lo-gia-vi-nan-det-xs-40s2-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-dung-chai-lo-gia-vi-nan-det-xs-40s2","_added_at":"2026-10-17T04:15:08.942Z"},{"n":"GIÁ BÁT NÂNG HẠ NAN DẸT XL.90S2","l":"https://grandx.com.vn/product/gia-bat-nang-ha-nan-det-xl-90s2","i":"https://grandx.com.vn/wp-content/uploads/2026/09/XL.60.70.80.90S1_2-02.jpg","p":"10.890.000đ","pn":10890000,"listPn":0,"salePn":10890000,"priceMode":"both","c":"Phụ kiện tủ bếp trên","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2026/09/XL.60.70.80.90S1_2-02.jpg"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá bát đĩa nâng hạ 2 tầng nan Dẹt SUS304\nBề mặt điện hóa xước mờ\nKhung chính bằng Thép Carbon sơn nhiệt màu xám đậm\nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợp\nvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval bằng INOX SUS 304\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT NÂNG HẠ NAN DẸT XL.90S2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá bát đĩa nâng hạ 2 tầng nan Dẹt SUS304\nBề mặt điện hóa xước mờ\nKhung chính bằng Thép Carbon sơn nhiệt màu xám đậm\nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợp\nvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval bằng INOX SUS 304\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT NÂNG HẠ NAN DẸT XL.90S2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XL.90S2","Chất liệu rổ":"SUS304","Chất liệu khung":"Inox 304","Kích thước sản phẩm":"R864*S280*C550","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"feats":["ĐẶC TÍNH SẢN PHẨM","Giá bát đĩa nâng hạ 2 tầng nan Dẹt SUS304","Bề mặt điện hóa xước mờ","Khung chính bằng Thép Carbon sơn nhiệt màu xám đậm","Điều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợp","với nhu cầu sử dụng thực tế","2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh","Ống tay cầm hình oval bằng INOX SUS 304","THÔNG SỐ SẢN PHẨM","Mở rộng"],"sku":"XL.90S2","vid":"","mod":"XL.90S2","brand":"GrandX","slug":"xl-90s2-gia-bat-nang-ha-nan-det-xl-90s2","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-bat-nang-ha-nan-det-xl-90s2","_added_at":"2026-10-05T14:43:14.687Z"},{"n":"Giá treo quần âu đa năng kết hợp khay đựng đồ Garis GW0470","l":"https://garis.vn/gia-treo-quan-au-da-nang-gw04.html?srsltid=AfmBOoo5AwhtJSAMVHqmv8HV1NEZvllrpswaWN8ihQjGkvd0S3W7HLD2","i":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91a%20n%C4%83ng%20GW04%201.jpg","p":"4.730.400đ","pn":4730400,"listPn":4730400,"salePn":4730400,"priceMode":"list","c":"Giá treo quần âu đa năng","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91a%20n%C4%83ng%20GW04%201.jpg"],"sum":"Giá treo quần âu đa năng GW04 – Thiết kế linh hoạt, chất liệu bền đẹp, phù hợp cho mọi không gian tủ quần áo. Giúp quần âu luôn thẳng phẳng và ngăn nắp.","desc":"Giá treo quần âu đa năng GW04 – Thiết kế linh hoạt, chất liệu bền đẹp, phù hợp cho mọi không gian tủ quần áo. Giúp quần âu luôn thẳng phẳng và ngăn nắp.","specs":{"Chất liệu":": Khung bằng thép sơn tĩnh điện, nan bằng thép phủ nano","Tải trọng":": 30kg","Màu sắc":": Trắng","Bảo hành":": 24 tháng"},"feats":[],"sku":"GW0470","vid":"","mod":"GW0470","brand":"Garis","slug":"gw0470-gia-treo-quan-au-da-nang-ket-hop-khay-dung-do-garis-gw0470","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-treo-quan-au-da-nang-gw04.html?srsltid=AfmBOoo5AwhtJSAMVHqmv8HV1NEZvllrpswaWN8ihQjGkvd0S3W7HLD2","_added_at":"2026-10-05T14:43:13.342Z"},{"n":"Giá treo quần âu đơn cân Garis GWE38","l":"https://garis.vn/gia-treo-quan-au-don-can-gw38e.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C6%A1n%20c%C3%A2n%20GW38E.jpg","p":"2.484.000đ","pn":2484000,"listPn":2484000,"salePn":2484000,"priceMode":"list","c":"Giá treo quần âu đơn cân ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C6%A1n%20c%C3%A2n%20GW38E.jpg"],"sum":"Giá treo quần âu đơn cân GW38E Thiết kế cân đối, bền đẹp, tối ưu hóa không gian tủ. Dễ lắp đặt, giữ quần âu phẳng phiu và ngăn nắp!","desc":"Giá treo quần âu đơn cân GW38E Thiết kế cân đối, bền đẹp, tối ưu hóa không gian tủ. Dễ lắp đặt, giữ quần âu phẳng phiu và ngăn nắp!","specs":{},"feats":["Màu xanh Emerald, tạo nên vẻ đẹp và sự tươi mới cho không gian treo quần áo. Màu sắc này cũng tạo điểm nhấn và sự phong cách cho sản phẩm."],"sku":"GWE38","vid":"","mod":"GWE38","brand":"Garis","slug":"gwe38-gia-treo-quan-au-don-can-garis-gwe38","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-treo-quan-au-don-can-gw38e.html","_added_at":"2026-10-05T14:43:11.744Z"},{"n":"Giá treo quần âu đôi Garis GWE35","l":"https://garis.vn/gia-treo-quan-au-doi-gw35e.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C3%B4i%20GW35E.jpg","p":"2.950.000đ","pn":2950000,"listPn":0,"salePn":2950000,"priceMode":"list","c":"Giá treo quần âu đôi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C3%B4i%20GW35E.jpg"],"sum":"Giá treo quần âu đôi GW35E Thiết kế tiện lợi, chất liệu bền đẹp, tối ưu không gian tủ quần áo. Dễ lắp đặt, hỗ trợ lưu trữ quần âu ngăn nắp và gọn gàng","desc":"Giá treo quần âu đôi GW35E Thiết kế tiện lợi, chất liệu bền đẹp, tối ưu không gian tủ quần áo. Dễ lắp đặt, hỗ trợ lưu trữ quần âu ngăn nắp và gọn gàng","specs":{},"feats":["Màu xanh Emerald, tạo nên vẻ đẹp và sự tươi mới cho không gian treo quần áo. Màu sắc này cũng tạo điểm nhấn với sự phong cách cho sản phẩm."],"sku":"GWE35","vid":"","mod":"GWE35","brand":"Garis","slug":"gwe35-gia-treo-quan-au-doi-garis-gwe35","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-treo-quan-au-doi-gw35e.html","_added_at":"2026-10-05T14:43:10.318Z"},{"n":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","l":"https://www.dienmayxanh.com/may-giat/may-giat-hitachi-inverter-105-kg-bd-1054hvow?utm_flashsale=1","i":"https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806.jpg","p":"Giá niêm yết: 10.990.000đ — Giá KM: 5.990.000đ","pn":5990000,"listPn":10990000,"salePn":5990000,"priceMode":"both","c":"Máy giặt / sấy","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-638963804276138450.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-638963804285992497.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-99-638962219298592474.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-5-639063368977740536.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-639063369030108820.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-639063369065311055.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-639063369104866518.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-4-639063369150311821.jpg"],"sum":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","desc":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","specs":{"Loại máy giặt":"Cửa trước","Lồng giặt":"Lồng ngang","Khối lượng giặt":"10.5 Kg","Số người sử dụng":"Trên 7 người","Kiểu động cơ":"Truyền động gián tiếp (dây Curoa)","Tốc độ quay vắt tối đa":"1400 vòng/phút","Chất liệu lồng giặt":"Inox","Chất liệu vỏ máy":"Kim loại sơn tĩnh điện","Chất liệu cửa máy":"Nhựa","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2025","Thời gian bảo hành động cơ":"10 năm","Hiệu suất sử dụng điện":"5.7 Wh/kg","Loại Inverter":"Công nghệ Inverter","Chương trình":"Đồ màu Vải mỏng Đồ trẻ em Đồ lót Đồ len Đồ hỗn hợp Đồ cotton Đồ Jeans Áo sơ mi Xả + vắt Vệ sinh lồng giặt Vắt Giặt vệ sinh Giặt tiết kiệm Giặt nhanh Giặt chăn bông","Công nghệ giặt":"Giặt nước nóng Giặt hơi nước","Bảng điều khiển":"Song ngữ Anh - Việt có núm xoay, cảm ứng và màn hình hiển thị","Tiện ích":"Vệ sinh lồng giặt Khóa trẻ em Hẹn giờ giặt Chống nhăn Chỉnh số vòng vắt Chỉnh nhiệt độ nước","Kích thước - Khối lượng":"Cao 85 cm - Ngang 60 cm - Sâu 63.5 cm - Nặng 70 kg","Chiều dài ống cấp nước":"110 cm","Chiều dài ống thoát nước":"180 cm","Hãng":"Hitachi. Xem thông tin hãng"},"feats":["Thiết bị sử dụng kiểu động cơ gián tiếp truyền động dây curoa nên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.","Tiện ích giặt chống nhăn được thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.","Hẹn giờ giặt giúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.","Tùy chỉnh số vòng vắt, nhiệt độ nước cho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.","Vệ sinh lồng giặt bằng nước nóng giúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt."],"sku":"BD-1054HVOW","vid":"","mod":"BD-1054HVOW","brand":"Hitachi","slug":"bd-1054hvow-may-giat-hitachi-inverter-10-5-kg-bd-1054hvow","_source":"avatar2-add-product","_source_url":"https://www.dienmayxanh.com/may-giat/may-giat-hitachi-inverter-105-kg-bd-1054hvow?utm_flashsale=1","_added_at":"2026-10-05T14:43:04.943Z"},{"n":"KHÓA CỬA ĐIỆN TỬ HUBERT HB CG26F","l":"https://hubert.vn/san-pham/khoa-cua-dien-tu-hubert-hb-cg26f/","i":"data:image/jpeg;base64,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m5t795vCLwheeKDm5t8d5vCLwheeKG04ANWObm3v1Og3hF4QvPFBzc2+O83hH4QvPFDacAGrHNzb37zeEXhC88UHNzb37zeEXhC88UNpwAasc3NvfvN4ReELzxQc3NvjvN4ReELzxQ2nABqxzc29+83hF4QvPFD60n9vylNymEOEtKU/+Y3vixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+373osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLFl4NSWO75OVrjZaVrQpyqE3lzDkFXRVadnm1Slyi1xxuU7QDkAAAAAAAAAAAAAAAAdV51pT8mceOS32ReeznHyyg9kHfWVfWDxnV+yDz2c4+WOL0Uu6joQyd6tRMnwh871TjUVG9smCbPjv021c3Lon2BT+sHWfCVTPZ1ESfDJd10/OFybNfm22H7ftPjCm0/OFxbNXm3WH7ftPjiIE32yPumsRfbFD5qiKbR66QXFtlfdN4i+2KHzVEUyn11MX32G/XkXnmkX57TM/nJx6EXOhvq3ZdH0xisT+YYeevkXHmj357TM/nKg9EpKmtEuU/TG5/ijIfzzYOcVArtf2u8OmLGSVFcYepczJGdYK9cYyjgh6fpaYnD2SbxrczhypkImNNmTsS8nRtHLq9nkyl9UbkEFd3fpsLihGu71jeZfcCTRpHE+qnOPEqoNUuG1a9v1YrK95nfN+GOnXi2eQv8Ax7oRdai5eeVr26jnnpa+nClueZz+MfDnkcjHlXXPz1p+nD889Tf07/xFMc8CvbH45vn9Np/KHKLiVutP00WhsmyS10bUWGUI14yv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","p":"6.000.000đ","pn":6000000,"listPn":0,"salePn":6000000,"priceMode":"both","c":"Khóa vân tay","cs":"san-pham-them-moi","ci":"fa-box","imgs":["data:image/jpeg;base64,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m5t795vCLwheeKDm5t8d5vCLwheeKG04ANWObm3v1Og3hF4QvPFBzc2+O83hH4QvPFDacAGrHNzb37zeEXhC88UHNzb37zeEXhC88UNpwAasc3NvfvN4ReELzxQc3NvjvN4ReELzxQ2nABqxzc29+83hF4QvPFD60n9vylNymEOEtKU/+Y3vixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+373osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLFl4NSWO75OVrjZaVrQpyqE3lzDkFXRVadnm1Slyi1xxuU7QDkAAAAAAAAAAAAAAAAdV51pT8mceOS32ReeznHyyg9kHfWVfWDxnV+yDz2c4+WOL0Uu6joQyd6tRMnwh871TjUVG9smCbPjv021c3Lon2BT+sHWfCVTPZ1ESfDJd10/OFybNfm22H7ftPjCm0/OFxbNXm3WH7ftPjiIE32yPumsRfbFD5qiKbR66QXFtlfdN4i+2KHzVEUyn11MX32G/XkXnmkX57TM/nJx6EXOhvq3ZdH0xisT+YYeevkXHmj357TM/nKg9EpKmtEuU/TG5/ijIfzzYOcVArtf2u8OmLGSVFcYepczJGdYK9cYyjgh6fpaYnD2SbxrczhypkImNNmTsS8nRtHLq9nkyl9UbkEFd3fpsLihGu71jeZfcCTRpHE+qnOPEqoNUuG1a9v1YrK95nfN+GOnXi2eQv8Ax7oRdai5eeVr26jnnpa+nClueZz+MfDnkcjHlXXPz1p+nD889Tf07/xFMc8CvbH45vn9Np/KHKLiVutP00WhsmyS10bUWGUI14yv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"],"sum":"Description\nKHÓA CỬA THÔNG MINH HUBERT HB CG26F – CÔNG NGHỆ HIỆN ĐẠI, AN TOÀN TUYỆT ĐỐI \nTrong thời đại công nghệ 4.0, khóa cửa thông minh trở thành lựa chọn tối ưu cho những ai đề cao tính bảo mật, tiện lợi và hiện đại trong không gian sống. Hubert HB CG26F là dòng khóa điện tử cao cấp tích hợp nhiều công nghệ tiên tiến, đặc biệt là nhận diện khuôn mặt 3D , mang lại trải nghiệm sử dụng an toàn và đẳng cấp cho gia đình và doanh nghiệp.\nNHỮNG TÍNH NĂNG NỔI BẬT CỦA HUBERT HB CG26F \nCông nghệ mở khóa hiện đại – bảo mật tối ưu \nNhận diện khuôn mặt 3D : \nMở khóa siêu tốc chỉ trong 0,5 giây. Khả năng hoạt động chính xác trong điều kiện thiếu sáng và chống giả mạo khuôn mặt.\nMở khóa từ xa qua WiFi : Kết nối qua ứng dụng Wishome  \ncho phép mở khóa và theo dõi lịch sử sử dụng ngay trên điện thoại.\nCảm biến vân tay FPC Thụy Điển : Nhận diện chính xác, bảo mật cao, thời gian phản hồi chỉ 0,5 giây.\nMật khẩu bảo mật cao : Hỗ trợ mã số dài tới 32 ký tự, có chức năng xáo trộn số để chống nhìn trộm.\nThẻ từ: Quét nhanh, tiện lợi, phù hợp cho người già và trẻ nhỏ\nChìa khóa cơ chống sao chép : Dự phòng trong trường hợp khẩn cấp, đảm bảo an toàn cao hơn\nAn toàn vượt trội \nCảnh báo xâm nhập : Kích hoạt còi báo động khi có hành vi phá khóa hoặc nhập sai mã/vân tay nhiều lần.\nChế độ bảo mật riêng tư : Có thể khóa từ bên trong để đảm bảo an toàn tuyệt đối khi cần thiết.\nPin sạc lithium 5000mAh : Dung lượng lớn, tiết kiệm năng lượng, có thể sử dụng trong thời gian dài mà không cần thay pin thường xuyên.\nCamera hiển thị hình ảnh : Cho phép quan sát trực tiếp người đang đứng trước cửa, tăng cường bảo vệ và nhận diện.\nFace ID 3D siêu nhanh : Nhận diện chính xác, kể cả khi có thay đổi nhẹ trên khuôn mặt.\nChống cháy nổ – chống giật : Trang bị bo mạch chống chập điện, đảm bảo an toàn tuyệt đối trong điều kiện khí hậu nóng ẩm tại Việt Nam.\nTHÔNG SỐ KỸ THUẬT","desc":"Description\nKHÓA CỬA THÔNG MINH HUBERT HB CG26F – CÔNG NGHỆ HIỆN ĐẠI, AN TOÀN TUYỆT ĐỐI \nTrong thời đại công nghệ 4.0, khóa cửa thông minh trở thành lựa chọn tối ưu cho những ai đề cao tính bảo mật, tiện lợi và hiện đại trong không gian sống. Hubert HB CG26F là dòng khóa điện tử cao cấp tích hợp nhiều công nghệ tiên tiến, đặc biệt là nhận diện khuôn mặt 3D , mang lại trải nghiệm sử dụng an toàn và đẳng cấp cho gia đình và doanh nghiệp.\nNHỮNG TÍNH NĂNG NỔI BẬT CỦA HUBERT HB CG26F \nCông nghệ mở khóa hiện đại – bảo mật tối ưu \nNhận diện khuôn mặt 3D : \nMở khóa siêu tốc chỉ trong 0,5 giây. Khả năng hoạt động chính xác trong điều kiện thiếu sáng và chống giả mạo khuôn mặt.\nMở khóa từ xa qua WiFi : Kết nối qua ứng dụng Wishome  \ncho phép mở khóa và theo dõi lịch sử sử dụng ngay trên điện thoại.\nCảm biến vân tay FPC Thụy Điển : Nhận diện chính xác, bảo mật cao, thời gian phản hồi chỉ 0,5 giây.\nMật khẩu bảo mật cao : Hỗ trợ mã số dài tới 32 ký tự, có chức năng xáo trộn số để chống nhìn trộm.\nThẻ từ: Quét nhanh, tiện lợi, phù hợp cho người già và trẻ nhỏ\nChìa khóa cơ chống sao chép : Dự phòng trong trường hợp khẩn cấp, đảm bảo an toàn cao hơn\nAn toàn vượt trội \nCảnh báo xâm nhập : Kích hoạt còi báo động khi có hành vi phá khóa hoặc nhập sai mã/vân tay nhiều lần.\nChế độ bảo mật riêng tư : Có thể khóa từ bên trong để đảm bảo an toàn tuyệt đối khi cần thiết.\nPin sạc lithium 5000mAh : Dung lượng lớn, tiết kiệm năng lượng, có thể sử dụng trong thời gian dài mà không cần thay pin thường xuyên.\nCamera hiển thị hình ảnh : Cho phép quan sát trực tiếp người đang đứng trước cửa, tăng cường bảo vệ và nhận diện.\nFace ID 3D siêu nhanh : Nhận diện chính xác, kể cả khi có thay đổi nhẹ trên khuôn mặt.\nChống cháy nổ – chống giật : Trang bị bo mạch chống chập điện, đảm bảo an toàn tuyệt đối trong điều kiện khí hậu nóng ẩm tại Việt Nam.\nTHÔNG SỐ KỸ THUẬT","specs":{"Công nghệ di chuyển":"AIVI 3D + LSD","Điều khiển qua App":"Ecovacs Home","Dòng":"Lau hút đồng thời","Dung tích hộp nước":"240ml","Dung tích Hộp rác":"470ml","Dung lượng PIN":"5200mAh","Hạng mục":"Chi tiết","Lưu trữ":"100 vân tay, 100 thẻ từ, 100 mã số, 30 khuôn mặt","Chất liệu":"Hợp kim nhôm + ABS cao cấp","Kích thước cửa phù hợp":"Độ dày từ 40–90mm, độ rộng đố cửa tối thiểu 80mm","Ruột khóa":"Chuẩn 6068 – độ bền cao, chống cắt phá"},"feats":["Description","KHÓA CỬA THÔNG MINH HUBERT HB CG26F – CÔNG NGHỆ HIỆN ĐẠI, AN TOÀN TUYỆT ĐỐI","NHỮNG TÍNH NĂNG NỔI BẬT CỦA HUBERT HB CG26F","Công nghệ mở khóa hiện đại – bảo mật tối ưu","Nhận diện khuôn mặt 3D :","Mở khóa từ xa qua WiFi : Kết nối qua ứng dụng Wishome","Thẻ từ: Quét nhanh, tiện lợi, phù hợp cho người già và trẻ nhỏ","Chìa khóa cơ chống sao chép : Dự phòng trong trường hợp khẩn cấp, đảm bảo an toàn cao hơn","An toàn vượt trội","THÔNG SỐ KỸ THUẬT"],"sku":"HB CG26F","vid":"","mod":"HB CG26F","brand":"Hubert","slug":"hb-cg26f-khoa-cua-dien-tu-hubert-hb-cg26f","_source":"avatar2-add-product","_source_url":"https://hubert.vn/san-pham/khoa-cua-dien-tu-hubert-hb-cg26f/","_added_at":"2026-10-05T11:47:23.592Z"},{"n":"Máy rửa bát bán âm Bosch SMI6ZCS16E","l":"https://boschhome.com.vn/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6/?gad_source=1&gad_campaignid=22745767436&gbraid=0AAAAADb_g-0El2armGKS39qd1R78_yI48&gclid=CjwKCAjwoOjVBhArEiwAUwDak0nrb40nNozRXxxsskhVCjxPMlk1m3LuWIO62B0qSStfBLeOrLwNURoCITEQAvD_BwEhe&gclid=CjwKCAjwoOjVBhArEiwAUwDak8ZiRw14XwGNOwXbbV8yd7PcMcea4meRjuQ-PZY0im_HG9Z-qIFTPRoCpz4QAvD_BwEjwKCAjwoOjVBhArEiwAUwDakxtuAv3vMNheBF7y8iFuvYwR7dyzBXqRBguZh1xF2AQ0c-1uySLETBoCI2wQAvD_BwE","i":"https://b1.congngheviet.com.vn/file/s2-hc03/boschhome-com-vn/wp-content/uploads/2024/11/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6.jpg","p":"Giá niêm yết: 38.500.000đ — Giá KM: 23.200.000đ","pn":23200000,"listPn":38500000,"salePn":23200000,"priceMode":"both","c":"Máy rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://b1.congngheviet.com.vn/file/s2-hc03/boschhome-com-vn/wp-content/uploads/2024/11/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6.jpg"],"sum":"Với dung tích rửa lớn lên đến 14 bộ chén đĩa châu Âu cùng 8 chương trình rửa cơ bản đa dạng, 3 chương trình rửa bổ sung và được tích hợp rất nhiều công nghệ hiện đại như tính năng điều khiển từ xa Home Connect, công nghệ sấy khô Zeolith cao cấp, hệ thống 3 giàn rửa linh hoạt,… SMI6ZCS16E chính là trợ thủ đắc lực giúp công việc dọn dẹp sau nấu nướng trở nên dễ dàng và đơn giản hơn bao giờ hết. \nƯu điểm \nThời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng. \nKiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. . \nChất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng. \nBảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa. \nDung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa. \nSở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình. \nChức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn. \nCông nghệ Home Connect giúp bạn kết nối và điều khiển máy rửa bát từ xa. Giúp bạn cập nhật lượng tiêu thụ điện nước và chất tẩy rửa, cập nhật tình trạng máy, điều khiển từ xa, điều khiển từ xa bằng giọng nói một cách vô cùng tiện lợi với các thao tác dễ dàng. \nSấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn. \nChương trình rửa thông minh Intelligent được tích hợp ở những dòng máy rửa bát cao cấp của Bosch, giúp tự động điều chỉnh quá trình rửa bát. Sau khi chương trình rửa kết thúc, người dùng có thể đánh giá kết quả làm sạch và làm khô thông qua ứng dụng Home Connect. Dựa vào dữ liệu trên, máy rửa bát sẽ tự động điều chỉnh các cài đặt và đề xuất người dùng một vài lựa chọn thay thế. \nChương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại. \nTăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus. \nTăng áp lực nước rửa giàn dưới cùng với tính năng vùng rửa chuyên sâu IntensiveZone và giàn giữa với hệ thống thủy lực Extra Clean Zone giúp bạn loại bỏ hoàn toàn các vết bẩn cứng đầu trên những vật dụng khó rửa. \nThiết kế 3 khay rửa thông minh, linh hoạt giúp tối ưu lượng bát đĩa, nồi chảo khi xếp vào máy. Đặc biệt, giàn giữa có thể điều chỉnh nâng lên và hạ xuống thêm 5 cm dễ dàng chỉ bằng thao tác chạm cần gạt. \nĐộng cơ không chổi than EcoSilence Drive mang lại chất lượng rửa cao với độ ồn thấp, đảm bảo thiết bị hoạt động trơn tru và yên tĩnh. \nNhược điểm \nChưa được trang bị tính năng rửa nửa tải (HalfLoad). \nTính năng  \nHẹn giờ. \nKhóa phím điều khiển bảo vệ trẻ em. \nCảm biến nhận biết độ sạch của nước. \n8 chương trình cài đặt sẵn: rửa tự động (Auto 45 – 65°C), rửa tiết kiệm (Eco 50°C), rửa chuyên sâu (Intensive 70°C), rửa thông minh (Intelligent), rửa nhanh (Express 60°C), rửa yên tĩnh (Silence 50°C), chương trình rửa yêu thích (Favourite), rửa ly (Glass 40°C). \n3 chương trình rửa bổ sung: tăng tốc độ rửa SpeedPerfect Plus, vùng rửa chuyên sâu Intensize Zone, sấy tăng cường Extra Dry. \nCông nghệ Home Connect kết nối và điều khiển máy rửa bát từ xa. \nCông nghệ ActiveWater giúp tối ưu lượng nước rửa từng chu kỳ. \nChức năng Machine Care tự động vệ sinh khoang máy rửa bát. \nVùng làm sạch thêm ExtraClean Zone với 3 vòi phun nước xoay giúp làm sạch triệt để bát đũa của bạn với lượng nước gấp 3 lần mà không cần thêm chất tẩy rửa hay tăng nhiệt độ. \nHệ thống Dosage Assistant giúp hòa tan và phân bổ đồng đều chất tẩy rửa. \nCảm biến tải LoadSensor giúp tiết kiệm nước và năng lượng khi làm sạch số lượng bát đĩa ít hơn. \nCảm biến nước AquaSensor giúp điều chỉnh lượng nước dựa vào độ bẩn của bát đĩa. \nKhử khuẩn bằng nước nóng. \nBáo thiếu muối. \nBáo thiếu chất tẩy rửa. \nBáo thiếu nước làm bóng. \nTự động báo lỗi và dừng hoạt động khi có vấn đề về nguồn cấp nước (Cảm biến AquaStop). \nThiết bị bảo vệ chống sét lan truyền. \nThông số kỹ thuật","desc":"Với dung tích rửa lớn lên đến 14 bộ chén đĩa châu Âu cùng 8 chương trình rửa cơ bản đa dạng, 3 chương trình rửa bổ sung và được tích hợp rất nhiều công nghệ hiện đại như tính năng điều khiển từ xa Home Connect, công nghệ sấy khô Zeolith cao cấp, hệ thống 3 giàn rửa linh hoạt,… SMI6ZCS16E chính là trợ thủ đắc lực giúp công việc dọn dẹp sau nấu nướng trở nên dễ dàng và đơn giản hơn bao giờ hết. \nƯu điểm \nThời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng. \nKiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. . \nChất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng. \nBảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa. \nDung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa. \nSở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình. \nChức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn. \nCông nghệ Home Connect giúp bạn kết nối và điều khiển máy rửa bát từ xa. Giúp bạn cập nhật lượng tiêu thụ điện nước và chất tẩy rửa, cập nhật tình trạng máy, điều khiển từ xa, điều khiển từ xa bằng giọng nói một cách vô cùng tiện lợi với các thao tác dễ dàng. \nSấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn. \nChương trình rửa thông minh Intelligent được tích hợp ở những dòng máy rửa bát cao cấp của Bosch, giúp tự động điều chỉnh quá trình rửa bát. Sau khi chương trình rửa kết thúc, người dùng có thể đánh giá kết quả làm sạch và làm khô thông qua ứng dụng Home Connect. Dựa vào dữ liệu trên, máy rửa bát sẽ tự động điều chỉnh các cài đặt và đề xuất người dùng một vài lựa chọn thay thế. \nChương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại. \nTăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus. \nTăng áp lực nước rửa giàn dưới cùng với tính năng vùng rửa chuyên sâu IntensiveZone và giàn giữa với hệ thống thủy lực Extra Clean Zone giúp bạn loại bỏ hoàn toàn các vết bẩn cứng đầu trên những vật dụng khó rửa. \nThiết kế 3 khay rửa thông minh, linh hoạt giúp tối ưu lượng bát đĩa, nồi chảo khi xếp vào máy. Đặc biệt, giàn giữa có thể điều chỉnh nâng lên và hạ xuống thêm 5 cm dễ dàng chỉ bằng thao tác chạm cần gạt. \nĐộng cơ không chổi than EcoSilence Drive mang lại chất lượng rửa cao với độ ồn thấp, đảm bảo thiết bị hoạt động trơn tru và yên tĩnh. \nNhược điểm \nChưa được trang bị tính năng rửa nửa tải (HalfLoad). \nTính năng  \nHẹn giờ. \nKhóa phím điều khiển bảo vệ trẻ em. \nCảm biến nhận biết độ sạch của nước. \n8 chương trình cài đặt sẵn: rửa tự động (Auto 45 – 65°C), rửa tiết kiệm (Eco 50°C), rửa chuyên sâu (Intensive 70°C), rửa thông minh (Intelligent), rửa nhanh (Express 60°C), rửa yên tĩnh (Silence 50°C), chương trình rửa yêu thích (Favourite), rửa ly (Glass 40°C). \n3 chương trình rửa bổ sung: tăng tốc độ rửa SpeedPerfect Plus, vùng rửa chuyên sâu Intensize Zone, sấy tăng cường Extra Dry. \nCông nghệ Home Connect kết nối và điều khiển máy rửa bát từ xa. \nCông nghệ ActiveWater giúp tối ưu lượng nước rửa từng chu kỳ. \nChức năng Machine Care tự động vệ sinh khoang máy rửa bát. \nVùng làm sạch thêm ExtraClean Zone với 3 vòi phun nước xoay giúp làm sạch triệt để bát đũa của bạn với lượng nước gấp 3 lần mà không cần thêm chất tẩy rửa hay tăng nhiệt độ. \nHệ thống Dosage Assistant giúp hòa tan và phân bổ đồng đều chất tẩy rửa. \nCảm biến tải LoadSensor giúp tiết kiệm nước và năng lượng khi làm sạch số lượng bát đĩa ít hơn. \nCảm biến nước AquaSensor giúp điều chỉnh lượng nước dựa vào độ bẩn của bát đĩa. \nKhử khuẩn bằng nước nóng. \nBáo thiếu muối. \nBáo thiếu chất tẩy rửa. \nBáo thiếu nước làm bóng. \nTự động báo lỗi và dừng hoạt động khi có vấn đề về nguồn cấp nước (Cảm biến AquaStop). \nThiết bị bảo vệ chống sét lan truyền. \nThông số kỹ thuật","specs":{"Loại máy rửa chén":"Bán tích hợp","Bảng điều khiển phía trước":"Có","Nhãn năng lượng":"B","Độ ồn tối đa":"40dB","Xây dựng chất lượng":"Cao cấp","Chất lượng giặt":"Cao cấp","Bảng điều khiển vị trí":"Ngoài","Vị trí thiết bị":"Được xây dựng trong","Chiều cao thích hợp":"81,5 – 87,5cm","Chiều rộng thích hợp":"60 – 60,8cm","Chiều sâu thích hợp":"55 cm","Chiều cao của bảng điều khiển phía trước":"54,1 – 61,1cm","Hệ thống bản lề":"Cửa trên cửa","Chiều cao":"81,5 cm","Chiều rộng":"59,8 cm","Chiều sâu":"57,3 cm","Chân có thể điều chỉnh":"Có","Đầu có thể tháo rời":"–","Cân nặng":"47,1kg","Loại ngăn đựng dao kéo":"Ngăn kéo","Khay dao kéo có thể điều chỉnh độ cao":"–","Không gian để bát đĩa":"Nhiều, Trung bình","Số lượng cài đặt địa điểm":"14","Bố cục có thể tùy chỉnh":"Có","Giá trên có thể điều chỉnh":"Có","Giá đỡ trên có thể gập lại":"Có","Có thể gập lại hỗ trợ giá đỡ thấp hơn":"Có","Rất phù hợp với các loại món ăn":"Bình sữa trẻ em, Chảo nướng, Bát đĩa nửa tải, Nồi và chảo lớn, Hộp nhựa, Ly uống rượu (23cm)","Chiếu sáng nội thất":"Có","Chương trình giặt":"Chu kỳ tự động, tiết kiệm, chuyên sâu, ngắn, im lặng","Chức năng nửa tải":"–","Cảm biến tải":"–","Chức năng chu kỳ rút ngắn":"Có","Chiếu sàn":"Không","Giá đỡ dưới có chức năng nâng":"–","Phát hiện chất tẩy rửa":"Có","Nạp chất tẩy rửa máy rửa chén tự động":"–","Chỉ báo nạp muối":"Có","Chỉ báo nạp nước trợ xả":"Có","Tín hiệu kết thúc chu kỳ":"Có","Loại tín hiệu kết thúc chu kỳ":"Quang học","Khóa an toàn trẻ em":"Có","Số nhiệt độ làm sạch":"6","Nhiệt độ làm sạch tối đa":"70°C","Phương pháp sấy":"Zeolit ​​(bát khô thêm)","Vùng chuyên sâu":"Có","Hạng tốc độ":"Nhanh","Điều khiển qua ứng dụng":"Có","Điều khiển máy sấy qua ứng dụng":"Vận hành từ xa, Đọc thông tin qua ứng dụng","Bắt đầu trì hoãn":"Có","Bắt đầu phân chia độ trễ":"1 – 24 giờ","Tùy chọn tắt tự động":"Có","Ngôn ngữ bảng điều khiển":"Tiếng Anh, Ký hiệu","Chi phí năng lượng hàng năm":"72,8 euro","Tiêu thụ năng lượng hàng năm":"182 kWh","Tiêu thụ năng lượng trên mỗi chu kỳ":"0,65 kWh","Chức năng tiết kiệm năng lượng":"Tự động tắt, Chu trình tiết kiệm năng lượng, Cấp nước nóng, Lượng nước sử dụng được xác định theo mức độ bẩn","Thời lượng chu kỳ sinh thái":"215 phút","Chi phí nước hàng năm":"3,53 euro","Lượng nước sử dụng hàng năm":"2520 lít","Lượng nước sử dụng mỗi chu kỳ":"9 lít","Thân thiện với môi trường":"Đúng","Số lượng vòi phun tay phun":"2","Loại động cơ":"Biến tần","Chất liệu nội thất":"Thép không gỉ","Đầu nối nước":"Nước lạnh và nước ấm","Bảo vệ rò rỉ":"Có","Loại bảo vệ rò rỉ":"Cảm biến rò rỉ đáy, Bảo vệ chống tràn, Ống an toàn","Ống đầu vào có thể tháo rời":"–","Ống thoát nước có thể tháo rời":"–","Chiều dài ống đầu vào":"1,65 m","Loại nguồn điện":"Mạng lưới điện","Nguồn điện tối thiểu":"2400W"},"feats":["Thời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng.","Kiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. .","Chất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng.","Bảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa.","Dung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa.","Sở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình.","Chức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn.","Sấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn.","Chương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại.","Tăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus."],"sku":"SMI6ZCS16E","vid":"","mod":"SMI6ZCS16E","brand":"Bosch","slug":"smi6zcs16e-may-rua-bat-ban-am-bosch-smi6zcs16e","_source":"avatar2-add-product","_source_url":"https://boschhome.com.vn/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6/?gad_source=1&gad_campaignid=22745767436&gbraid=0AAAAADb_g-0El2armGKS39qd1R78_yI48&gclid=CjwKCAjwoOjVBhArEiwAUwDak0nrb40nNozRXxxsskhVCjxPMlk1m3LuWIO62B0qSStfBLeOrLwNURoCITEQAvD_BwEhe&gclid=CjwKCAjwoOjVBhArEiwAUwDak8ZiRw14XwGNOwXbbV8yd7PcMcea4meRjuQ-PZY0im_HG9Z-qIFTPRoCpz4QAvD_BwEjwKCAjwoOjVBhArEiwAUwDakxtuAv3vMNheBF7y8iFuvYwR7dyzBXqRBguZh1xF2AQ0c-1uySLETBoCI2wQAvD_BwE","_added_at":"2026-10-02T09:16:45.887Z"},{"n":"KHAY CHIA THÌA NĨA ĐA NĂNG CHẤT LIỆU NHỰA PP CAO CẤP XT.P900 / XT.P900-1 - Grandx","l":"https://grandx.com.vn/product/khay-chia-thia-nia-da-nang-chat-lieu-nhua-pp-cao-cap-xt-p900","i":"https://grandx.com.vn/wp-content/uploads/2024/12/XT.P600.P900-2.jpg","p":"940.000đ","pn":940000,"listPn":0,"salePn":940000,"priceMode":"both","c":"Khay chia thìa, dĩa","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/XT.P600.P900-2.jpg"],"sum":"Đặc tính sản phẩm \nKhay chia thìa nĩa\nChất liệu nhựa cao cấp PP chịu nhiệt\nĐạt các têu chuẩn vệ sinh an toàn cho sức khỏe được\nkiểm tra chứng nhận bởi FDA\nKích thước sản phẩm đa dạng, dễ lắp đặt, dễ vệ sinh \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “KHAY CHIA THÌA NĨA ĐA NĂNG CHẤT LIỆU NHỰA PP CAO CẤP XT.P900 / XT.P900-1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"Đặc tính sản phẩm \nKhay chia thìa nĩa\nChất liệu nhựa cao cấp PP chịu nhiệt\nĐạt các têu chuẩn vệ sinh an toàn cho sức khỏe được\nkiểm tra chứng nhận bởi FDA\nKích thước sản phẩm đa dạng, dễ lắp đặt, dễ vệ sinh \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “KHAY CHIA THÌA NĨA ĐA NĂNG CHẤT LIỆU NHỰA PP CAO CẤP XT.P900 / XT.P900-1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Tên sản phẩm":"Khay chia thìa dĩa đa năng chất liệu nhựa PP cao cấp XT.P900 / XT.P900-1","Chất liệu":"PP","Đặc tính sản phẩm":"Màu Dark Grey","Kích thước sản phẩm (mm)":"W850*D490*H55","Chiều rộng tủ (mm)":"900","Đơn vị":"Cái"},"feats":["Đặc tính sản phẩm","Khay chia thìa nĩa","Chất liệu nhựa cao cấp PP chịu nhiệt","Đạt các têu chuẩn vệ sinh an toàn cho sức khỏe được","kiểm tra chứng nhận bởi FDA","Kích thước sản phẩm đa dạng, dễ lắp đặt, dễ vệ sinh","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"sku":"XTP900","vid":"","mod":"XTP900","brand":"GrandX","slug":"xtp900-khay-chia-thia-nia-da-nang-chat-lieu-nhua-pp-cao-cap-xt-p900-xt-p900-1-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/khay-chia-thia-nia-da-nang-chat-lieu-nhua-pp-cao-cap-xt-p900","_added_at":"2026-10-05T14:40:35.177Z"},{"n":"GIÁ XOONG NỒI TITANIUM XP.90T - Grandx","l":"https://grandx.com.vn/product/gia-xoong-noi-titanium-xp-90t","i":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-7.png","p":"6.100.000đ","pn":6100000,"listPn":0,"salePn":6100000,"priceMode":"both","c":"Giá bát đĩa, Xoong nồi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-7.png"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng xoong nồi với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc tối ưu hóa vật liệu, kết cấu và công năng lưu trữ , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc … đáy phủ lớp chống trượt chống va đập đồ. \nGiá xoong nồi GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ XOONG NỒI TITANIUM XP.90T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng xoong nồi với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc tối ưu hóa vật liệu, kết cấu và công năng lưu trữ , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc … đáy phủ lớp chống trượt chống va đập đồ. \nGiá xoong nồi GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ XOONG NỒI TITANIUM XP.90T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XP.90T","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R864*S470*C226","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"feats":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"sku":"XP.90T","vid":"","mod":"XP.90T","brand":"GrandX","slug":"xp-90t-gia-xoong-noi-titanium-xp-90t-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-xoong-noi-titanium-xp-90t","_added_at":"2026-10-05T11:47:15.505Z"},{"n":"GIÁ BÁT ĐĨA TITANIUM XD.90T - Grandx","l":"https://grandx.com.vn/product/gia-bat-dia-titanium-xd-90t","i":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png","p":"9.300.000đ","pn":9300000,"listPn":0,"salePn":9300000,"priceMode":"both","c":"Giá bát đĩa, Xoong nồi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng bát đĩa, với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc lưu trữ tối ưu hóa vật liệu, kết cấu và công năng , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc …đáy phủ lớp chống trượt chống va đập đồ. \nGiá bát đĩa GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \n","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng bát đĩa, với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc lưu trữ tối ưu hóa vật liệu, kết cấu và công năng , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc …đáy phủ lớp chống trượt chống va đập đồ. \nGiá bát đĩa GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \n","specs":{"Mã sản phẩm":"XD.80T","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R864*S470*C226","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"feats":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"sku":"XD.80T","vid":"","mod":"XD.80T","brand":"GrandX","slug":"xd-80t-gia-bat-dia-titanium-xd-90t-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-bat-dia-titanium-xd-90t","_added_at":"2026-10-19T02:19:15.599Z"},{"n":"GIÁ GIA VỊ 3 TẦNG ĐỘC LẬP TITANIUM XS.40MT - Grandx","l":"https://grandx.com.vn/product/gia-gia-vi-3-tang-doc-lap-titanium-xs-40mt","i":"https://grandx.com.vn/wp-content/uploads/2024/12/XS.40MT-1024x683.jpg","p":"11.130.000đ","pn":11130000,"listPn":0,"salePn":11130000,"priceMode":"both","c":"Giá dao thớt, gia vị","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/XS.40MT-1024x683.jpg"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị 3 tầng Grand X với 02 ngăn kéo trên thu gọn trong hộc tủ treo vào tủ độc lập tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng\nnhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nNgăn kéo dưới cùng hỗ trợ lưu trữ được hầu hết các loại gia vị và chai lọ giúp ngăn nắp, gọn gàng cho không gian bếp \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp\ncho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ 3 TẦNG ĐỘC LẬP TITANIUM XS.40MT” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị 3 tầng Grand X với 02 ngăn kéo trên thu gọn trong hộc tủ treo vào tủ độc lập tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng\nnhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nNgăn kéo dưới cùng hỗ trợ lưu trữ được hầu hết các loại gia vị và chai lọ giúp ngăn nắp, gọn gàng cho không gian bếp \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp\ncho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ 3 TẦNG ĐỘC LẬP TITANIUM XS.40MT” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XS.40MT","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R364*S447*C548","Kích thước lọt lòng tủ (mm)":"364","Chiều rộng tủ (mm)":"400"},"feats":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"sku":"XS.40MT","vid":"","mod":"XS.40MT","brand":"GrandX","slug":"xs-40mt-gia-gia-vi-3-tang-doc-lap-titanium-xs-40mt-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-gia-vi-3-tang-doc-lap-titanium-xs-40mt","_added_at":"2026-10-05T14:40:29.986Z"},{"n":"MÂM XOAY 3/4 -270° XC.270.80S1 - Grandx","l":"https://grandx.com.vn/product/mam-xoay-3-4-270-xc-270-80s1","i":"https://grandx.com.vn/wp-content/uploads/2025/03/XC.270.80S.png","p":"3.810.000đ","pn":3810000,"listPn":0,"salePn":3810000,"priceMode":"sale","c":"Kệ góc, mâm xoay liên hoàn","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2025/03/XC.270.80S.png"],"sum":"Đặc tính sản phẩm \nKệ góc mâm xoay góc mở 3/4 -270° \nChất liệu SUS304 nan dẹt\nBề mặt hoàn thiện điện hóa xước mờ \nKhung thép Carbon sơn nhiệt\nHệ chuyển động trục nhẹ nhàng êm ái\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “MÂM XOAY 3/4 -270° XC.270.80S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"Đặc tính sản phẩm \nKệ góc mâm xoay góc mở 3/4 -270° \nChất liệu SUS304 nan dẹt\nBề mặt hoàn thiện điện hóa xước mờ \nKhung thép Carbon sơn nhiệt\nHệ chuyển động trục nhẹ nhàng êm ái\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “MÂM XOAY 3/4 -270° XC.270.80S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Tên sản phẩm":"Mâm xoay 3/4 -270° XC.270.80S1","Kích thước sản phẩm":"R710*S800-900*C(600-800)","Đơn vị":"Bộ","Chiều rộng tủ":"800","Khoảng mở cánh":"≥ 370mm","Chiều sâu tủ":"≥530mm","Chiều cao":"620-800mm","Lưu ý":"Để thuận tện cho việc sử dụng quý khách nên thiết kế khoảng hở chiều rộng cánh ≥ 400mm"},"feats":["Đặc tính sản phẩm","Kệ góc mâm xoay góc mở 3/4 -270°","Chất liệu SUS304 nan dẹt","Bề mặt hoàn thiện điện hóa xước mờ","Khung thép Carbon sơn nhiệt","Hệ chuyển động trục nhẹ nhàng êm ái","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"sku":"XC27080S1","vid":"","mod":"XC27080S1","brand":"GrandX","slug":"xc27080s1-mam-xoay-3-4-270-xc-270-80s1-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/mam-xoay-3-4-270-xc-270-80s1","_added_at":"2026-10-05T14:40:28.077Z"},{"n":"Tủ đồ khô cánh mở GrandX XPR.600S","l":"https://grandx.com.vn/product/tu-do-kho-canh-mo-xpr-600s","i":"https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg","p":"14.850.000đ","pn":14850000,"listPn":0,"salePn":14850000,"priceMode":"both","c":"Tủ đồ khô","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg"],"sum":"Tủ đồ khô cánh mở XPR.600S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.600S \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.600S được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.600S còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.600S nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 564 mm , dành riêng cho các khoang tủ rộng 600mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.600S được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.600S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.600S chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “TỦ ĐỒ KHÔ CÁNH MỞ XPR.600S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"Tủ đồ khô cánh mở XPR.600S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.600S \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.600S được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.600S còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.600S nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 564 mm , dành riêng cho các khoang tủ rộng 600mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.600S được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.600S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.600S chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “TỦ ĐỒ KHÔ CÁNH MỞ XPR.600S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XPR.600S1","Chất liệu":"INOX SUS 304","Kích thước sản phẩm (mm)":"R530*S500*C(1650-1950)","Kích thước lọt lòng tủ (mm)":"≥ 564","Chiều rộng tủ (mm)":"600","Số tầng rổ":"6 tầng","Tải trọng mỗi tầng":"Tối đa 5kg"},"feats":["Khả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.","Bề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.","Khung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp."],"sku":"XPR.600S1","vid":"","mod":"XPR.600S1","brand":"GrandX","slug":"xpr-600s1-tu-do-kho-canh-mo-grandx-xpr-600s","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/tu-do-kho-canh-mo-xpr-600s","_added_at":"2026-10-05T14:40:26.730Z"},{"n":"Kệ chén dĩa bản bắt mặt hộc inox 304 - Phụ kiện tủ bếp Higold 303304","l":"https://phukienbepthanhdat.com/ke-chen-dia-ban-bat-mat-hoc-inox-304-303304-900mm-higold/","i":"https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303301.jpg","p":"4.140.000đ","pn":4140000,"listPn":0,"salePn":4140000,"priceMode":"both","c":"Kệ chén dĩa","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303301.jpg"],"sum":"Kệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 (303304 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303304. Đây là kệ để chén đĩa bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm, kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu.\nKệ Chén Dĩa Bản được sản xuất theo công nghệ hiện đại của Đức, đạt tiêu chuẩn chất lượng Châu Âu. Thiết kế của sản phẩm phù hợp với mọi loại bếp hiện đại.\nĐiểm nổi bật của sản phẩm là các công năng thông minh giúp sắp xếp chén đĩa, đũa muỗng,… ngăn nắp trong hộc tủ. Kệ còn được trang bị hệ thống ray trượt giảm chấn êm ái, đẩy kệ ra vào rất nhẹ nhàng.\nKệ Chén Dĩa Bản giúp bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều kích thước đa dạng.\nKệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng đồ đạc trong tủ bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian lưu trữ và là điểm nhấn cho một không gian bếp hoàn hảo.\n","desc":"Kệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 (303304 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303304. Đây là kệ để chén đĩa bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm, kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu.\nKệ Chén Dĩa Bản được sản xuất theo công nghệ hiện đại của Đức, đạt tiêu chuẩn chất lượng Châu Âu. Thiết kế của sản phẩm phù hợp với mọi loại bếp hiện đại.\nĐiểm nổi bật của sản phẩm là các công năng thông minh giúp sắp xếp chén đĩa, đũa muỗng,… ngăn nắp trong hộc tủ. Kệ còn được trang bị hệ thống ray trượt giảm chấn êm ái, đẩy kệ ra vào rất nhẹ nhàng.\nKệ Chén Dĩa Bản giúp bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều kích thước đa dạng.\nKệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng đồ đạc trong tủ bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian lưu trữ và là điểm nhấn cho một không gian bếp hoàn hảo.\n","specs":{},"feats":["Kệ Chén Dĩa Dạng Bản Inox 304 (303311 – 600mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303201 – 600mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303202 – 700mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303203 – 800mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303204 – 900mm) – Higold"],"sku":"303304","vid":"","mod":"303304","brand":"Higold","slug":"303304-ke-chen-dia-ban-bat-mat-hoc-inox-304-phu-kien-tu-bep-higold-303304","_source":"avatar2-add-product","_source_url":"https://phukienbepthanhdat.com/ke-chen-dia-ban-bat-mat-hoc-inox-304-303304-900mm-higold/","_added_at":"2026-10-05T14:40:24.873Z"},{"n":"Kệ xoong bản bắt mặt hộc inox 304 - Phụ kiện tủ bếp Higold","l":"https://phukienbepthanhdat.com/ke-xoong-ban-bat-mat-hoc-inox-304-303204-900mm-higold/","i":"https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303201.jpg","p":"2.960.000đ","pn":2960000,"listPn":0,"salePn":2960000,"priceMode":"both","c":"Kệ xoong nồi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303201.jpg"],"sum":"Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303204 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303204. Đây là kệ đựng xoong nồi bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm và kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu HIGOLD.\nKệ Xoong Bản được sản xuất theo công nghệ tiên tiến của Đức, đạt tiêu chuẩn chất lượng cao của Châu Âu. Thiết kế của sản phẩm hoàn toàn phù hợp với các loại bếp hiện đại.\nĐiểm nổi bật của Kệ Xoong Bản là các tính năng thông minh giúp sắp xếp gọn gàng các đồ dùng nhà bếp như xoong, nồi, chảo, ấm đun,… ngăn nắp trong hộc tủ. Kệ được trang bị hệ thống ray trượt giảm chấn êm ái, kéo rút nhẹ nhàng.\nKệ Xoong Bản có tác dụng bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều lựa chọn kích thước khác nhau.\nKệ Xoong Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng các vật dụng nhà bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian và là điểm nhấn cho một không gian bếp hoàn hảo.\n","desc":"Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303204 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303204. Đây là kệ đựng xoong nồi bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm và kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu HIGOLD.\nKệ Xoong Bản được sản xuất theo công nghệ tiên tiến của Đức, đạt tiêu chuẩn chất lượng cao của Châu Âu. Thiết kế của sản phẩm hoàn toàn phù hợp với các loại bếp hiện đại.\nĐiểm nổi bật của Kệ Xoong Bản là các tính năng thông minh giúp sắp xếp gọn gàng các đồ dùng nhà bếp như xoong, nồi, chảo, ấm đun,… ngăn nắp trong hộc tủ. Kệ được trang bị hệ thống ray trượt giảm chấn êm ái, kéo rút nhẹ nhàng.\nKệ Xoong Bản có tác dụng bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều lựa chọn kích thước khác nhau.\nKệ Xoong Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng các vật dụng nhà bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian và là điểm nhấn cho một không gian bếp hoàn hảo.\n","specs":{},"feats":["Kệ Xoong Nồi Dạng Bản Inox 304 (303211 – 600mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303311 – 600mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303312 – 700mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303313 – 800mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303314 – 900mm) – Higold"],"sku":"303204","vid":"","mod":"303204","brand":"Higold","slug":"303204-ke-xoong-ban-bat-mat-hoc-inox-304-phu-kien-tu-bep-higold","_source":"avatar2-add-product","_source_url":"https://phukienbepthanhdat.com/ke-xoong-ban-bat-mat-hoc-inox-304-303204-900mm-higold/","_added_at":"2026-10-05T14:40:23.390Z"},{"n":"Khóa cửa cổng sắt chống nước Demax ELG908 AC/GB IP56 APP REMOTE","l":"https://khoadientunhapkhau.com.vn/khoa-cua-cong-sat-chong-nuoc-demax-elg908-ac-gb-ip56-app-remote/","i":"https://b1.congngheviet.com.vn/file/s2-hc08/khoadientunhapkhau-com-vn/wp-content/uploads/2026/04/image_1775631075773.jpg","p":"15.680.000đ","pn":15680000,"listPn":0,"salePn":15680000,"priceMode":"both","c":"Khóa cổng","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://b1.congngheviet.com.vn/file/s2-hc08/khoadientunhapkhau-com-vn/wp-content/uploads/2026/04/image_1775631075773.jpg"],"sum":"Khóa cửa cổng sắt chống nước Demax ELG908 AC/GB IP66 APP REMOTE là dòng khóa thông minh cao cấp chuyên dụng cho cửa cổng, nổi bật với khả năng chống nước – chống bụi vượt trội cùng công nghệ mở khóa đa dạng như nhận diện khuôn mặt 3D, tĩnh mạch lòng bàn tay và điều khiển từ xa. Sản phẩm mang đến giải pháp an ninh hiện đại, tiện nghi cho nhà phố, biệt thự và khu vực ngoài trời.\nĐặc điểm nổi bật \nVật liệu cao cấp \nKhóa được chế tạo từ hợp kim nhôm đúc nguyên khối phay CNC chắc chắn, tăng độ bền và khả năng chịu lực\nBảng điều khiển kính cường lực chống trầy xước, chống ố vàng, đảm bảo tính thẩm mỹ lâu dài\nThân khóa thép không gỉ SUS 304 chống ăn mòn, phù hợp môi trường ngoài trời\nThiết kế chuyên dụng cho cửa cổng \nThiết kế chắc chắn, phù hợp lắp đặt cho cửa sắt, cổng ngoài trời\nKiểu dáng hiện đại, màu đen sang trọng, nâng tầm không gian sống\nTính năng mở khóa đa dạng \nMở khóa bằng nhận diện khuôn mặt FACE ID 3D\nMở khóa bằng tĩnh mạch lòng bàn tay\nMở khóa từ xa qua App Wi-Fi (Tuya)\nMở khóa bằng NFC từ smartphone (tùy chọn)\nMở khóa bằng vân tay\nMở khóa bằng thẻ từ\nMở khóa bằng mật mã\nChìa khóa cơ chống sao chép\nMở khóa bằng remote điều khiển từ xa\nChức năng thông minh và an toàn \nChống nước, chống bụi tiêu chuẩn IP66, hoạt động ổn định ngoài trời\nCảnh báo đột nhập, nhắc nhở pin yếu\nVô hiệu hóa thẻ bị mất giúp tăng cường bảo mật\nChế độ thông phòng linh hoạt\nHỗ trợ tự động khóa (Auto Lock)\nCông nghệ sinh trắc học FPC Thụy Điển cho độ chính xác cao\nDung lượng và vận hành \nLưu trữ tối đa 50 khuôn mặt và 50 tĩnh mạch lòng bàn tay\nLưu trữ 100 vân tay và 200 thẻ từ\nThẻ từ kèm theo 2 chiếc, chìa khóa cơ 2 chiếc, remote 2 chiếc\nMật mã động 10 chữ số tăng cường bảo mật\nĐộng cơ DC siêu nhỏ giúp vận hành êm ái, ổn định\nHoạt động tốt trong môi trường từ -20°C đến 60°C\nĐộ ẩm phù hợp từ 15% đến 90%\nThông số kỹ thuật \nKích thước khóa ngoài: 61 x 197 mm\nKích thước khóa trong: 145 x 105 mm\nNguồn cung cấp: Pin sạc Lithium 7.4V – 3200 mAh\nThời gian sử dụng: 3 – 6 tháng/lần sạc\nNguồn điện khẩn cấp: Cổng USB Type-C\nĐộ dày cửa: 40 – 80 mm\nĐộ rộng đố cửa: > 80 mm\nMàu hoàn thiện: Đen\nXuất xứ: Malaysia\nBảo hành: 3 năm","desc":"Khóa cửa cổng sắt chống nước Demax ELG908 AC/GB IP66 APP REMOTE là dòng khóa thông minh cao cấp chuyên dụng cho cửa cổng, nổi bật với khả năng chống nước – chống bụi vượt trội cùng công nghệ mở khóa đa dạng như nhận diện khuôn mặt 3D, tĩnh mạch lòng bàn tay và điều khiển từ xa. Sản phẩm mang đến giải pháp an ninh hiện đại, tiện nghi cho nhà phố, biệt thự và khu vực ngoài trời.\nĐặc điểm nổi bật \nVật liệu cao cấp \nKhóa được chế tạo từ hợp kim nhôm đúc nguyên khối phay CNC chắc chắn, tăng độ bền và khả năng chịu lực\nBảng điều khiển kính cường lực chống trầy xước, chống ố vàng, đảm bảo tính thẩm mỹ lâu dài\nThân khóa thép không gỉ SUS 304 chống ăn mòn, phù hợp môi trường ngoài trời\nThiết kế chuyên dụng cho cửa cổng \nThiết kế chắc chắn, phù hợp lắp đặt cho cửa sắt, cổng ngoài trời\nKiểu dáng hiện đại, màu đen sang trọng, nâng tầm không gian sống\nTính năng mở khóa đa dạng \nMở khóa bằng nhận diện khuôn mặt FACE ID 3D\nMở khóa bằng tĩnh mạch lòng bàn tay\nMở khóa từ xa qua App Wi-Fi (Tuya)\nMở khóa bằng NFC từ smartphone (tùy chọn)\nMở khóa bằng vân tay\nMở khóa bằng thẻ từ\nMở khóa bằng mật mã\nChìa khóa cơ chống sao chép\nMở khóa bằng remote điều khiển từ xa\nChức năng thông minh và an toàn \nChống nước, chống bụi tiêu chuẩn IP66, hoạt động ổn định ngoài trời\nCảnh báo đột nhập, nhắc nhở pin yếu\nVô hiệu hóa thẻ bị mất giúp tăng cường bảo mật\nChế độ thông phòng linh hoạt\nHỗ trợ tự động khóa (Auto Lock)\nCông nghệ sinh trắc học FPC Thụy Điển cho độ chính xác cao\nDung lượng và vận hành \nLưu trữ tối đa 50 khuôn mặt và 50 tĩnh mạch lòng bàn tay\nLưu trữ 100 vân tay và 200 thẻ từ\nThẻ từ kèm theo 2 chiếc, chìa khóa cơ 2 chiếc, remote 2 chiếc\nMật mã động 10 chữ số tăng cường bảo mật\nĐộng cơ DC siêu nhỏ giúp vận hành êm ái, ổn định\nHoạt động tốt trong môi trường từ -20°C đến 60°C\nĐộ ẩm phù hợp từ 15% đến 90%\nThông số kỹ thuật \nKích thước khóa ngoài: 61 x 197 mm\nKích thước khóa trong: 145 x 105 mm\nNguồn cung cấp: Pin sạc Lithium 7.4V – 3200 mAh\nThời gian sử dụng: 3 – 6 tháng/lần sạc\nNguồn điện khẩn cấp: Cổng USB Type-C\nĐộ dày cửa: 40 – 80 mm\nĐộ rộng đố cửa: > 80 mm\nMàu hoàn thiện: Đen\nXuất xứ: Malaysia\nBảo hành: 3 năm","specs":{"Bảo hành":"3 năm"},"feats":["Malaysia","Chưa có đánh giá nào."],"sku":"ELG908","vid":"","mod":"ELG908","brand":"Demax","slug":"elg908-khoa-cua-cong-sat-chong-nuoc-demax-elg908-ac-gb-ip56-app-remote","_source":"avatar2-add-product","_source_url":"https://khoadientunhapkhau.com.vn/khoa-cua-cong-sat-chong-nuoc-demax-elg908-ac-gb-ip56-app-remote/","_added_at":"2026-10-05T14:40:21.419Z"},{"n":"Khóa cửa nhôm Demax EL909AG CNC FACE ID REMOTE APP WIFI","l":"https://bepviet.vn/khoa-cua-thong-minh/khoa-cua-nhan-dien-khuon-mat/khoa-cua-nhom-demax-el909ag-cnc-face-id-remote-app-wifi?srsltid=AU7gw4V_BonSZXfOuMyEfHgl1qMSpiyxRMj8imAkSkjotFhKgpgDy2Yk","i":"https://bepviet.vn/media/product/10316_909111.png","p":"19.800.000đ","pn":19800000,"listPn":0,"salePn":19800000,"priceMode":"both","c":"Khóa cửa nhôm Demax EL909AG CNC FACE ID REMOTE APP WIFI","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bepviet.vn/media/product/10316_909111.png"],"sum":"Kích thước khóa: 38x420mm Độ dày cửa: 40~80mm Độ rộng đố cửa: >60mm","desc":"Kích thước khóa: 38x420mm Độ dày cửa: 40~80mm Độ rộng đố cửa: >60mm","specs":{"Mã bảo vệ":"[Đổi mã khác]"},"feats":[],"sku":"EL909AG","vid":"","mod":"EL909AG","brand":"Demax","slug":"el909ag-khoa-cua-nhom-demax-el909ag-cnc-face-id-remote-app-wifi","_source":"avatar2-add-product","_source_url":"https://bepviet.vn/khoa-cua-thong-minh/khoa-cua-nhan-dien-khuon-mat/khoa-cua-nhom-demax-el909ag-cnc-face-id-remote-app-wifi?srsltid=AU7gw4V_BonSZXfOuMyEfHgl1qMSpiyxRMj8imAkSkjotFhKgpgDy2Yk","_added_at":"2026-10-05T14:40:19.350Z"},{"n":"Thanh suốt treo quần áo, hợp kim nhôm Garis GW30AR","l":"https://garis.vn/bo-gia-treo-quan-ao-co-dinh-gw30-ar-30-br.html","i":"https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg","p":"939.600đ","pn":939600,"listPn":0,"salePn":939600,"priceMode":"both","c":"Bộ giá treo quần áo cố định","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg"],"sum":"Bộ giá treo quần áo cố định GW30.AR – Kiểu dáng chắc chắn, chất liệu cao cấp, tối ưu không gian lưu trữ. Giải pháp tiện lợi cho tủ quần áo hiện đại.","desc":"Bộ giá treo quần áo cố định GW30.AR – Kiểu dáng chắc chắn, chất liệu cao cấp, tối ưu không gian lưu trữ. Giải pháp tiện lợi cho tủ quần áo hiện đại.","specs":{},"feats":[],"sku":"GW30AR","vid":"","mod":"GW30AR","brand":"Garis","slug":"gw30ar-thanh-suot-treo-quan-ao-hop-kim-nhom-garis-gw30ar","_source":"avatar2-add-product","_source_url":"https://garis.vn/bo-gia-treo-quan-ao-co-dinh-gw30-ar-30-br.html","_added_at":"2026-10-05T14:40:17.412Z"},{"n":"GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2 - Grandx","l":"https://grandx.com.vn/product/gia-bat-dia-nang-ha-nan-oval-sus304-xl-90m2","i":"https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg","p":"11.100.000đ","pn":11100000,"listPn":0,"salePn":11100000,"priceMode":"both","c":"Phụ kiện tủ bếp trên","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg"],"sum":"Đặc tính sản phẩm \nGiá bát đĩa nâng hạ 2 tầng nan Oval SUS304\nBề mặt điện hóa xước mờ \nKhung chính bằng INOX SUS304 màu xám đậm \nĐiều chỉnh trợ lực \nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval nâng bằng INOX SUS 304 \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"Đặc tính sản phẩm \nGiá bát đĩa nâng hạ 2 tầng nan Oval SUS304\nBề mặt điện hóa xước mờ \nKhung chính bằng INOX SUS304 màu xám đậm \nĐiều chỉnh trợ lực \nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval nâng bằng INOX SUS 304 \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XL.90M2","Chất liệu rổ":"SUS304","Chất liệu khung":"INOX 304","Kích thước sản phẩm (mm)":"R864*S280*C550","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"feats":["Đặc tính sản phẩm","Giá bát đĩa nâng hạ 2 tầng nan Oval SUS304","Bề mặt điện hóa xước mờ","Khung chính bằng INOX SUS304 màu xám đậm","Điều chỉnh trợ lực","Điều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế","2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh","Ống tay cầm hình oval nâng bằng INOX SUS 304","THÔNG SỐ SẢN PHẨM","Mở rộng"],"sku":"SUS304","vid":"","mod":"SUS304","brand":"GrandX","slug":"sus304-gia-bat-dia-nang-ha-nan-oval-sus304-xl-90m2-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-bat-dia-nang-ha-nan-oval-sus304-xl-90m2","_added_at":"2026-10-05T14:43:23.335Z"},{"n":"THÙNG RÁC TRÒN EUROKING KR.14L","l":"https://ahabep.com/thuong-hieu/euroking/thung-dung-rac-nha-bep/thung-rac-tron-euroking-kr-14l.html?srsltid=AU7gw4VuC3t1rc_xADNxaXK3pf6hR4DzjYFGxcSbqzgXP1VTnBG1b-Zl","i":"http://ahabep.com/upload/images/thung-rac-tron-euroking-kr-14l.png","p":"1.100.000đ","pn":1100000,"listPn":0,"salePn":1100000,"priceMode":"both","c":"THÙNG ĐỰNG RÁC NHÀ BẾP","cs":"san-pham-them-moi","ci":"fa-box","imgs":["http://ahabep.com/upload/images/thung-rac-tron-euroking-kr-14l.png"],"sum":"Mã sản phẩm: KR.14L Hãng sản xuất: EUROKING Loại: Thùng rác","desc":"Mã sản phẩm: KR.14L Hãng sản xuất: EUROKING Loại: Thùng rác","specs":{"THÔNG SỐ SẢN PHẨM VÀ KÍCH THƯỚC LẮP ĐẶT Kích thước sản phẩm":"14 lít W370*D330*H400"},"feats":[],"sku":"KR14L","vid":"","mod":"KR14L","brand":"EUROKING","slug":"kr14l-thung-rac-tron-euroking-kr-14l","_source":"avatar2-add-product","_source_url":"https://ahabep.com/thuong-hieu/euroking/thung-dung-rac-nha-bep/thung-rac-tron-euroking-kr-14l.html?srsltid=AU7gw4VuC3t1rc_xADNxaXK3pf6hR4DzjYFGxcSbqzgXP1VTnBG1b-Zl","_added_at":"2026-10-05T12:52:08.804Z"},{"n":"TÚI NIÊM PHONG","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260929_041008_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260929_041008_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Nội thất","cs":"noi-that","ci":"fa-box","sum":"🔒 **TÚI NIÊM PHONG – HÀNG SẴN GIÁ TỐT** 🔥\n\n📦 Túi chắc chắn – niêm phong tiện lợi\n🛡️ Phù hợp đóng gói Kích thước: 0969 213 223 - 0368855161**\n👉 **Inbox ngay để nhận báo giá!**","desc":"🔒 **TÚI NIÊM PHONG – HÀNG SẴN GIÁ TỐT** 🔥\n\n📦 Túi chắc chắn – niêm phong tiện lợi\n🛡️ Phù hợp đóng gói","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"tui-niem-phong","_source":"zalo-products-all-autosync","_added_at":"2026-09-29T04:10:08Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"VERIF88 Produs verif","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_150922_seller_test_88.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_150922_seller_test_88.jpg"],"p":"88.000 đ","pn":88000,"listPn":88000,"salePn":88000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"VERIF88 | verifica fluxul complet spec88","desc":"VERIF88 | verifica fluxul complet","specs":{},"feats":[],"sku":"VERIF88","vid":"","mod":"VERIF88","brand":"","slug":"verif88","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T15:09:22Z","seller_name":"Seller Test","seller_id":"seller-test-88","bot_link":"https://zalo.me/3019064351949097305?uid=seller-test-88","admin_hash":"0b2d8aee76"},{"n":"Hết mùa trung thu","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260928_100021_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260928_100021_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Hết mùa trung thu","desc":"Hết mùa trung thu","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"het-mua-trung-thu","_source":"zalo-products-all-autosync","_added_at":"2026-09-28T10:00:21Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"Sự kết hợp giữa gạo lứt","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260928_055343_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260928_055343_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Sự kết hợp giữa gạo lứt","desc":"Sự kết hợp giữa gạo lứt","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"su-ket-hop-giua-gao-lut","_source":"zalo-products-all-autosync","_added_at":"2026-09-28T05:53:43Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"Em nhận Đơn Bánh Giò Nóng cho Chiều này ạ \nBánh giò Size Lớn với công thức gia truyền nhà em đây.\n💕Bánh mềm mịn núng nính nên người già và con nít rất dễ ăn.\n💕Bánh nhà em cam kết hong có chất phụ gia","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260927_074623_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260927_074623_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Em nhận Đơn Bánh Giò Nóng cho Chiều này ạ \nBánh giò Size Lớn với công thức gia truyền nhà em đây.\n💕Bánh mềm mịn núng nính nên người già và con nít rất dễ ăn.\n💕Bánh nhà em cam kết hong có chất phụ gia và chất bảo quản cho anh chị nè.\n\nGiá Thành đi liền với chất lượng \n✅ combo 5 bánh / 100k\n✅ combo 10 bánh / 180k\n\nBánh đã bao gồm có 2 trứng + thịt mộc nhĩ ăn kèm nước mắm hành phi nhà làm . Ý như ảnh","desc":"Em nhận Đơn Bánh Giò Nóng cho Chiều này ạ \nBánh giò Size Lớn với công thức gia truyền nhà em đây.\n💕Bánh mềm mịn núng nính nên người già và con nít rất dễ ăn.\n💕Bánh nhà em cam kết hong có chất phụ gia và chất bảo quản cho anh chị nè.\n\nGiá Thành đi liền với chất lượng \n✅ combo 5 bánh / 100k\n✅ combo 10 bánh / 180k\n\nBánh đã bao gồm có 2 trứng + thịt mộc nhĩ ăn kèm nước mắm hành phi nhà làm . Ý như ảnh . FREE SHIP MỌI NHÀ","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"em-nhan-don-banh-gio-nong-cho-chieu-nay-a-banh-gio-size-lon-voi-cong-thuc-gia-tr","_source":"zalo-products-all-autosync","_added_at":"2026-09-27T07:46:23Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"A23 TÚI DU LỊCH ĐA NĂNG A23","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260926_171157_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260926_171157_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Bếp nhà bếp","cs":"bep-nha-bep","ci":"fa-box","sum":"🧳 TÚI DU LỊCH ĐA NĂNG A23 – GỌN GÀNG Kích thước: 43 x 23 x 20 cm\n\n✔️giá 1 túi 269k. Giao hàng miễn phí ship toàn quốc. Khi nhận được kiểm tra hàng trước khi thanh toán 0938572628","desc":"🧳 TÚI DU LỊCH ĐA NĂNG A23 – GỌN GÀNG","specs":{},"feats":[],"sku":"A23","vid":"","mod":"A23","brand":"","slug":"a23","_source":"zalo-products-all-autosync","_added_at":"2026-09-26T17:11:57Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"BÀO NGƯ 🦪\n✅ 195k 2 khay= 16 con\n🧨Dễ dàng chế biến các món : Xào","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260926_001933_d0898d9c44dcad82f4cd.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260926_001933_d0898d9c44dcad82f4cd.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Bếp nhà bếp","cs":"bep-nha-bep","ci":"fa-box","sum":"🦪BÀO NGƯ 🦪\n✅ 195k 2 khay= 16 con\n🧨Dễ dàng chế biến các món : Xào","desc":"🦪BÀO NGƯ 🦪\n✅ 195k 2 khay= 16 con\n🧨Dễ dàng chế biến các món : Xào","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"bao-ngu--195k-2-khay-16-conde-dang-che-bien-cac-mon--xao","_source":"zalo-products-all-autosync","_added_at":"2026-09-26T00:19:33Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"E gom cá Linh Non trả đơn ngày mai\n\n💰 Cá linh non #90k/ 1kg\n\ncá sống được làm sạch ruột và dập đá gửi lên chứ không phải hàng đông lạnh nhé\n\nhàng em bán cam kết chuẩn 100% cá linh chứ không phải hàng","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_232001_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_232001_b6e5ebf022b0cbee92a1.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"E gom cá Linh Non trả đơn ngày mai\n\n💰 Cá linh non #90k/ 1kg\n\ncá sống được làm sạch ruột và dập đá gửi lên chứ không phải hàng đông lạnh nhé\n\nhàng em bán cam kết chuẩn 100% cá linh chứ không phải hàng pha tạp cá trôi","desc":"E gom cá Linh Non trả đơn ngày mai\n\n💰 Cá linh non #90k/ 1kg\n\ncá sống được làm sạch ruột và dập đá gửi lên chứ không phải hàng đông lạnh nhé\n\nhàng em bán cam kết chuẩn 100% cá linh chứ không phải hàng pha tạp cá trôi","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"e-gom-ca-linh-non-tra-don-ngay-mai-ca-linh-non-90k-1kgca-song-duoc-lam-sach-ruot","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T23:20:01Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"TÚI NIÊM PHONG CHỐNG SỐC\n✔️ Đa dạng kích thước.\n✔️ Chống sốc hiệu quả","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_131324_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_131324_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"📦 TÚI NIÊM PHONG CHỐNG SỐC\n✔️ Đa dạng kích thước.\n✔️ Chống sốc hiệu quả Kích thước: 0974 084 193\n📍 Kho : Hà Đông – Hà Nội\n📍Xưởng sản xuất : Bình Nguyên – Phú Thọ","desc":"📦 TÚI NIÊM PHONG CHỐNG SỐC\n✔️ Đa dạng kích thước.\n✔️ Chống sốc hiệu quả","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"tui-niem-phong-chong-soc-da-dang-kich-thuoc-chong-soc-hieu-qua","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T13:13:26Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"Keo Tytan siêu trong** là lựa chọn đáng tham khảo cho những hạng mục cần đường nối tinh tế","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_112011_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_112011_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Bếp nhà bếp","cs":"bep-nha-bep","ci":"fa-box","sum":"💎 **Keo Tytan siêu trong** là lựa chọn đáng tham khảo cho những hạng mục cần đường nối tinh tế","desc":"💎 **Keo Tytan siêu trong** là lựa chọn đáng tham khảo cho những hạng mục cần đường nối tinh tế","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"keo-tytan-sieu-trong-la-lua-chon-dang-tham-khao-cho-nhung-hang-muc-can-duong-noi","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T11:20:13Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"Lạp xưởng tôm Sóc Trăng","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_101617_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_101617_b6e5ebf022b0cbee92a1.jpg"],"p":"155.000 đ","pn":155000,"listPn":155000,"salePn":155000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"#155k/1kg 2 bịch #80k/1 bịch 500gr Được làm từ tôm, 10% mỡ heo với tỉ lệ nạc nhiều ,ít mỡ, giúp Lạp Xưởng giữ được vị ngọt, kết hợp với một ít mỡ để cho miếng lạp xưởng không quá dai, phù hợp mọi người ==> Dùng tôm nguyên chất, cắn vô cảm nhận mùi tôm tươi ngon giữ nguyên vị ngọt tự nhiên đậm đà, ăn lạ miệng ít ngán, thơm thơm rất tuyệt..Nhà làm bảo đảm an toàn,chất lượng.. / Không chất bảo quản v","desc":"#155k/1kg 2 bịch #80k/1 bịch 500gr Được làm từ tôm, 10% mỡ heo với tỉ lệ nạc nhiều ,ít mỡ, giúp Lạp Xưởng giữ được vị ngọt, kết hợp với một ít mỡ để cho miếng lạp xưởng không quá dai, phù hợp mọi người ==> Dùng tôm nguyên chất, cắn vô cảm nhận mùi tôm tươi ngon giữ nguyên vị ngọt tự nhiên đậm đà, ăn lạ miệng ít ngán, thơm thơm rất tuyệt..Nhà làm bảo đảm an toàn,chất lượng.. / Không chất bảo quản vì làm thủ công tại nhà..","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"lap-xuong-tom-soc-trang","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T10:16:17Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"CHUYÊN SẢN XUẤT BĂNG DÍNH 80Y","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_013125_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_013125_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Bếp nhà bếp","cs":"bep-nha-bep","ci":"fa-box","sum":"📦 CHUYÊN SẢN XUẤT BĂNG DÍNH 80Y – 100Y\n✅ Đa dạng màu sắc Màu sắc: 0974. 084. 193","desc":"📦 CHUYÊN SẢN XUẤT BĂNG DÍNH 80Y – 100Y\n✅ Đa dạng màu sắc","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"chuyen-san-xuat-bang-dinh-80y","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T01:31:29Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"Thùng 6 chai nước mắm nhỉ cá cơm ruột đỏ Làng Chài Xưa chai thủy tinh 500ml \n+ Là nguyên liệu chế biến món ăn.\n\n+ Là gia vị không thể thiếu trong bữa ăn gia đình Việt\n\n+ Đặc sản Phan Thiết (Việt Nam)","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_090252_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_090252_b6e5ebf022b0cbee92a1.jpg"],"p":"295.000 đ","pn":295000,"listPn":295000,"salePn":295000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"+ Là nguyên liệu chế biến món ăn. + Là gia vị không thể thiếu trong bữa ăn gia đình Việt + Đặc sản Phan Thiết (Việt Nam)","desc":"+ Là nguyên liệu chế biến món ăn. + Là gia vị không thể thiếu trong bữa ăn gia đình Việt + Đặc sản Phan Thiết (Việt Nam)","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"thung-6-chai-nuoc-mam-nhi-ca-com-ruot-do-lang-chai-xua-chai-thuy-tinh-500ml--la-","_source":"zalo-products-all-autosync","_added_at":"2026-09-13T09:02:52Z","seller_name":"Nhà Bếp Vuông","seller_id":"b6e5ebf022b0cbee92a1","bot_link":"https://zalo.me/3019064351949097305?uid=b6e5ebf022b0cbee92a1","admin_hash":"dade40b47d"},{"n":"COMBO10 DỪA XIÊM","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_051330_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_051330_b6e5ebf022b0cbee92a1.jpg"],"p":"250.000 đ","pn":250000,"listPn":250000,"salePn":250000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"💫 Đuợc tuyển chọn kỹ từng trái, đảm bảo đạt tiêu chuẩn xuất khẩu . Nước ngọt thanh – cơm dừa thì mềm – uống mát cực đã . Cơm béo ngọt nhẹ 😋 🌱 Hàng nhà em, an tâm dùng mỗi ngày ❤️ 💥 COMBO 10 TRÁI : chỉ 🟰 250k 💫 Giá quá mềm với hàng tiêu chuẩn 💫 lấy bao về uống cả nhà cực hợp ạ! 🥥🔥 ❤️ Hàng sẵn kho . Anh chị nào cần nhắn e ship liền ngen 🥰 📞0️⃣9️⃣3️⃣1️⃣4️⃣1️⃣3️⃣2️⃣3️⃣2️⃣","desc":"💫 Đuợc tuyển chọn kỹ từng trái, đảm bảo đạt tiêu chuẩn xuất khẩu . Nước ngọt thanh – cơm dừa thì mềm – uống mát cực đã . Cơm béo ngọt nhẹ 😋 🌱 Hàng nhà em, an tâm dùng mỗi ngày ❤️ 💥 COMBO 10 TRÁI : chỉ 🟰 250k 💫 Giá quá mềm với hàng tiêu chuẩn 💫 lấy bao về uống cả nhà cực hợp ạ! 🥥🔥 ❤️ Hàng sẵn kho . Anh chị nào cần nhắn e ship liền ngen 🥰 📞0️⃣9️⃣3️⃣1️⃣4️⃣1️⃣3️⃣2️⃣3️⃣2️⃣","specs":{},"feats":[],"sku":"COMBO10","vid":"","mod":"COMBO10","brand":"","slug":"combo10","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T05:13:30Z","seller_name":"Nhà Bếp Vuông","seller_id":"b6e5ebf022b0cbee92a1","bot_link":"https://zalo.me/3019064351949097305?uid=b6e5ebf022b0cbee92a1","admin_hash":"dade40b47d"},{"n":"BÁNH GIÒ QUE MINI TRUYỀN THỐNG","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_065506_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_065506_b6e5ebf022b0cbee92a1.jpg"],"p":"130.000 đ","pn":130000,"listPn":130000,"salePn":130000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"130k / 10 bánh to. Nhân thịt, mộc nhĩ, hành khô đậm đà. Bánh mềm, chấm nước mắm.","desc":"130k / 10 bánh to. Nhân thịt, mộc nhĩ, hành khô đậm đà. Bánh mềm, chấm nước mắm.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"banh-gio-que-mini-truyen-thong","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:10Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"BD-1054HVOW Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260914_030828_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260914_030828_b6e5ebf022b0cbee92a1.jpg"],"p":"7.170.000 đ","pn":7170000,"listPn":7170000,"salePn":7170000,"priceMode":"sale","c":"Điện máy","cs":"dien-may","ci":"fa-box","sum":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW - giá tốt, mua trả chậm","desc":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW - giá tốt, mua trả chậm","specs":{},"feats":[],"sku":"BD-1054HVOW","vid":"","mod":"BD-1054HVOW","brand":"","slug":"bd-1054hvow","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:09Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"Thùng 6 chai nước mắm nhỉ cá cơm ruột đỏ Làng Chài Xưa","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_090252_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_090252_b6e5ebf022b0cbee92a1.jpg"],"p":"295.000 đ","pn":295000,"listPn":295000,"salePn":295000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Nguyên liệu chế biến món ăn. Gia vị không thể thiếu trong bữa ăn gia đình.","desc":"Nguyên liệu chế biến món ăn. Gia vị không thể thiếu trong bữa ăn gia đình.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"thung-6-chai-nuoc-mam-nhi-ca-com-ruot-do-lang-chai-xua","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:08Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"SIRO ATISO ĐỎ","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_100923_d0898d9c44dcad82f4cd.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_100923_d0898d9c44dcad82f4cd.jpg"],"p":"129.000 đ","pn":129000,"listPn":129000,"salePn":129000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Mỗi hũ 1kg đậm vị. Công dụng: Thanh lọc, giải độc, hỗ trợ điều trị da liễu, hỗ trợ tiêu hóa.","desc":"Mỗi hũ 1kg đậm vị. Công dụng: Thanh lọc, giải độc, hỗ trợ điều trị da liễu, hỗ trợ tiêu hóa.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"siro-atiso-do","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:07Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"TÚI TOTE DREAM ZONE ĐEO VAI, ĐEO CHÉO","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_090821_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_090821_b6e5ebf022b0cbee92a1.jpg"],"p":"170.000 đ","pn":170000,"listPn":170000,"salePn":170000,"priceMode":"sale","c":"Balo túi xách","cs":"balo-tui-xach","ci":"fa-box","sum":"Mẫu túi tote thiết kế hiện đại với họa tiết dễ thương, kèm móc treo xinh xắn. Kích thước: 42 x 36 x 11 cm","desc":"Mẫu túi tote thiết kế hiện đại với họa tiết dễ thương, kèm móc treo xinh xắn.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"tui-tote-dream-zone-deo-vai-deo-cheo","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:06Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"Combo 300 cái Khẩu Trang 5D Duy Khánh Kháng Khuẩn","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_055841_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_055841_b6e5ebf022b0cbee92a1.jpg"],"p":"159.000 đ","pn":159000,"listPn":159000,"salePn":159000,"priceMode":"sale","c":"Y tế - Khẩu trang","cs":"y-te---khau-trang","ci":"fa-box","sum":"Thương hiệu: Duy Khánh Kiểu dáng: 5D. Giá 159k 1 combo. Giao hàng miễn phí ship toàn quốc. Màu sắc: Đen, Trắng, Kem, Xanh, Hồng, Xám, Mix đủ màu ngẫu nhiên","desc":"Thương hiệu: Duy Khánh Kiểu dáng: 5D. Giá 159k 1 combo. Giao hàng miễn phí ship toàn quốc.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"combo-300-cai-khau-trang-5d-duy-khanh-khang-khuan","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:05Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"NƯỚC DỪA XIÊM TƯƠI","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_052916_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_052916_b6e5ebf022b0cbee92a1.jpg"],"p":"150.000 đ","pn":150000,"listPn":150000,"salePn":150000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Nước dừa xiêm tươi nguyên chất vị ngọt thanh 500ml/chai","desc":"Nước dừa xiêm tươi nguyên chất vị ngọt thanh","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"nuoc-dua-xiem-tuoi","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:04Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"DỪA XIÊM","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_051330_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_051330_b6e5ebf022b0cbee92a1.jpg"],"p":"250.000 đ","pn":250000,"listPn":250000,"salePn":250000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Đuợc tuyển chọn kỹ từng trái, đảm bảo đạt tiêu chuẩn xuất khẩu. Nước ngọt thanh – cơm dừa thì mềm – uống mát cực đã.","desc":"Đuợc tuyển chọn kỹ từng trái, đảm bảo đạt tiêu chuẩn xuất khẩu. Nước ngọt thanh – cơm dừa thì mềm – uống mát cực đã.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"dua-xiem","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:03Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"Trà gạo lứt đậu đen lá dứa hoa nhài Bamboo","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_042530_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_042530_b6e5ebf022b0cbee92a1.jpg"],"p":"189.000 đ","pn":189000,"listPn":189000,"salePn":189000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Công dụng sản phẩm: Giảm cân hiệu quả. Giúp ngăn ngừa bệnh sỏi thận. Giúp xương và răng chắc khoẻ. Lấy một lượng nhỏ cho vào 1 lít nước đun sôi để từ 10-15p.","desc":"Công dụng sản phẩm: Giảm cân hiệu quả. Giúp ngăn ngừa bệnh sỏi thận. Giúp xương và răng chắc khoẻ.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"tra-gao-lut-dau-den-la-dua-hoa-nhai-bamboo","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:02Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"HẠT ĐÁC RIM THƠM","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_035206_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_035206_b6e5ebf022b0cbee92a1.jpg"],"p":"120.000 đ","pn":120000,"listPn":120000,"salePn":120000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Rim cùng thơm chín và đường phèn, vị ngọt thanh, thơm dịu. Dùng trực tiếp hoặc ăn cùng sữa chua, chè, trái cây. Khối lượng: 1kg/hộp.","desc":"Rim cùng thơm chín và đường phèn, vị ngọt thanh, thơm dịu. Dùng trực tiếp hoặc ăn cùng sữa chua, chè, trái cây.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"hat-dac-rim-thom","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:01Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"A8060-2 BALO DU LỊCH A8060-2","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_010929_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_010929_b6e5ebf022b0cbee92a1.jpg"],"p":"275.000 đ","pn":275000,"listPn":275000,"salePn":275000,"priceMode":"sale","c":"Balo túi xách","cs":"balo-tui-xach","ci":"fa-box","sum":"Thiết kế tối giản, năng động với nhiều màu phối điểm nhấn nổi bật, phù hợp cho học tập, công việc và du lịch. Kích thước: 61 x 38 x 20cm","desc":"Thiết kế tối giản, năng động với nhiều màu phối điểm nhấn nổi bật, phù hợp cho học tập, công việc và du lịch.","specs":{},"feats":[],"sku":"A8060-2","vid":"","mod":"A8060-2","brand":"","slug":"a8060-2","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:00Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"EPO8390VX EPO8390VX | Eurogold | Giá bát cố định inox 304 Oval EPV8090 (EPO8390VX)","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260821_154302_import_a5084af3.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260821_154302_import_a5084af3.jpg"],"p":"3.600.000 đ","pn":3600000,"listPn":3600000,"salePn":3600000,"priceMode":"sale","c":"Bếp nhà bếp","cs":"bep-nha-bep","ci":"fa-box","sum":"4 EPO8390VX Kích thước sản phẩm: W864 x D261 x H(62-194) mm; Khoang tủ: 900 mm; Chất liệu: Inox Oval 304; Dòng sản phẩm: Giá Bát Cố Định Oval; Chiều rộng tủ: 800mm; Giá catalogue: 3.600.000 VNĐ 1 1,620,000đ 1,620,000đ BẢO HÀNH 2 NĂM Kích thước: W864 x D261 x H(62-194) mm\nChất liệu: Inox Oval 304\nDòng sản phẩm: Giá Bát Cố Định Oval\nChiều rộng tủ: 800mm; Giá catalogue: 3.600.000 VNĐ 1 1,620,000đ 1,6","desc":"4 EPO8390VX Kích thước sản phẩm: W864 x D261 x H(62-194) mm; Khoang tủ: 900 mm; Chất liệu: Inox Oval 304; Dòng sản phẩm: Giá Bát Cố Định Oval; Chiều rộng tủ: 800mm; Giá catalogue: 3.600.000 VNĐ 1 1,620,000đ 1,620,000đ BẢO HÀNH 2 NĂM","specs":{},"feats":[],"sku":"EPO8390VX","vid":"","mod":"EPO8390VX","brand":"","slug":"epo8390vx","_source":"zalo-products-all-autosync","_added_at":"2026-08-21T15:43:02Z","seller_name":"","seller_id":"","bot_link":"https://zalo.me/3019064351949097305","admin_hash":""},{"n":"Máy Giặt LG Inverter 9 Kg FB1209S5W","l":"https://dienmaycholon.com/may-giat/may-giat-lg-inverter-9-kg-fb1209s5w?gad_source=1&gad_campaignid=24102390866&gbraid=0AAAABEZumqgYFI10M0KNJMeoBC8OJnKx7&gclid=Cj0KCQjw2OnUBhC2ARIsACKyfaHzwSvdg9wiUOMvvFPjOqq99rka9j_Yx1AX_cDm53gl2fUwjw_-Ca4aAkX2EALw_wcBmay-giat-hitachi-inverter-105-kg-bd-1054hvow?utm_flashsale=1","i":"https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture/Apro/Apro_product_36348/may-giat-lg-inverter-9-kg-fb1209s5w-main-36348.png","p":"Giá niêm yết: 9.790.000đ — Giá KM: 6.390.000đ","pn":6390000,"listPn":9790000,"salePn":6390000,"priceMode":"both","c":"Máy giặt / sấy","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture/Apro/Apro_product_36348/may-giat-lg-inverter-9-kg-fb1209s5w-main-36348.png","https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture//Apro/Apro_product_36348/may-giat-lg-inverter-9-kg-fb1209s5w-main-36348.png"],"sum":"Tư vấn trực tuyến Xem sản phẩm ngay không cần đến trực tiếp siêu thị","desc":"Tư vấn trực tuyến Xem sản phẩm ngay không cần đến trực tiếp siêu thị","specs":{},"feats":["Lồng Giặt","Thép không gỉ","Chương trình giặt","- Vải bông","- Vải bông +","- Đồ hỗn hợp","- Giặt nhanh 30 phút","- Giặt ngừa dị ứng","- Đồ thể thao","- Giặt tay/Đồ len","- Giặt đồ tinh xảo","- Làm sạch lồng giặt","- Giũ + vắt","Bảng điều khiển","Cảm ứng","Ngôn Ngữ","Song ngữ Anh - Việt","Nắp máy","Kính cường lực","Hộc nước giặt"],"sku":"FB1209S5W","vid":"","mod":"FB1209S5W","brand":"LG","slug":"fb1209s5w-may-giat-lg-inverter-9-kg-fb1209s5w","_source":"vai-market-add-product","_source_url":"https://dienmaycholon.com/may-giat/may-giat-lg-inverter-9-kg-fb1209s5w?gad_source=1&gad_campaignid=24102390866&gbraid=0AAAABEZumqgYFI10M0KNJMeoBC8OJnKx7&gclid=Cj0KCQjw2OnUBhC2ARIsACKyfaHzwSvdg9wiUOMvvFPjOqq99rka9j_Yx1AX_cDm53gl2fUwjw_-Ca4aAkX2EALw_wcBmay-giat-hitachi-inverter-105-kg-bd-1054hvow?utm_flashsale=1","_added_at":"2026-09-06T04:59:42.293Z"},{"n":"Tủ Lạnh Funiki 147 Lít HR T6147TDG","l":"https://dienmaycholon.com/tu-lanh/tu-lanh-funiki-147-lit-hr-t6147tdg?gad_source=1&gad_campaignid=24102390866&gbraid=0AAAABEZumqgYFI10M0KNJMeoBC8OJnKx7&gclid=Cj0KCQjw2OnUBhC2ARIsACKyfaEF8CxOc_KCu8J_BI_1QFVEQsHP6DAPtHvG2Aea-UbbVKbI56URTUwaAoqaEALw_wcB","i":"https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture/Apro/Apro_product_33684/tu-lanh-funiki-147-lit-hr-t6147tdg-main-33684.png","p":"Giá niêm yết: 4.800.000đ — Giá KM: 3.490.000đ","pn":3490000,"listPn":4800000,"salePn":3490000,"priceMode":"both","c":"Tủ lạnh","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture/Apro/Apro_product_33684/tu-lanh-funiki-147-lit-hr-t6147tdg-main-33684.png","https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture//Apro/Apro_product_33684/tu-lanh-funiki-147-lit-hr-t6147tdg-main-33684.png"],"sum":"Tư vấn trực tuyến Xem sản phẩm ngay không cần đến trực tiếp siêu thị","desc":"Tư vấn trực tuyến Xem sản phẩm ngay không cần đến trực tiếp siêu thị","specs":{},"feats":["Công nghệ làm lạnh","Gián tiếp","Công nghệ kháng khuẩn, khử mùi","Silver Nano","Tính năng khác","- Hộp đựng rau quả","- Hộp để bơ trên cánh"],"sku":"T6147TDG","vid":"","mod":"T6147TDG","brand":"Funiki","slug":"t6147tdg-tu-lanh-funiki-147-lit-hr-t6147tdg","_source":"vai-market-add-product","_source_url":"https://dienmaycholon.com/tu-lanh/tu-lanh-funiki-147-lit-hr-t6147tdg?gad_source=1&gad_campaignid=24102390866&gbraid=0AAAABEZumqgYFI10M0KNJMeoBC8OJnKx7&gclid=Cj0KCQjw2OnUBhC2ARIsACKyfaEF8CxOc_KCu8J_BI_1QFVEQsHP6DAPtHvG2Aea-UbbVKbI56URTUwaAoqaEALw_wcB","_added_at":"2026-09-06T04:59:39.977Z"},{"n":"Lò vi sóng Toshiba MWP-MM20P(BK) 20 lít","l":"https://www.dienmayxanh.com/lo-vi-song/toshiba-mwp-mm20p-bk-20-lit?srsltid=AfmBOooNJBKp4lqr0DREH7VkAxokY77mK_6rqLQjJ9dbIK0VarsEA30s","i":"https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit---1--1020x570.jpg","p":"Giá niêm yết: 1.990.000đ — Giá KM: 1.690.000đ","pn":1690000,"listPn":1990000,"salePn":1690000,"priceMode":"both","c":"Lò vi sóng","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit---1--1020x570.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit--(2).jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/toshiba-mwp-mm20p-bk-20-lit-chat-lieu-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit--(4).jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-2.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-3.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-4.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-5.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-6.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-7.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-8.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-10.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-9.jpg"],"sum":"Lò vi sóng\nToshiba MWP-MM20P(BK) 20 lít công suất 700W mạnh mẽ, trang bị chuông báo sau khi nấu xong, tiện lợi với chức năng rã đông, hâm nóng,...\nCông suất - Dung tích - Chức năng chính\n- Mẫu\nlò vi sóng Toshiba\nnày có công suất 700W hoạt động ổn định.\n-\nDung tích 20 lít\ncó thể bỏ vừa gà nguyên con khoảng 1 kg.\n- Chức năng chính: rã đông, hâm nóng.\nThiết kế của sản phẩm\n- Khoang lò làm bằng thép phủ sơn chống dính, an toàn cho sức khoẻ và dễ lau chùi.\n- Bảng điều khiển bằng nút vặn dễ tuỳ chỉnh mức công suất, nhiệt độ, dễ dàng sử dụng với ngôn ngữ tiếng Việt - Anh.\nTiện ích - Phụ kiện\n- Hẹn giờ tối đa 35 phút, có thể chủ động thời gian hâm nóng hoặc rã đông, giúp thức ăn không bị cháy khét hay khô.\n- Lò có trang bị\nchuông báo sau khi nấu xong\n, không lo để quên thức ăn trong lò.\n- Khoang lò có đèn giúp chiếu sáng bên trong lò vi sóng.\n- Đi kèm phụ kiện: đĩa xoay và vòng xoay.\nLưu ý sử dụng\n- Không dùng chung ổ điện với các thiết bị khác.\n- Để thêm một cốc nước khi hâm nóng thức ăn khô.\n- Không sử dụng đồ đựng thức ăn bằng kim loại trong lò vi sóng.\nXem thêm:\n13 thứ tuyệt đối không được cho vào lò vi sóng\n.\n- Rút điện trước khi vệ sinh khoang lò, không dùng các chất tẩy rửa mạnh để vệ sinh.\n- Không sử dụng lò vi sóng có cửa bị hỏng hoặc đóng không khít.\nLò vi sóng Toshiba MWP-MM20P(BK) 20 lít\nvới công suất 700W, đáp ứng đủ các nhu cầu làm nóng thức ăn của gia đình, lò còn có chức năng rã đông thuận tiện. Lò có thể tuỳ chỉnh nhiệt độ bằng nút vặn đơn giản, khoang lò bằng thép phủ sơn chống dính bền bỉ,... Nhìn chung, đây là một thiết bị gia dụng không thể thiếu trong gian bếp của mỗi gia đình.\nXem thêm","desc":"Lò vi sóng\nToshiba MWP-MM20P(BK) 20 lít công suất 700W mạnh mẽ, trang bị chuông báo sau khi nấu xong, tiện lợi với chức năng rã đông, hâm nóng,...\nCông suất - Dung tích - Chức năng chính\n- Mẫu\nlò vi sóng Toshiba\nnày có công suất 700W hoạt động ổn định.\n-\nDung tích 20 lít\ncó thể bỏ vừa gà nguyên con khoảng 1 kg.\n- Chức năng chính: rã đông, hâm nóng.\nThiết kế của sản phẩm\n- Khoang lò làm bằng thép phủ sơn chống dính, an toàn cho sức khoẻ và dễ lau chùi.\n- Bảng điều khiển bằng nút vặn dễ tuỳ chỉnh mức công suất, nhiệt độ, dễ dàng sử dụng với ngôn ngữ tiếng Việt - Anh.\nTiện ích - Phụ kiện\n- Hẹn giờ tối đa 35 phút, có thể chủ động thời gian hâm nóng hoặc rã đông, giúp thức ăn không bị cháy khét hay khô.\n- Lò có trang bị\nchuông báo sau khi nấu xong\n, không lo để quên thức ăn trong lò.\n- Khoang lò có đèn giúp chiếu sáng bên trong lò vi sóng.\n- Đi kèm phụ kiện: đĩa xoay và vòng xoay.\nLưu ý sử dụng\n- Không dùng chung ổ điện với các thiết bị khác.\n- Để thêm một cốc nước khi hâm nóng thức ăn khô.\n- Không sử dụng đồ đựng thức ăn bằng kim loại trong lò vi sóng.\nXem thêm:\n13 thứ tuyệt đối không được cho vào lò vi sóng\n.\n- Rút điện trước khi vệ sinh khoang lò, không dùng các chất tẩy rửa mạnh để vệ sinh.\n- Không sử dụng lò vi sóng có cửa bị hỏng hoặc đóng không khít.\nLò vi sóng Toshiba MWP-MM20P(BK) 20 lít\nvới công suất 700W, đáp ứng đủ các nhu cầu làm nóng thức ăn của gia đình, lò còn có chức năng rã đông thuận tiện. Lò có thể tuỳ chỉnh nhiệt độ bằng nút vặn đơn giản, khoang lò bằng thép phủ sơn chống dính bền bỉ,... Nhìn chung, đây là một thiết bị gia dụng không thể thiếu trong gian bếp của mỗi gia đình.\nXem thêm","specs":{"Loại lò":"Lò vi sóng không nướng","Dung tích":"20 lít","Công suất vi sóng":"700W","Chất liệu khoang lò":"Thép phủ sơn chống dính","Thương hiệu của":"Nhật Bản","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2022","Chức năng chính":"Rã đông, hâm","Ngôn ngữ":"Tiếng Việt Tiếng Anh","Bảng điều khiển":"Nút vặn","Tiện ích":"Chuông báo khi nấu xong Hẹn giờ lên tới 35 phút Khoang lò có đèn","Kích thước - Khối lượng":"Ngang 43.4 cm - Cao 25.8 cm - Sâu 35 cm - Nặng 11 kg","Kích thước khoang lò":"Ngang 27.5 cm - Cao 17.4 cm - Sâu 29.5 cm","Hãng":"Toshiba. Xem thông tin hãng"},"feats":["Lò vi sóng Toshiba MWP-MM20P(BK) 20 lít công suất 700W mạnh mẽ, trang bị chuông báo sau khi nấu xong, tiện lợi với chức năng rã đông, hâm nóng,...","- Mẫu lò vi sóng Toshiba này có công suất 700W hoạt động ổn định.","- Dung tích 20 lít có thể bỏ vừa gà nguyên con khoảng 1 kg.","- Chức năng chính: rã đông, hâm nóng.","- Khoang lò làm bằng thép phủ sơn chống dính, an toàn cho sức khoẻ và dễ lau chùi.","- Bảng điều khiển bằng nút vặn dễ tuỳ chỉnh mức công suất, nhiệt độ, dễ dàng sử dụng với ngôn ngữ tiếng Việt - Anh.","- Hẹn giờ tối đa 35 phút, có thể chủ động thời gian hâm nóng hoặc rã đông, giúp thức ăn không bị cháy khét hay khô.","- Lò có trang bị chuông báo sau khi nấu xong , không lo để quên thức ăn trong lò.","- Khoang lò có đèn giúp chiếu sáng bên trong lò vi sóng.","- Đi kèm phụ kiện: đĩa xoay và vòng xoay.","- Không dùng chung ổ điện với các thiết bị khác.","- Để thêm một cốc nước khi hâm nóng thức ăn khô."],"sku":"283212","vid":"","mod":"283212","brand":"vi sóng Toshiba","slug":"283212-lo-vi-song-toshiba-mwp-mm20p-bk-20-lit","_source":"avatar2-add-product","_source_url":"https://www.dienmayxanh.com/lo-vi-song/toshiba-mwp-mm20p-bk-20-lit?srsltid=AfmBOooNJBKp4lqr0DREH7VkAxokY77mK_6rqLQjJ9dbIK0VarsEA30s","_added_at":"2026-10-05T14:43:08.864Z"},{"n":"Máy lạnh Casper Inverter 1 HP QC-09IU36A","l":"https://www.dienmayxanh.com/may-lanh/casper-inverter-1-hp-qc-09iu36a?srsltid=AfmBOoqQ9ZboJ-kIowTFz_lseNn8NKmYw_vPGyDBAaKcBREuz5uJck23","i":"https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/334018-1920x1080.jpg","p":"Giá niêm yết: 8.990.000đ — Giá KM: 7.590.000đ","pn":7590000,"listPn":8990000,"salePn":7590000,"priceMode":"both","c":"Hàng Casper","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/334018-1920x1080.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/1-1020x570-1.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/2-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/slider-1060x570-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/4-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/5-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/6-1020x570.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-1-638731575388494403.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-2-638731575401986689.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-3-638731575409037186.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-4-638731575419946302.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-5-638731575428692989.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-6-638731575439056769.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-7-638733153596915551.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-8-638731575460525267.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-9-638731575469259491.jpg"],"sum":"Máy lạnh Casper Inverter 1 HP QC-09IU36A\nlà lựa chọn lý tưởng cho các không gian dưới 15m² như phòng ngủ, phòng làm việc cá nhân hoặc cửa hàng nhỏ. Với công suất 9.500 BTU, sản phẩm tích hợp công nghệ Inverter tiết kiệm điện, chế độ Turbo làm lạnh nhanh, c\nùng các tính năng như Silk Air, BabyCare mang đến trải nghiệm làm mát dễ chịu, tiết kiệm năng lượng và bảo vệ sức khỏe người dùng.\nThiết kế\nDàn lạnh\n-\nMáy lạnh Casper\nsở hữu thiết kế treo tường hiện đại, tiết kiệm không gian, kết hợp với gam màu trắng thanh lịch giúp sản phẩm dễ dàng hài hòa với nhiều phong cách nội thất.\n- Điểm nhấn độc đáo của thiết kế này là\nmàn hình LED hiển thị nhiệt độ\ntrực quan giúp người dùng dễ dàng quan sát và điều chỉnh vào ban đêm.\nDàn nóng\n- Dàn nóng được trang bị hệ thống\nống dẫn gas bằng đồng mạ vàng, lá tản nhiệt bằng nhôm mạ vàng\nđảm bảo hiệu quả làm lạnh, tăng độ bền cho thiết bị chống chịu trước thời tiết ẩm ướt, sương muối,...\n- Thiết bị sử dụng\ngas R32\nthân thiện với môi trường đồng thời đảm bảo hiệu suất làm lạnh.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh Casper 1 HP\nhoạt động với công suất\n9.500 BTU\n, phù hợp lắp đặt trong không gian vừa phải có diện tích\ndưới 15m².\nVì vậy, thiết bị có thể ứng dụng tại nhiều vị trí trong gia đình như phòng ngủ, phòng đọc sách, phòng quần áo,...\n- Nhờ\ncông nghệ Turbo\nmáy lạnh được trang bị máy nén công nghệ cao, giúp nhiệt độ phòng có thể giảm xuống thấp trong thời gian ngắn, nhanh chóng mang lại không gian mát lạnh và thoải mái cho người dùng.\n-\nCông nghệ Silk Air\nkhuếch tán không khí mát thông qua hàng ngàn lỗ khí siêu nhỏ, tạo luồng khí mềm mại, nhẹ nhàng, không gây buốt lạnh, phù hợp với người lớn tuổi và trẻ nhỏ\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Casper Inverter\ncó chế độ thổi gió được thiết kế\nlên xuống tự động\n, giúp luồng khí lạnh luân chuyển đồng đều khắp không gian, đảm bảo mọi vị trí trong phòng đều được làm mát.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy nén hoạt động linh hoạt theo nhiệt độ phòng, giảm dao động công suất không cần thiết - từ đó tiết kiệm điện hiệu quả và kéo dài tuổi thọ máy.\n-\nChế độ i-Save\ntối ưu hóa đường cong nhiệt độ khi làm lạnh, cho phép máy hoạt động ổn định ở mức năng lượng thấp mà vẫn duy trì cảm giác mát mẻ.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ BabyCare\nđiều chỉnh nhiệt độ nhẹ nhàng, duy trì không gian dễ chịu mà không gây lạnh đột ngột, phù hợp cho gia đình có trẻ em hoặc người cao tuổi.\n-\nCảm biến nhiệt độ thông minh I Feel\nsử dụng cảm biến để đo nhiệt độ tại vị trí người dùng, giúp\nmáy lạnh\nđiều chỉnh chính xác mức nhiệt độ phù hợp với khu vực bạn đang ngồi.\n-\nTự khởi động lại khi có điện\n, giữ nguyên chế độ hoạt động trước khi bị ngắt điện.\n-\nKhóa remote điều khiển\n, đảm bảo an toàn khi sử dụng trong gia đình có trẻ nhỏ.\n-\nCơ chế bảo vệ an toàn kép thông minh\n, phát hiện rò rỉ đảm bảo an toàn tuyệt đối khi sử dụng.\n-\nHẹn giờ bật, tắt máy\nlinh hoạt, phù hợp với lịch trình sinh hoạt của người dùng.\n-\nChức năng\niClean tự động làm sạch dàn lạnh\nngăn ngừa sự hình thành vi khuẩn, nấm mốc phát triển, bảo vệ sức khỏe người dùng và duy trì hiệu suất làm lạnh ổn định lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Casper Inverter 1 HP QC-09IU36A là lựa chọn hoàn hảo cho không gian nhỏ dưới 15m², mang đến khả năng làm lạnh nhanh, tiết kiệm điện và vận hành êm ái. Với các công nghệ hiện đại như Inverter, Silk Air, chế độ BabyCare và iClean, sản phẩm không chỉ đáp ứng nhu cầu làm mát mà còn bảo vệ sức khỏe và nâng cao chất lượng cuộc sống cho người dùng.\nXem thêm","desc":"Máy lạnh Casper Inverter 1 HP QC-09IU36A\nlà lựa chọn lý tưởng cho các không gian dưới 15m² như phòng ngủ, phòng làm việc cá nhân hoặc cửa hàng nhỏ. Với công suất 9.500 BTU, sản phẩm tích hợp công nghệ Inverter tiết kiệm điện, chế độ Turbo làm lạnh nhanh, c\nùng các tính năng như Silk Air, BabyCare mang đến trải nghiệm làm mát dễ chịu, tiết kiệm năng lượng và bảo vệ sức khỏe người dùng.\nThiết kế\nDàn lạnh\n-\nMáy lạnh Casper\nsở hữu thiết kế treo tường hiện đại, tiết kiệm không gian, kết hợp với gam màu trắng thanh lịch giúp sản phẩm dễ dàng hài hòa với nhiều phong cách nội thất.\n- Điểm nhấn độc đáo của thiết kế này là\nmàn hình LED hiển thị nhiệt độ\ntrực quan giúp người dùng dễ dàng quan sát và điều chỉnh vào ban đêm.\nDàn nóng\n- Dàn nóng được trang bị hệ thống\nống dẫn gas bằng đồng mạ vàng, lá tản nhiệt bằng nhôm mạ vàng\nđảm bảo hiệu quả làm lạnh, tăng độ bền cho thiết bị chống chịu trước thời tiết ẩm ướt, sương muối,...\n- Thiết bị sử dụng\ngas R32\nthân thiện với môi trường đồng thời đảm bảo hiệu suất làm lạnh.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh Casper 1 HP\nhoạt động với công suất\n9.500 BTU\n, phù hợp lắp đặt trong không gian vừa phải có diện tích\ndưới 15m².\nVì vậy, thiết bị có thể ứng dụng tại nhiều vị trí trong gia đình như phòng ngủ, phòng đọc sách, phòng quần áo,...\n- Nhờ\ncông nghệ Turbo\nmáy lạnh được trang bị máy nén công nghệ cao, giúp nhiệt độ phòng có thể giảm xuống thấp trong thời gian ngắn, nhanh chóng mang lại không gian mát lạnh và thoải mái cho người dùng.\n-\nCông nghệ Silk Air\nkhuếch tán không khí mát thông qua hàng ngàn lỗ khí siêu nhỏ, tạo luồng khí mềm mại, nhẹ nhàng, không gây buốt lạnh, phù hợp với người lớn tuổi và trẻ nhỏ\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Casper Inverter\ncó chế độ thổi gió được thiết kế\nlên xuống tự động\n, giúp luồng khí lạnh luân chuyển đồng đều khắp không gian, đảm bảo mọi vị trí trong phòng đều được làm mát.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy nén hoạt động linh hoạt theo nhiệt độ phòng, giảm dao động công suất không cần thiết - từ đó tiết kiệm điện hiệu quả và kéo dài tuổi thọ máy.\n-\nChế độ i-Save\ntối ưu hóa đường cong nhiệt độ khi làm lạnh, cho phép máy hoạt động ổn định ở mức năng lượng thấp mà vẫn duy trì cảm giác mát mẻ.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ BabyCare\nđiều chỉnh nhiệt độ nhẹ nhàng, duy trì không gian dễ chịu mà không gây lạnh đột ngột, phù hợp cho gia đình có trẻ em hoặc người cao tuổi.\n-\nCảm biến nhiệt độ thông minh I Feel\nsử dụng cảm biến để đo nhiệt độ tại vị trí người dùng, giúp\nmáy lạnh\nđiều chỉnh chính xác mức nhiệt độ phù hợp với khu vực bạn đang ngồi.\n-\nTự khởi động lại khi có điện\n, giữ nguyên chế độ hoạt động trước khi bị ngắt điện.\n-\nKhóa remote điều khiển\n, đảm bảo an toàn khi sử dụng trong gia đình có trẻ nhỏ.\n-\nCơ chế bảo vệ an toàn kép thông minh\n, phát hiện rò rỉ đảm bảo an toàn tuyệt đối khi sử dụng.\n-\nHẹn giờ bật, tắt máy\nlinh hoạt, phù hợp với lịch trình sinh hoạt của người dùng.\n-\nChức năng\niClean tự động làm sạch dàn lạnh\nngăn ngừa sự hình thành vi khuẩn, nấm mốc phát triển, bảo vệ sức khỏe người dùng và duy trì hiệu suất làm lạnh ổn định lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Casper Inverter 1 HP QC-09IU36A là lựa chọn hoàn hảo cho không gian nhỏ dưới 15m², mang đến khả năng làm lạnh nhanh, tiết kiệm điện và vận hành êm ái. Với các công nghệ hiện đại như Inverter, Silk Air, chế độ BabyCare và iClean, sản phẩm không chỉ đáp ứng nhu cầu làm mát mà còn bảo vệ sức khỏe và nâng cao chất lượng cuộc sống cho người dùng.\nXem thêm","specs":{"Loại máy":"1 chiều (chỉ làm lạnh)","Inverter":"Có Inverter","Công suất làm lạnh":"1 HP - 9.500 BTU","Phạm vi làm lạnh hiệu quả":"Dưới 15m² (từ 30 đến 45m³)","Độ ồn trung bình (được đo trong phòng thí nghiệm)":"Dàn lạnh: 36 dB - Dàn nóng: 52 dB","Dòng sản phẩm":"2025","Sản xuất tại":"Thái Lan","Thời gian bảo hành cục lạnh, cục nóng":"3 năm","Thời gian bảo hành máy nén":"Máy nén 12 năm","Chất liệu dàn tản nhiệt":"Ống dẫn gas bằng Đồng mạ vàng - Lá tản nhiệt bằng Nhôm mạ vàng","Loại Gas":"R-32","Tiêu thụ điện":"1.03 kWh","Nhãn năng lượng":"3 sao (Hiệu suất năng lượng 4.27)","Công nghệ tiết kiệm điện":"Inverter Công nghệ I-Save","Chế độ gió":"Đảo gió lên xuống tự động","Công nghệ làm lạnh nhanh":"Turbo","Tiện ích":"Thiết kế thông minh EasyCare dễ dàng lắp đặt Khóa remote điều khiển Cảm biến nhiệt độ I Feel Cơ chế bảo vệ an toàn kép phát hiện rò rỉ thông minh Chức năng tự động làm sạch iClean Chức năng tự làm sạch dàn lạnh Chế độ ngủ đêm Sleep cho người già, trẻ nhỏ Chế độ BabyCare Màn hình hiển thị nhiệt độ trên dàn lạnh Hẹn giờ bật, tắt máy Tự khởi động lại khi có điện Công nghệ làm lạnh Silk Air","Kích thước dàn lạnh":"Dài 76.8 cm - Cao 28.7 cm - Dày 20 cm","Khối lượng dàn lạnh":"7.5 kg","Kích thước dàn nóng":"Dài 71 cm - Cao 45.5 cm - Dày 27.5 cm","Khối lượng dàn nóng":"16 kg","Chiều dài lắp đặt ống đồng":"Tối thiểu 3m - Tối đa 20m","Chiều cao lắp đặt tối đa giữa cục nóng-lạnh":"5m","Dòng điện vào":"Dàn lạnh","Dòng điện hoạt động":"1 pha","Kích thước ống đồng":"6/10","Số lượng kết nối dàn lạnh tối đa":"1","Hãng":"Casper. Xem thông tin hãng"},"feats":["- Máy lạnh Casper sở hữu thiết kế treo tường hiện đại, tiết kiệm không gian, kết hợp với gam màu trắng thanh lịch giúp sản phẩm dễ dàng hài hòa với nhiều phong cách nội thất.","- Điểm nhấn độc đáo của thiết kế này là màn hình LED hiển thị nhiệt độ trực quan giúp người dùng dễ dàng quan sát và điều chỉnh vào ban đêm.","- Dàn nóng được trang bị hệ thống ống dẫn gas bằng đồng mạ vàng, lá tản nhiệt bằng nhôm mạ vàng đảm bảo hiệu quả làm lạnh, tăng độ bền cho thiết bị chống chịu trước thời tiết ẩm ướt, sương muối,...","- Thiết bị sử dụng gas R32 thân thiện với môi trường đồng thời đảm bảo hiệu suất làm lạnh.","- Công nghệ Silk Air khuếch tán không khí mát thông qua hàng ngàn lỗ khí siêu nhỏ, tạo luồng khí mềm mại, nhẹ nhàng, không gây buốt lạnh, phù hợp với người lớn tuổi và trẻ nhỏ","- Máy lạnh Casper Inverter có chế độ thổi gió được thiết kế lên xuống tự động , giúp luồng khí lạnh luân chuyển đồng đều khắp không gian, đảm bảo mọi vị trí trong phòng đều được làm mát.","- Công nghệ Inverter giúp máy nén hoạt động linh hoạt theo nhiệt độ phòng, giảm dao động công suất không cần thiết - từ đó tiết kiệm điện hiệu quả và kéo dài tuổi thọ máy.","- Chế độ i-Save tối ưu hóa đường cong nhiệt độ khi làm lạnh, cho phép máy hoạt động ổn định ở mức năng lượng thấp mà vẫn duy trì cảm giác mát mẻ.","Xem thêm: Tổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng","- Chế độ BabyCare điều chỉnh nhiệt độ nhẹ nhàng, duy trì không gian dễ chịu mà không gây lạnh đột ngột, phù hợp cho gia đình có trẻ em hoặc người cao tuổi.","- Cảm biến nhiệt độ thông minh I Feel sử dụng cảm biến để đo nhiệt độ tại vị trí người dùng, giúp máy lạnh điều chỉnh chính xác mức nhiệt độ phù hợp với khu vực bạn đang ngồi.","- Tự khởi động lại khi có điện , giữ nguyên chế độ hoạt động trước khi bị ngắt điện."],"sku":"334018","vid":"","mod":"334018","brand":"Casper","slug":"334018-may-lanh-casper-inverter-1-hp-qc-09iu36a","_source":"avatar2-add-product","_source_url":"https://www.dienmayxanh.com/may-lanh/casper-inverter-1-hp-qc-09iu36a?srsltid=AfmBOoqQ9ZboJ-kIowTFz_lseNn8NKmYw_vPGyDBAaKcBREuz5uJck23","_added_at":"2026-10-05T14:43:07.224Z"},{"n":"Bếp Điện Từ Canzy CZI39992C SERI8","l":"https://canzyvietnam.vn/bep-dien-tu-canzy-cz-i39992c-serial-8-0","i":"https://bizweb.dktcdn.net/100/357/739/products/758e2570-49e4-44aa-bd20-b7d006e318ad.jpg","p":"12.980.000đ","pn":12980000,"listPn":12980000,"salePn":12980000,"priceMode":"list","c":"Bếp từ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/357/739/products/758e2570-49e4-44aa-bd20-b7d006e318ad.jpg","https://bizweb.dktcdn.net/100/357/739/products/gen-n-6-1387979f-8fc6-4b67-adcb-5b8b4cbf877c.jpg"],"sum":"Bếp từ đôi Canzy CZ-I39992C Serial 8.0 là mẫu bếp âm hai vùng nấu dành cho căn bếp hiện đại, kết hợp mặt kính ELCD Platinum Ceramic đen bóng với bo viền nhôm màu sáng. Hai vùng từ vận hành độc lập, điều khiển cảm ứng trượt 9 mức nhiệt và công nghệ Inverter giúp nấu linh hoạt, tiết kiệm điện trong quá trình sử dụng hằng","desc":"Bếp từ đôi Canzy CZ-I39992C Serial 8.0 là mẫu bếp âm hai vùng nấu dành cho căn bếp hiện đại, kết hợp mặt kính ELCD Platinum Ceramic đen bóng với bo viền nhôm màu sáng. Hai vùng từ vận hành độc lập, điều khiển cảm ứng trượt 9 mức nhiệt và công nghệ Inverter giúp nấu linh hoạt, tiết kiệm điện trong quá trình sử dụng hằng","specs":{},"feats":["Số vùng nấu 2 vùng từ","Mặt kính ELCD Platinum Ceramic đen bóng, bo viền nhôm màu sáng","Điều khiển Cảm ứng Slide, 9 cấp độ nấu","Công nghệ Inverter thông minh, tiết kiệm khoảng 30% điện năng","Vùng nấu trái Booster 2.400W","Vùng nấu phải Booster 2.400W","Điện áp 220/240V","Kích thước mặt bếp 730 x 430 mm","Kích thước cắt đá 690 x 390 mm","Chức năng nấu Sôi liu riu, Warm, Stir Fry, Pause, Booster, hẹn giờ","An toàn Tự ngắt khi không có nồi; cảnh báo dư nhiệt; chống tràn; khóa trẻ em; khóa phím; bảo vệ quá nhiệt - quá áp"],"sku":"CZI39992C","vid":"","mod":"CZI39992C","brand":"Canzy","slug":"czi39992c-bep-dien-tu-canzy-czi39992c-seri8","_source":"avatar2-add-product","_source_url":"https://canzyvietnam.vn/bep-dien-tu-canzy-cz-i39992c-serial-8-0","_added_at":"2026-10-05T14:43:00.583Z"},{"n":"Hút Mùi Âm Tủ Canzy CZH1270AT","l":"https://canzyvietnam.vn/hut-mui-am-tu-canzy-cz-h1270at","i":"https://bizweb.dktcdn.net/100/357/739/products/d8a4ae24-299d-442f-8a77-a7aaeae9219b.jpg","p":"5.980.000đ","pn":5980000,"listPn":5980000,"salePn":5980000,"priceMode":"list","c":"Máy hút mùi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/357/739/products/d8a4ae24-299d-442f-8a77-a7aaeae9219b.jpg","https://bizweb.dktcdn.net/100/357/739/products/3cebb626-dd99-4f8d-ae1e-067ddac165a0.jpg"],"sum":"Canzy CZ H1270AT: Máy hút mùi âm tủ kéo rút – Tinh gọn không gian, tối ưu sức mạnh Canzy CZ-H1270AT là dòng máy hút mùi âm tủ thế hệ mới, được thiết kế đặc biệt cho những căn hộ chung cư hoặc không gian bếp cần sự ngăn nắp tuyệt đối. Với cơ chế hoạt động kéo rút linh hoạt cùng khả năng vận hành siêu êm ái, CZ H1270AT k","desc":"Canzy CZ H1270AT: Máy hút mùi âm tủ kéo rút – Tinh gọn không gian, tối ưu sức mạnh Canzy CZ-H1270AT là dòng máy hút mùi âm tủ thế hệ mới, được thiết kế đặc biệt cho những căn hộ chung cư hoặc không gian bếp cần sự ngăn nắp tuyệt đối. Với cơ chế hoạt động kéo rút linh hoạt cùng khả năng vận hành siêu êm ái, CZ H1270AT k","specs":{"Tiêu chí kỹ thuật":"Thông số chi tiết","Model":"CZ H1270AT","Thương hiệu":"Canzy (Chính hãng)","Kiểu máy":"Máy hút mùi âm tủ kéo rút (Kéo ra bật – Đóng vào tắt)","Chất liệu":"Inox cao cấp – Kính cường lực","Động cơ":"160W (Vận hành ổn định)","Công suất hút":"950 m³/h (Cực mạnh trong phân khúc)","Độ ồn":"≤ 38 dB (Siêu êm ái)","Điều khiển":"3 tốc độ linh hoạt","Hệ thống lọc mỡ":"2 lưới lọc Aluminum 3 lớp (Dễ vệ sinh)","Chế độ khử mùi":"Than hoạt tính hoặc ống thoát Ø120mm","Hệ thống chiếu sáng":"Đèn 2 × 40W (Hỗ trợ nấu nướng)","Tiện ích an toàn":"Lẫy cài Inox chống cháy, hẹn giờ mặc định","Đường kính ống thoát":"Ø120 mm"},"feats":["• Tối ưu diện tích: Toàn bộ thân máy được giấu kín trong tủ bếp, chỉ để lộ phần thanh kéo thanh mảnh, giúp gian bếp trông rộng rãi và chuyên nghiệp hơn.","Động cơ 160W nội lực: Dù thiết kế nhỏ gọn, CZ H1270AT sở hữu công suất hút lên đến 950m3/h, loại bỏ nhanh chóng mùi thức ăn đậm mùi nhất.","Hệ thống khử mùi kép: Tích hợp chế độ khử mùi tại chỗ bằng than hoạt tính hoặc xả trực tiếp qua ống thoát Ø120mm, linh hoạt cho mọi địa hình lắp đặt.","Máy này có hẹn giờ không? Có, CZ H1270AT tích hợp chế độ hẹn giờ mặc định giúp bạn yên tâm để máy tự làm sạch không khí sau khi nấu.","Kéo ra một nửa máy có chạy không? Máy bắt đầu hoạt động ngay khi bạn kéo nhẹ thanh trượt, tuy nhiên nên kéo hết cỡ để diện tích hút khói là lớn nhất."],"sku":"H1270AT","vid":"","mod":"H1270AT","brand":"Canzy","slug":"h1270at-hut-mui-am-tu-canzy-czh1270at","_source":"avatar2-add-product","_source_url":"https://canzyvietnam.vn/hut-mui-am-tu-canzy-cz-h1270at","_added_at":"2026-10-05T14:42:54.993Z"},{"n":"Kệ Gia Vị Nâng Hạ Điện STAR MOVE (401354 - 900mm) - Higold ","l":"https://phukienbepthanhdat.com/ke-gia-vi-nang-ha-dien-star-move-401354-900mm-higold/","i":"https://phukienbepthanhdat.com/wp-content/uploads/2025/10/ke-gia-vi-nang-ha-dien-star-move-1.jpg","p":"21.000.000đ","pn":21000000,"listPn":21000000,"salePn":21000000,"priceMode":"list","c":"Kệ gia vị nâng hạ điện","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://phukienbepthanhdat.com/wp-content/uploads/2025/10/ke-gia-vi-nang-ha-dien-star-move-1.jpg"],"sum":"Đặc điểm nổi bật \nGiá gia vị nâng hạ điện STAR MOVE sử dụng công nghệ cảm biến chạm hiện đại. Chỉ cần chạm nhẹ vào bộ cảm biến, giá gia vị sẽ tự động hạ xuống theo chiều thẳng đứng, giúp tận dụng được những khoang tủ cao. Người dùng có thể dừng giá ở bất kỳ vị trí nào hoặc đưa về trạng thái ban đầu chỉ với một thao tác chạm. Cảm biến hoạt động mượt mà ngay cả khi tay bạn ướt hoặc dính dầu mỡ.\nHệ thống ròng rọc và ray trượt chắc chắn giúp giá vận hành trơn tru. Khi nhận tín hiệu chạm, hệ thống sẽ kéo giá xuống. Trong quá trình di chuyển, nếu gặp vật cản phía dưới, giá sẽ tự động đảo chiều đi lên, đảm bảo an toàn cho người dùng và thiết bị.\nGiá được thiết kế 2 tầng riêng biệt. Tầng trên để các lọ gia vị nhỏ, tầng dưới phù hợp cho các chai lớn hơn, giúp phân loại và sắp xếp gọn gàng, tận dụng hiệu quả không gian tủ bếp trên – nơi thường khó với tới.\nToàn bộ khung và giỏ được làm từ hợp kim nhôm phủ sơn tĩnh điện, có khả năng chống oxy hóa, hạn chế han gỉ, bền bỉ trong môi trường bếp ẩm, đồng thời dễ dàng vệ sinh.\nKết cấu chắc chắn, sản phẩm có khả năng chịu tải lên đến 20kg.\nSản phẩm sử dụng điện áp định mức 100-220V, tương thích với hầu hết hệ thống điện trong gia đình.\nĐèn LED tích hợp trên giá giúp chiếu sáng khu vực lưu trữ, hỗ trợ người dùng dễ dàng nhận biết và lấy đúng chai lọ mình cần ngay cả trong điều kiện thiếu sáng.","desc":"Đặc điểm nổi bật \nGiá gia vị nâng hạ điện STAR MOVE sử dụng công nghệ cảm biến chạm hiện đại. Chỉ cần chạm nhẹ vào bộ cảm biến, giá gia vị sẽ tự động hạ xuống theo chiều thẳng đứng, giúp tận dụng được những khoang tủ cao. Người dùng có thể dừng giá ở bất kỳ vị trí nào hoặc đưa về trạng thái ban đầu chỉ với một thao tác chạm. Cảm biến hoạt động mượt mà ngay cả khi tay bạn ướt hoặc dính dầu mỡ.\nHệ thống ròng rọc và ray trượt chắc chắn giúp giá vận hành trơn tru. Khi nhận tín hiệu chạm, hệ thống sẽ kéo giá xuống. Trong quá trình di chuyển, nếu gặp vật cản phía dưới, giá sẽ tự động đảo chiều đi lên, đảm bảo an toàn cho người dùng và thiết bị.\nGiá được thiết kế 2 tầng riêng biệt. Tầng trên để các lọ gia vị nhỏ, tầng dưới phù hợp cho các chai lớn hơn, giúp phân loại và sắp xếp gọn gàng, tận dụng hiệu quả không gian tủ bếp trên – nơi thường khó với tới.\nToàn bộ khung và giỏ được làm từ hợp kim nhôm phủ sơn tĩnh điện, có khả năng chống oxy hóa, hạn chế han gỉ, bền bỉ trong môi trường bếp ẩm, đồng thời dễ dàng vệ sinh.\nKết cấu chắc chắn, sản phẩm có khả năng chịu tải lên đến 20kg.\nSản phẩm sử dụng điện áp định mức 100-220V, tương thích với hầu hết hệ thống điện trong gia đình.\nĐèn LED tích hợp trên giá giúp chiếu sáng khu vực lưu trữ, hỗ trợ người dùng dễ dàng nhận biết và lấy đúng chai lọ mình cần ngay cả trong điều kiện thiếu sáng.","specs":{"Kích thước (rộng x sâu x cao)":"864 x 263x 690mm","Chất liệu":"Thép cacbon + Hợp kim nhôm","Kích thước phủ bì":"900mm"},"feats":["Giá được thiết kế 2 tầng riêng biệt. Tầng trên để các lọ gia vị nhỏ, tầng dưới phù hợp cho các chai lớn hơn, giúp phân loại và sắp xếp gọn gàng, tận dụng hiệu quả không gian tủ bếp trên – nơi thường khó với tới.","Toàn bộ khung và giỏ được làm từ hợp kim nhôm phủ sơn tĩnh điện, có khả năng chống oxy hóa, hạn chế han gỉ, bền bỉ trong môi trường bếp ẩm, đồng thời dễ dàng vệ sinh.","Kết cấu chắc chắn, sản phẩm có khả năng chịu tải lên đến 20kg.","Sản phẩm sử dụng điện áp định mức 100-220V, tương thích với hầu hết hệ thống điện trong gia đình.","Đèn LED tích hợp trên giá giúp chiếu sáng khu vực lưu trữ, hỗ trợ người dùng dễ dàng nhận biết và lấy đúng chai lọ mình cần ngay cả trong điều kiện thiếu sáng."],"sku":"401354","vid":"","mod":"401354","brand":"Higold","slug":"401354-ke-gia-vi-nang-ha-dien-star-move-401354-900mm-higold","_source":"vai-market-add-product","_source_url":"https://phukienbepthanhdat.com/ke-gia-vi-nang-ha-dien-star-move-401354-900mm-higold/","_added_at":"2026-09-04T10:19:11.557Z"},{"n":"Khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi","l":"https://thienkimhome.com/demax-el988-24k-brass-app-wifi","i":"https://thienkimhome.com/application/upload/products/Demax-SL988-24K-Brass-App-Wifi.jpg","p":"59.990.000đ","pn":59990000,"listPn":59990000,"salePn":59990000,"priceMode":"list","c":"Khóa điện tử","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://thienkimhome.com/application/upload/products/Demax-SL988-24K-Brass-App-Wifi.jpg","https://thienkimhome.com/application/upload/products/kich-thuoc-sl-988-24k.png","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-1.jpg","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-2.jpg","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-3.jpg"],"sum":"Tổng quan  khóa Demax EL988 24K Brass App Wifi \nTrong thị trường khóa thông minh ngày nay, Khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi từ Malaysia nổi bật với thiết kế và tính năng đa dạng, đáp ứng mọi yêu cầu của khách hàng. Với màu sắc Mạ Vàng 24K, khóa này thực sự là một tác phẩm nghệ thuật cho các không gian đại sảnh và biệt thự.\nChất liệu bền bỉ và thiết kế sang trọng \nKhóa cao cấp Brass được chế tạo từ đồng thau nguyên chất với lớp mạ vàng 24K, mang đến vẻ đẹp sang trọng và độ bền cao. Thân khóa làm từ thép SUS 304 chất lượng, giúp khóa chống chịu được va đập và thời tiết khắc nghiệt, bảo vệ tối đa cho ngôi nhà của bạn. \nVới sự kết hợp giữa thiết kế đẳng cấp và chất liệu chất lượng, tạo nên một điểm nhấn độc đáo cho không gian của bạn.\nƯu điểm của khóa \nMở khóa đa phương thức và bảo mật tuyệt đối \nThiết bị có khả năng mở khóa theo nhiều phương thức khác nhau, đảm bảo tính bảo mật tuyệt đối cho ngôi nhà của bạn. Bạn có thể mở khóa bằng nhận diện khuôn mặt FACE ID-3D, mở khóa từ xa thông qua ứng dụng Wifi, sử dụng vân tay, mật mã, thẻ từ, hoặc chìa khóa chống sao chép.\nTiện ích và linh hoạt \nSản phẩm không chỉ hướng đến tính bảo mật mà còn mang lại nhiều tiện ích và linh hoạt cho người dùng. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể dễ dàng quản lý quyền truy cập của gia đình và khách khứa.\nNgoài ra, khóa còn tích hợp nhiều tính năng thông minh như nhận dạng vân tay bằng sinh trắc học FPC từ Thụy Điển, chức năng thoát hiểm từ bên trong, tay nắm đổi chiều Phải - Trái, cảnh báo đột nhập, vô hiệu hóa thẻ bị mất và chức năng cập nhật thông tin. Bạn sẽ luôn được nhắc nhở khi pin yếu, đảm bảo khóa luôn hoạt động hiệu quả.\nKết nối thông minh và dễ dàng sử dụng \nKhóa có thể kết nối với điện thoại thông qua ứng dụng App wifi đơn giản, giúp bạn kiểm soát và điều khiển từ xa một cách dễ dàng. Bạn có thể mở khóa, cập nhật thông tin và nhận thông báo trạng thái của khóa mọi lúc, mọi nơi.\nKhả năng lưu trữ \nKhóa điện tử thông minh Brass App Wifi được trang bị nhiều tính năng hữu ích. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể quản lý quyền truy cập một cách linh hoạt và tiện lợi. Đồng thời, khóa còn hỗ trợ thẻ từ theo máy và chìa khóa chống sao chép, giúp tăng cường tính bảo mật cho ngôi nhà của bạn.\nTính năng độc đáo và thông minh \nKhóa cửa Demax EL988 24K Brass App Wifi mang đến nhiều tính năng độc đáo và thông minh. Với nhận diện vân tay bằng sinh trắc học FPC từ Thụy Điển, khóa đảm bảo độ chính xác và an toàn cao.\nHơn nữa, khóa còn được trang bị chức năng thoát hiểm từ bên trong, giúp bạn dễ dàng ra vào ngôi nhà trong trường hợp khẩn cấp.\nSự đa dạng và phù hợp với không gian \nKhóa đại sảnh 24K từ Malaysia không chỉ chú trọng đến tính năng và bảo mật, mà còn phù hợp với nhiều loại không gian khác nhau. Với kích thước mặt trong và mặt ngoài cùng là 80 x 735mm, khóa này có thể dễ dàng lắp đặt vào cửa đi của các đại sảnh và khóa cửa gỗ đại sảnh biệt thự.\nĐơn giản và thuận tiện trong sử dụng \nTrên đây là những thông tin về khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi, một sản phẩm kết hợp hoàn hảo giữa công nghệ và sang trọng. Với thiết kế đẳng cấp, tính bảo mật cao, tính năng đa dạng và kết nối thông minh, khóa này sẽ mang đến trải nghiệm tuyệt vời cho ngôi nhà của bạn.","desc":"Tổng quan  khóa Demax EL988 24K Brass App Wifi \nTrong thị trường khóa thông minh ngày nay, Khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi từ Malaysia nổi bật với thiết kế và tính năng đa dạng, đáp ứng mọi yêu cầu của khách hàng. Với màu sắc Mạ Vàng 24K, khóa này thực sự là một tác phẩm nghệ thuật cho các không gian đại sảnh và biệt thự.\nChất liệu bền bỉ và thiết kế sang trọng \nKhóa cao cấp Brass được chế tạo từ đồng thau nguyên chất với lớp mạ vàng 24K, mang đến vẻ đẹp sang trọng và độ bền cao. Thân khóa làm từ thép SUS 304 chất lượng, giúp khóa chống chịu được va đập và thời tiết khắc nghiệt, bảo vệ tối đa cho ngôi nhà của bạn. \nVới sự kết hợp giữa thiết kế đẳng cấp và chất liệu chất lượng, tạo nên một điểm nhấn độc đáo cho không gian của bạn.\nƯu điểm của khóa \nMở khóa đa phương thức và bảo mật tuyệt đối \nThiết bị có khả năng mở khóa theo nhiều phương thức khác nhau, đảm bảo tính bảo mật tuyệt đối cho ngôi nhà của bạn. Bạn có thể mở khóa bằng nhận diện khuôn mặt FACE ID-3D, mở khóa từ xa thông qua ứng dụng Wifi, sử dụng vân tay, mật mã, thẻ từ, hoặc chìa khóa chống sao chép.\nTiện ích và linh hoạt \nSản phẩm không chỉ hướng đến tính bảo mật mà còn mang lại nhiều tiện ích và linh hoạt cho người dùng. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể dễ dàng quản lý quyền truy cập của gia đình và khách khứa.\nNgoài ra, khóa còn tích hợp nhiều tính năng thông minh như nhận dạng vân tay bằng sinh trắc học FPC từ Thụy Điển, chức năng thoát hiểm từ bên trong, tay nắm đổi chiều Phải - Trái, cảnh báo đột nhập, vô hiệu hóa thẻ bị mất và chức năng cập nhật thông tin. Bạn sẽ luôn được nhắc nhở khi pin yếu, đảm bảo khóa luôn hoạt động hiệu quả.\nKết nối thông minh và dễ dàng sử dụng \nKhóa có thể kết nối với điện thoại thông qua ứng dụng App wifi đơn giản, giúp bạn kiểm soát và điều khiển từ xa một cách dễ dàng. Bạn có thể mở khóa, cập nhật thông tin và nhận thông báo trạng thái của khóa mọi lúc, mọi nơi.\nKhả năng lưu trữ \nKhóa điện tử thông minh Brass App Wifi được trang bị nhiều tính năng hữu ích. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể quản lý quyền truy cập một cách linh hoạt và tiện lợi. Đồng thời, khóa còn hỗ trợ thẻ từ theo máy và chìa khóa chống sao chép, giúp tăng cường tính bảo mật cho ngôi nhà của bạn.\nTính năng độc đáo và thông minh \nKhóa cửa Demax EL988 24K Brass App Wifi mang đến nhiều tính năng độc đáo và thông minh. Với nhận diện vân tay bằng sinh trắc học FPC từ Thụy Điển, khóa đảm bảo độ chính xác và an toàn cao.\nHơn nữa, khóa còn được trang bị chức năng thoát hiểm từ bên trong, giúp bạn dễ dàng ra vào ngôi nhà trong trường hợp khẩn cấp.\nSự đa dạng và phù hợp với không gian \nKhóa đại sảnh 24K từ Malaysia không chỉ chú trọng đến tính năng và bảo mật, mà còn phù hợp với nhiều loại không gian khác nhau. Với kích thước mặt trong và mặt ngoài cùng là 80 x 735mm, khóa này có thể dễ dàng lắp đặt vào cửa đi của các đại sảnh và khóa cửa gỗ đại sảnh biệt thự.\nĐơn giản và thuận tiện trong sử dụng \nTrên đây là những thông tin về khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi, một sản phẩm kết hợp hoàn hảo giữa công nghệ và sang trọng. Với thiết kế đẳng cấp, tính bảo mật cao, tính năng đa dạng và kết nối thông minh, khóa này sẽ mang đến trải nghiệm tuyệt vời cho ngôi nhà của bạn.","specs":{"Mã sản phẩm":"Mã Mới: EL988 24K Brass Mã cũ: SL988 24K Brass App Wifi","Thương hiệu":"Demax Xem thông tin hãng","Xuất xứ":"Malaysia","Cách mở khoá":"– Mở khóa bằng nhận diện khuôn mặt FACE ID-3D – Mở khóa từ xa bằng App Wifi – Mở khóa bằng vân tay – Mở khóa bằng mật mã – Mở khóa bằng thẻ từ – Chìa khóa chống sao chép","Màu sắc":"Mạ Vàng 24K","Phù hợp cho":"Đại sảnh - biệt thự","Kích thước mặt trong":"80 x 735mm (Rộng x cao)","Kích thước mặt ngoài":"80 x 735mm (Rộng x cao)","Khả năng lưu trữ":"– Số vân tay: 100 – Số thẻ từ (cài đặt, sử dụng): 100 – Nhận dạng khuôn mặt: 100 – Thẻ từ theo máy: 2 – Chìa khóa chống sao chép: 2","Tính năng":"– Nhận dạng vân tay bằng sinh trắc học FPC – Thụy Điển – Chức năng thoát hiểm từ bên trong – Tay nắm đổi chiều Phải – Trái – Cảnh báo đột nhập – Vô hiệu hóa thẻ bị mật – Chức năng cập nhật thông tin – Nhắc nhở pin yếu","Vật liệu":"Đồng thau nguyên chất, mạ vàng 24 K – Thân khóa thép SUS 304","Nguồn điện":"7,4V Lithium (Pin sạc Lithium kép)","Nguồn khẩn cấp":"5V-2A, Micro USB","Độ dày cửa":"40~90 mm","Đố cửa":"> 100 mm","Loại cửa":"Cửa đi","Kết nối điện thoại":"Có","Phụ kiện kèm theo":"– Thẻ từ theo máy: 2 – Chìa khóa chống sao chép: 2"},"feats":["Tổng quan  khóa Demax EL988 24K Brass App Wifi","Chất liệu bền bỉ và thiết kế sang trọng","Ưu điểm của khóa","Mở khóa đa phương thức và bảo mật tuyệt đối","Tiện ích và linh hoạt","Kết nối thông minh và dễ dàng sử dụng","Khả năng lưu trữ","Tính năng độc đáo và thông minh","Sự đa dạng và phù hợp với không gian","Đơn giản và thuận tiện trong sử dụng"],"sku":"EL988","vid":"","mod":"EL988","brand":"Demax","slug":"el988-khoa-dai-sanh-biet-thu-demax-el988-24k-brass-app-wifi","_source":"vai-market-add-product","_source_url":"https://thienkimhome.com/demax-el988-24k-brass-app-wifi","_added_at":"2026-09-04T10:19:08.461Z"},{"n":"Chậu rửa KAFF GRANITE KF - MONDY - 8552S","l":"https://kaff.vn/san-pham/chau-rua-granite-kf-mondy-8552s-5013.html","i":"https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1704662337400.jpg","p":"9.880.000đ","pn":9880000,"listPn":0,"salePn":9880000,"priceMode":"both","c":"Chậu rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1704662337400.jpg","https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1751539458342.jpg"],"sum":"Giá bán khuyến mãi 9,880,000đ Chậu rửa GRANITE KF - MONDY - 8552S • Chất liệu: Đá GRANITE • Màu sắc: Đen, trắng, vàng, kem, xám • Độ sâu bồn: 220mm • Kích thước: 850D x 515R mm • Đóng gói: 1 bộ tiêu chuẩn túi PE Foam (kèm siphon) • Bảo hành: 3 năm","desc":"Giá bán khuyến mãi 9,880,000đ Chậu rửa GRANITE KF - MONDY - 8552S • Chất liệu: Đá GRANITE • Màu sắc: Đen, trắng, vàng, kem, xám • Độ sâu bồn: 220mm • Kích thước: 850D x 515R mm • Đóng gói: 1 bộ tiêu chuẩn túi PE Foam (kèm siphon) • Bảo hành: 3 năm","specs":{"Màu sắc":"Đen, trắng, vàng, kem, xám • Độ sâu bồn: 220mm • Kích thước: 850D x 515R mm • Đóng gói: 1 bộ tiêu chuẩn túi PE Foam (kèm siphon) • Bảo hành: 3 năm"},"feats":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"sku":"GRANITE KF - MONDY - 8552S","vid":"","mod":"GRANITE KF - MONDY - 8552S","brand":"KAFF","slug":"granite-kf-mondy-8552s-chau-rua-kaff-granite-kf-mondy-8552s","_source":"vai-market-add-product","_source_url":"https://kaff.vn/san-pham/chau-rua-granite-kf-mondy-8552s-5013.html","_added_at":"2026-09-04T10:19:05.606Z"},{"n":"MÁY RỬA CHÉN KAFF KF-GARDE820 SEMI","l":"https://kaff.vn/san-pham/may-rua-chen-kaff-kf-garde820-semi-4994.html","i":"https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1700107978718.jpg","p":"30.800.000đ","pn":30800000,"listPn":0,"salePn":30800000,"priceMode":"both","c":"MÁY RỬA CHÉN","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1700107978718.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490852905.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490852442.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853426.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853575.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853725.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-173449085368.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853605.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853664.jpg","https://kaff.vn/upload/products/large/may-rua-chen-am-ban-phan-kf-hb805se17-pro-1757658670600.jpg"],"sum":"MÁY RỬA CHÉN KAFF KF-GARDE820 SEMI • Máy rửa chén âm bán phần • Sức chứa 15 bộ đồ ăn Châu Âu • 10 Chương trình rửa tích hợp: Prewash, Mini 14’ (Jet Wash), Quick 30’ 40°C, Eco (Standard Programme), Super 50’ 65°C (Quick Clean), Easy Care 60°C, Dual Pro Wash 60°C, Smart 30°C - 50°C, Smart 50°C - 60°C, Smart 60°C - 70°C. Chức năng đặc biệt: *Delay timer option • Eco Wash - Half load option (with 3 mode), Tablet option, Extra Hygiene option, Extra Drying option, Extra Silent option (Silent Wash), Extra Fast option, Energy Save option, Rinse-aid indicator, Salt indicator, Washing cycle indicators, End of cycle indicator • Chức năng UVON diệt khuẩn (UVON natural tech) • Chức năng ION diệt khuẩn (ION natural tech) • Hệ thống sấy khô Tubo (Drying system) • Khóa trẻ em (Child lock) • Chức năng tạo Ozon • Hệ thống chống Siphon • Điều khiển cảm ứng hiện đại, màn hình Led sang trọng • Chức năng hẹn giờ (Delay time) • Chức năng nâng hạ giàn rửa (Adjustable upper basket) • Vòi phun phụ • Độ ồn cực thấp maximum 42 dB • Tiêu chuẩn tiết kiệm năng lượng châu Âu A+++, chỉ số hiệu quả năng lượng A • Chức năng khóa máy khi có sự cố tác động (ngập nước, va đập, yếu điện, thiếu nước,...) • Chống rò nước từ máy • Hệ thống chuyển hướng điện (Electrical Diverter system) • Đèn báo máy hoạt động và kết thúc chương trình rửa • Chức năng kiểm tra độ cứng và làm mềm nước • Đèn chiếu sáng bên trong (One spot) • Bảo hành 05 năm","desc":"MÁY RỬA CHÉN KAFF KF-GARDE820 SEMI • Máy rửa chén âm bán phần • Sức chứa 15 bộ đồ ăn Châu Âu • 10 Chương trình rửa tích hợp: Prewash, Mini 14’ (Jet Wash), Quick 30’ 40°C, Eco (Standard Programme), Super 50’ 65°C (Quick Clean), Easy Care 60°C, Dual Pro Wash 60°C, Smart 30°C - 50°C, Smart 50°C - 60°C, Smart 60°C - 70°C. Chức năng đặc biệt: *Delay timer option • Eco Wash - Half load option (with 3 mode), Tablet option, Extra Hygiene option, Extra Drying option, Extra Silent option (Silent Wash), Extra Fast option, Energy Save option, Rinse-aid indicator, Salt indicator, Washing cycle indicators, End of cycle indicator • Chức năng UVON diệt khuẩn (UVON natural tech) • Chức năng ION diệt khuẩn (ION natural tech) • Hệ thống sấy khô Tubo (Drying system) • Khóa trẻ em (Child lock) • Chức năng tạo Ozon • Hệ thống chống Siphon • Điều khiển cảm ứng hiện đại, màn hình Led sang trọng • Chức năng hẹn giờ (Delay time) • Chức năng nâng hạ giàn rửa (Adjustable upper basket) • Vòi phun phụ • Độ ồn cực thấp maximum 42 dB • Tiêu chuẩn tiết kiệm năng lượng châu Âu A+++, chỉ số hiệu quả năng lượng A • Chức năng khóa máy khi có sự cố tác động (ngập nước, va đập, yếu điện, thiếu nước,...) • Chống rò nước từ máy • Hệ thống chuyển hướng điện (Electrical Diverter system) • Đèn báo máy hoạt động và kết thúc chương trình rửa • Chức năng kiểm tra độ cứng và làm mềm nước • Đèn chiếu sáng bên trong (One spot) • Bảo hành 05 năm","specs":{},"feats":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"sku":"GARDE820SEMI","vid":"","mod":"GARDE820SEMI","brand":"KAFF","slug":"garde820semi-may-rua-chen-kaff-kf-garde820-semi","_source":"vai-market-add-product","_source_url":"https://kaff.vn/san-pham/may-rua-chen-kaff-kf-garde820-semi-4994.html","_added_at":"2026-09-04T10:19:03.354Z"},{"n":"BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus","l":"https://kaff.vn/san-pham/bep-dien-tu-kaff-kf-ic79h-new-plus-5094.html","i":"https://kaff.vn/upload/products/large/bep-dien-tu-kaff-kf-ic79h-new-plus-170850056341.jpg","p":"21.800.000đ","pn":21800000,"listPn":0,"salePn":21800000,"priceMode":"both","c":"BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://kaff.vn/upload/products/large/bep-dien-tu-kaff-kf-ic79h-new-plus-170850056341.jpg"],"sum":"Giá bán khuyến mãi 21,800,000đ BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus Bếp điện từ kết hợp: 02 từ + 01 điện – Xuất xứ: MALAYSIA Mặt kính Shott Ceran Made in Germany siêu bền, chịu lực chịu sốc nhiệt Đầu đốt EGO Made in Germany Chức năng Booster cực nhanh với bếp từ Bo mạch lGBT SIMENS Made in Germany Công nghệ Half- Bridge gia nhiệt liên tục 10 dải công suất Điều khiển cảm ứng Slider dạng ẩn trực tiếp trên mặt bếp Chế độ hẹn giờ, tiện dụng Chức năng Inverter và chia công suất tiết kiệm điện năng, bảo vệ bếp Bảo hành 05 năm","desc":"Giá bán khuyến mãi 21,800,000đ BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus Bếp điện từ kết hợp: 02 từ + 01 điện – Xuất xứ: MALAYSIA Mặt kính Shott Ceran Made in Germany siêu bền, chịu lực chịu sốc nhiệt Đầu đốt EGO Made in Germany Chức năng Booster cực nhanh với bếp từ Bo mạch lGBT SIMENS Made in Germany Công nghệ Half- Bridge gia nhiệt liên tục 10 dải công suất Điều khiển cảm ứng Slider dạng ẩn trực tiếp trên mặt bếp Chế độ hẹn giờ, tiện dụng Chức năng Inverter và chia công suất tiết kiệm điện năng, bảo vệ bếp Bảo hành 05 năm","specs":{},"feats":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"sku":"KAFF KF - IC79H New Plus","vid":"","mod":"KAFF KF - IC79H New Plus","brand":"KAFF","slug":"kaff-kf-ic79h-new-plus-bep-dien-tu-kaff-kf-ic79h-new-plus","_source":"vai-market-add-product","_source_url":"https://kaff.vn/san-pham/bep-dien-tu-kaff-kf-ic79h-new-plus-5094.html","_added_at":"2026-09-04T10:19:00.584Z"},{"n":"VÒI RỬA NÓNG LẠNH KAFF KF-FC9014","l":"https://kaff.vn/san-pham/voi-rua-nong-lanh-kaff-kf-fc9014-5054.html","i":"https://kaff.vn/upload/products/large/voi-rua-lanh-kaff-kf-fc9014-1704925929991.jpg","p":"4.180.000đ","pn":4180000,"listPn":0,"salePn":4180000,"priceMode":"both","c":"VÒI RỬA CHÉN","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://kaff.vn/upload/products/large/voi-rua-lanh-kaff-kf-fc9014-1704925929991.jpg"],"sum":"VÒI RỬA NÓNG LẠNH KAFF KF-FC9014 • Vòi lạnh • Bảo hành 3 năm","desc":"VÒI RỬA NÓNG LẠNH KAFF KF-FC9014 • Vòi lạnh • Bảo hành 3 năm","specs":{},"feats":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"sku":"KFFC9014","vid":"","mod":"KFFC9014","brand":"KAFF","slug":"kffc9014-voi-rua-nong-lanh-kaff-kf-fc9014","_source":"vai-market-add-product","_source_url":"https://kaff.vn/san-pham/voi-rua-nong-lanh-kaff-kf-fc9014-5054.html","_added_at":"2026-09-04T10:18:58.915Z"},{"n":"MÁY SẤY CHÉN KAFF KF-DR113L09BL","l":"https://kaff.vn/san-pham/may-say-kaff-kf-dr113l09bl-4993.html","i":"https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699435317207.jpg","p":"25.800.000đ","pn":25800000,"listPn":0,"salePn":25800000,"priceMode":"both","c":"MÁY SẤY CHÉN","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699435317207.jpg","https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699499640165.jpg"],"sum":"MÁY SẤY KAFF KF-DR113L09BL • Máy sấy cửa trước hiện đại lồng ngang • 15 chương trình sấy tự động tích hợp (Cotton Extra Dry, Cotton Cupboard Dry, Cotton Iron Dry, Synthetics Cupboard Dry, Synthetics Iron Dry, Delicate, Mix, Baby Care, Towels,Hygiene, Outdoor, Time drying, Refresh, Express, Shirts, Duvet, Sport, Wool refresh) • Khối lượng sấy khô 9 Kg • Công nghệ sấy cưỡng bức trực tiếp hiện đại - HEAT PUMP A++ (AL) • Lồng sấy inox, thân sơn tĩnh điện màu đen cao cấp • Chức năng diệt khuẩn an toàn UVC_TD • Motor Pump và máy nén Compressor motor kiểu PSC hoạt động đảo chiều, không sử dụng chổi than EcoSilence Drive giúp máy sấy hoạt động với đồ ồn thấp và bền bỉ - tiết kiệm năng lượng • Hệ thống cảm biến sấy an toàn Sensor Drying System • Đảo chiều lồng quay lúc sấy giúp sấy đồ khô nhanh hơn, hiệu quả hơn (Two Way Tumbling) • Điều khiển điện tử (Control system Electronic) • Hệ thống phát hiện lỗi khi sử dụng (Failure Detection System) • Khóa trẻ em an toàn (Child lock) • Hiện thị chu trình sấy (Drying cycle indicator) • Chức năng hẹn giờ lên đến 1-23h (Delay time adjustment via button) • Điều chỉnh cường độ sấy (Drying level adjustment via button) • Điều chỉnh chương trình sấy (Drying Target) • Điều chỉnh tốc độ sấy (Spin Speed Selection) • Màn hình hiện thị led màu sáng trắng LEDCOLOR_TD_T) • Hiện thị cảnh báo lọc đầy (Filter full indicator) • Hiện thị tank nước đầy (Water tank full indicator) • Cảnh báo cần làm sạch bình ngưng (Condenser cleaning indicator) • Thời lượng chương trình (phút) - Đầy tải: 208 • Thời lượng chương trình (phút) - Tải một phần: 116 • Thời lượng chương trình (phút) - Tải trọng 70%: 155 • ","desc":"MÁY SẤY KAFF KF-DR113L09BL • Máy sấy cửa trước hiện đại lồng ngang • 15 chương trình sấy tự động tích hợp (Cotton Extra Dry, Cotton Cupboard Dry, Cotton Iron Dry, Synthetics Cupboard Dry, Synthetics Iron Dry, Delicate, Mix, Baby Care, Towels,Hygiene, Outdoor, Time drying, Refresh, Express, Shirts, Duvet, Sport, Wool refresh) • Khối lượng sấy khô 9 Kg • Công nghệ sấy cưỡng bức trực tiếp hiện đại - HEAT PUMP A++ (AL) • Lồng sấy inox, thân sơn tĩnh điện màu đen cao cấp • Chức năng diệt khuẩn an toàn UVC_TD • Motor Pump và máy nén Compressor motor kiểu PSC hoạt động đảo chiều, không sử dụng chổi than EcoSilence Drive giúp máy sấy hoạt động với đồ ồn thấp và bền bỉ - tiết kiệm năng lượng • Hệ thống cảm biến sấy an toàn Sensor Drying System • Đảo chiều lồng quay lúc sấy giúp sấy đồ khô nhanh hơn, hiệu quả hơn (Two Way Tumbling) • Điều khiển điện tử (Control system Electronic) • Hệ thống phát hiện lỗi khi sử dụng (Failure Detection System) • Khóa trẻ em an toàn (Child lock) • Hiện thị chu trình sấy (Drying cycle indicator) • Chức năng hẹn giờ lên đến 1-23h (Delay time adjustment via button) • Điều chỉnh cường độ sấy (Drying level adjustment via button) • Điều chỉnh chương trình sấy (Drying Target) • Điều chỉnh tốc độ sấy (Spin Speed Selection) • Màn hình hiện thị led màu sáng trắng LEDCOLOR_TD_T) • Hiện thị cảnh báo lọc đầy (Filter full indicator) • Hiện thị tank nước đầy (Water tank full indicator) • Cảnh báo cần làm sạch bình ngưng (Condenser cleaning indicator) • Thời lượng chương trình (phút) - Đầy tải: 208 • Thời lượng chương trình (phút) - Tải một phần: 116 • Thời lượng chương trình (phút) - Tải trọng 70%: 155 • ","specs":{"Tiêu thụ năng lượng ở mức tải một phần (kWh/chu kỳ)":"1.19 • Tiêu thụ năng lượng ở mức đầy tải (kWh/chu kỳ): 2.12 • Công suất sấy 1000W • Tiêu thụ năng lượng (kWh/năm): 259 • Tốc độ quay (RPM): 600-800-1000-1200-1400-1600 Vòng • Thời gian sấy (phút): 10 - 30 - 60 - 90 - 120 - 150 • Nút bấm chọn tính năng: + Tắt mở (On/Off) + Chức năng tạm dừng (Start/Pause) + Chức năng chống nhăn quần áo (Anti-crease) + Tín hiệu sấy (Signal) + Đèn cảnh báo (Lamp) • Tiêu chuẩn tiết kiệm năng lượng A+++ theo tiêu chuẩn Châu Âu • Hệ thống SensitiveDrying Sytem giúp quần áo thấm một luồng không khí từ mọi phía khiến quần áo được sấy khô tuyệt đối mà vẫn mềm mại • Độ ồn chỉ 65dB nhờ công nghệ chống rung AntiVibration hiện đại • Chuông báo khi quá trình sấy kết thúc, kiểm soát mọi sự cố có thể gặp cho hệ thống điện, nước và ngưng mọi hoạt động vô cùng an toàn • Nguồn điện 220V-240V/50Hz • Công suất định mức 1000W - 10A • Áp suất nước tiêu chuẩn 0.05 - 1 Mpa • Bình giữ nhiệt an toàn • Cửa máy hoạt động đóng mở bằng khóa điện từ độ mở 180 độ hiệu quả tối đa, kinh tế, bền bỉ và êm ái • Kích thước sản phầm (HxWxD) (mm): 845x596x609 • Gross Weight (Shrink) (Kg) -Glass Door: 46.8 • Gross Weight (Carton) (kg) - Glass Door: 47.8 • Bảo hành 05 năm"},"feats":[],"sku":"KF-DR113L09BL","vid":"","mod":"KF-DR113L09BL","brand":"KAFF","slug":"kf-dr113l09bl-may-say-chen-kaff-kf-dr113l09bl","_source":"vai-market-add-product","_source_url":"https://kaff.vn/san-pham/may-say-kaff-kf-dr113l09bl-4993.html","_added_at":"2026-09-04T10:18:53.515Z"},{"n":"Chậu rửa chén 1 hố Inox 304 hạn chế trầy xước kích thước 76 cm","l":"https://malloca.com/chau-rua-chen-silver-ms7743si","i":"https://bizweb.dktcdn.net/100/567/847/products/ms7743si.jpg","p":"8.250.000đ","pn":8250000,"listPn":0,"salePn":8250000,"priceMode":"both","c":"Chậu rửa","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/567/847/products/ms7743si.jpg","https://bizweb.dktcdn.net/100/567/847/products/ms7743gr-si-dc58b1ae-540e-4a5b-9f71-4bbdb6374acd.jpg"],"sum":"Loại sản phẩm: Chậu Rửa Chén\nLoại chậu: Lắp Nổi + Lắp âm\nChất liệu: Inox 304\nThiết kế Chậu: 1 Hố\nKích thước hố xả: 114\nPhụ kiện đi kèm: Thớt kháng khuẩn, 2 rổ Plastic ABS, bộ xả thông minh Z-Style, tiết kiệm không gian","desc":"Loại sản phẩm: Chậu Rửa Chén\nLoại chậu: Lắp Nổi + Lắp âm\nChất liệu: Inox 304\nThiết kế Chậu: 1 Hố\nKích thước hố xả: 114\nPhụ kiện đi kèm: Thớt kháng khuẩn, 2 rổ Plastic ABS, bộ xả thông minh Z-Style, tiết kiệm không gian","specs":{"Loại sản phẩm":"Chậu Rửa Chén","Loại chậu":"Lắp Nổi + Lắp âm","Chất liệu":"Inox 304","Thiết kế Chậu":"1 Hố","Kích thước hố xả":"114","Phụ kiện đi kèm":"Thớt kháng khuẩn, 2 rổ Plastic ABS, bộ xả thông minh Z-Style, tiết kiệm không gian","Chiều rộng sản phẩm (mm)":"760","Chiều sâu sản phẩm (mm)":"430","Chiều cao sản phẩm (mm)":"220","Chiều rộng mặt cắt đá - Lắp nổi (mm)":"736","Chiều sâu mặt cắt đá - Lắp nổi (mm)":"406","Bo góc mặt cắt đá - Lắp nổi (mm)":"R10","Chiều rộng mặt cắt đá - Lắp âm (mm)":"726","Chiều sâu mặt cắt đá - - Lắp âm (mm)":"396","Bo góc mặt cắt đá - Lắp âm (mm)":"R25","Chiều rộng đóng gói (mm)":"845","Chiều sâu đóng gói (mm)":"515","Chiều cao đóng gói (mm)":"280","Mã SAP":"600001525","Rổ lọc rác bằng inox tiện lợi":"Có","Lớp chống ồn và chống ngưng tụ nước dưới đáy chậu":"Có","Bộ xả thông minh ngăn mùi hiệu quả":"Có"},"feats":[],"sku":"MS7743SI","vid":"","mod":"MS7743SI","brand":"Malloca","slug":"ms7743si-chau-rua-chen-1-ho-inox-304-han-che-tray-xuoc-kich-thuoc-76-cm","_source":"vai-market-add-product","_source_url":"https://malloca.com/chau-rua-chen-silver-ms7743si","_added_at":"2026-09-04T10:18:51.980Z"},{"n":"Máy lạnh Comfee Inverter 1 HP CFS-10VDM","l":"","i":"https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614184743353.jpg","p":"Giá niêm yết: 7.990.000đ — Giá KM: 7.290.000đ","pn":7290000,"listPn":7990000,"salePn":7290000,"priceMode":"both","c":"Hàng Comfee","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614184743353.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614214520509.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614238422955.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614272015263.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614305715205.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614341281583.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614354781600.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614368977788.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614384343425.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614398103352.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614413533341.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614430290567.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614445170607.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/13-1020x570.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-1-639078868082613354-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-2-639084780546821892-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-3-639084780556232501-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-5-639084780572901080-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-99-639081358308979326-700x467.jpg"],"sum":"Máy lạnh Comfee Inverter 1 HP CFS‑10VDM mang đến giải pháp sống hiện đại với loạt tính năng AI thông minh. Công suất 1 HP lý tưởng cho phòng dưới 15m², tạo không gian mát lạnh, thoải mái và tiết kiệm điện hiệu quả.\nTích hợp nhiều tính năng AI thông minh\n-\nCông nghệ AI Frost Clean\n: đóng băng bụi bẩn và vi khuẩn ở -10ºC, sau đó rã đông và làm sạch tự động, giúp dàn lạnh luôn sạch sẽ và luồng gió thổi ra trong lành, an toàn cho sức khỏe.\n-\nChế độ Sleep Curve\n: tự động tăng hoặc giảm nhiệt độ theo từng giai đoạn giấc ngủ giúp nhiệt độ phòng luôn cân bằng với thân nhiệt, tránh lạnh buốt, tiết kiệm điện và mang lại giấc ngủ sâu, thoải mái.\n*Hình ảnh chỉ mang tính chất minh họa\n-\nCông nghệ AI Cool\n: cho phép điều khiển bật/tắt, thay đổi nhiệt độ, chuyển chế độ bằng giọng nói qua ứng dụng SmartHome.\n-\nCông nghệ AI Humidity\n: tự động điều chỉnh tốc độ quạt và công suất làm lạnh để cân bằng độ ẩm trong phòng ở mức lý tưởng từ 40% - 70%, giúp không khí luôn trong lành, mát mẻ, mang đến sự thoải mái tối đa mà không cần canh chỉnh thủ công.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nDàn lạnh\n-\nMáy lạnh một chiều\nnày của Comfee sở hữu phong cách thiết kế tối giản với dạng hình hộp chữ nhật, giúp tiết kiệm diện tích và dễ dàng lắp đặt. Toàn bộ thân máy sử dụng tông màu trắng trang nhã, mang lại cảm giác sạch sẽ và hài hòa với đa dạng phong cách nội thất, từ hiện đại đến tối giản.\n- Mặt trước tích hợp\nđèn LED hiển thị nhiệt độ\nrõ ràng, giúp người dùng dễ dàng theo dõi và điều chỉnh ngay cả trong điều kiện thiếu sáng.\n*Hình ảnh chỉ mang tính chất minh họa\nDàn nóng\n- Dàn nóng\nmáy lạnh\nđược thiết kế với kết cấu chắc chắn, có khả năng chịu đựng tốt các tác động từ môi trường như nắng nóng, mưa ẩm hay bụi bẩn.\n- Sử dụng\nống dẫn gas bằng đồng\ngiúp tăng hiệu quả trao đổi nhiệt, từ đó hỗ trợ quá trình làm lạnh nhanh và ổn định hơn. Phần\nlá tản nhiệt bằng nhôm được phủ lớp bảo vệ Golden Coating\ngiúp hạn chế tình trạng ăn mòn, oxy hóa cũng như sự phát triển của nấm mốc, góp phần nâng cao độ bền cho thiết bị.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh 1 HP\nnày có\ncông suất làm lạnh 9.350 BTU\n, hoạt động hiệu quả cho phòng có diện tích dưới 15m² như phòng ngủ hoặc phòng làm việc nhỏ.\n- Máy được trang bị công nghệ làm lạnh hiện đại với\nchế độ Hyper Tech\n, cho phép máy nén tăng tốc nhanh đến tần số cao chỉ trong thời gian ngắn, giúp căn phòng nhanh chóng đạt mức nhiệt mong muốn. Nhờ đó, người dùng có thể cảm nhận luồng không khí mát lạnh gần như ngay sau khi khởi động, mang lại sự thoải mái tức thì.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Comfee\nnày trang bị\ncánh đảo gió lên xuống tự động\n, kết hợp\nđiều chỉnh trái phải bằng tay\ngiúp luồng khí lan tỏa linh hoạt, hơi lạnh được phân bổ đều, làm mát nhanh và hạn chế cảm giác lạnh buốt tại một vị trí.\n- Ngoài ra,\ntính năng Follow Me\ngiúp remote đo nhiệt độ ngay tại vị trí bạn đang ngồi hoặc nằm, thay vì chỉ đo ở dàn lạnh. Nhờ đó, máy sẽ tự điều chỉnh để khu vực xung quanh bạn luôn mát và dễ chịu.\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy duy trì nhiệt độ ổn định, vận hành êm ái và tiết kiệm điện năng, mang đến không gian mát mẻ và thoải mái cho cả gia đình.\n-\nCông nghệ ECO+\ntích hợp thuật toán AI giúp tiết kiệm điện năng hiệu quả nhưng vẫn đảm bảo không khí mát lạnh tối ưu.\nXem thêm:\nVì sao máy lạnh Inverter tiết kiệm hơn hẳn máy lạnh thường?\n*Hình ảnh chỉ mang tính chất minh họa\n-\nChế độ Gear+\nđược nâng cấp với 5 mức (20%, 40%, 60%, 80%, 100%), giúp bạn dễ dàng chọn công suất phù hợp với nhiệt độ phòng, vừa mang lại sự thoải mái, vừa tiết kiệm năng lượng.\n*Hình ảnh chỉ mang tính chất minh họa\nKhả năng lọc không khí\nMáy trang bị\nhệ thống lọc kép Dual Filtration\nvới khả năng loại bỏ bụi mịn, vi khuẩn, các chất độc hại và hạt siêu nhỏ gây dị ứng, đồng thời khử mùi khó chịu trong phòng. Nhờ đó, không gian sống luôn sạch sẽ, trong lành, giúp bảo vệ sức khỏe và giảm nguy cơ kích ứng hô hấp hay dị ứng.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ Hút ẩm\n: giảm độ ẩm dư thừa, mang lại không gian khô ráo, thoáng mát, bảo vệ nội thất và sức khỏe, đặc biệt hữu ích trong mùa mưa ẩm hoặc mùa nồm.\n-\nPCB phủ lớp UV\n: tăng khả năng chống ẩm, bảo vệ bo mạch và nâng cao tuổi thọ thiết bị ngay cả trong điều kiện thời tiết khắc nghiệt.\n-\nĐịnh vị thông minh\n: trong bán kính 15 km, bạn có thể bật/tắt điều hòa hoặc thiết lập phạm vi mong muốn để Comfee chủ động làm mát phòng trước khi bạn trở về nhà.\n- Thiết bị\nhỗ trợ kết nối linh hoạt\nvới nhiều thiết bị thông minh như máy tính bảng, đồng hồ,…đồng thời tương thích với các trợ lý ảo phổ biến như Google Assistant, Apple HomeKit và Maika Assistant, giúp bạn điều khiển từ xa hoặc sử dụng giọng nói tiếng Việt dễ dàng. Ngoài ra, máy còn cho phép chia sẻ quyền điều khiển để các thành viên trong gia đình cùng sử dụng tiện lợi hơn.\nXem thêm:\nHướng dẫn sử dụng các tính năng điều khiển bằng giọng nói trên máy lạnh Comfee\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Comfee Inverter 1 HP CFS-10VDM đáp ứng tốt nhu cầu làm mát hằng ngày cho phòng dưới 15m² nhờ khả năng vận hành êm ái và tiết kiệm điện hiệu quả. Sản phẩm tích hợp các tiện ích thông minh, mang đến trải nghiệm sử dụng tiện lợi và là lựa chọn đáng tin cậy cho lối sống hiện đại.\nXem thêm","desc":"Máy lạnh Comfee Inverter 1 HP CFS‑10VDM mang đến giải pháp sống hiện đại với loạt tính năng AI thông minh. Công suất 1 HP lý tưởng cho phòng dưới 15m², tạo không gian mát lạnh, thoải mái và tiết kiệm điện hiệu quả.\nTích hợp nhiều tính năng AI thông minh\n-\nCông nghệ AI Frost Clean\n: đóng băng bụi bẩn và vi khuẩn ở -10ºC, sau đó rã đông và làm sạch tự động, giúp dàn lạnh luôn sạch sẽ và luồng gió thổi ra trong lành, an toàn cho sức khỏe.\n-\nChế độ Sleep Curve\n: tự động tăng hoặc giảm nhiệt độ theo từng giai đoạn giấc ngủ giúp nhiệt độ phòng luôn cân bằng với thân nhiệt, tránh lạnh buốt, tiết kiệm điện và mang lại giấc ngủ sâu, thoải mái.\n*Hình ảnh chỉ mang tính chất minh họa\n-\nCông nghệ AI Cool\n: cho phép điều khiển bật/tắt, thay đổi nhiệt độ, chuyển chế độ bằng giọng nói qua ứng dụng SmartHome.\n-\nCông nghệ AI Humidity\n: tự động điều chỉnh tốc độ quạt và công suất làm lạnh để cân bằng độ ẩm trong phòng ở mức lý tưởng từ 40% - 70%, giúp không khí luôn trong lành, mát mẻ, mang đến sự thoải mái tối đa mà không cần canh chỉnh thủ công.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nDàn lạnh\n-\nMáy lạnh một chiều\nnày của Comfee sở hữu phong cách thiết kế tối giản với dạng hình hộp chữ nhật, giúp tiết kiệm diện tích và dễ dàng lắp đặt. Toàn bộ thân máy sử dụng tông màu trắng trang nhã, mang lại cảm giác sạch sẽ và hài hòa với đa dạng phong cách nội thất, từ hiện đại đến tối giản.\n- Mặt trước tích hợp\nđèn LED hiển thị nhiệt độ\nrõ ràng, giúp người dùng dễ dàng theo dõi và điều chỉnh ngay cả trong điều kiện thiếu sáng.\n*Hình ảnh chỉ mang tính chất minh họa\nDàn nóng\n- Dàn nóng\nmáy lạnh\nđược thiết kế với kết cấu chắc chắn, có khả năng chịu đựng tốt các tác động từ môi trường như nắng nóng, mưa ẩm hay bụi bẩn.\n- Sử dụng\nống dẫn gas bằng đồng\ngiúp tăng hiệu quả trao đổi nhiệt, từ đó hỗ trợ quá trình làm lạnh nhanh và ổn định hơn. Phần\nlá tản nhiệt bằng nhôm được phủ lớp bảo vệ Golden Coating\ngiúp hạn chế tình trạng ăn mòn, oxy hóa cũng như sự phát triển của nấm mốc, góp phần nâng cao độ bền cho thiết bị.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh 1 HP\nnày có\ncông suất làm lạnh 9.350 BTU\n, hoạt động hiệu quả cho phòng có diện tích dưới 15m² như phòng ngủ hoặc phòng làm việc nhỏ.\n- Máy được trang bị công nghệ làm lạnh hiện đại với\nchế độ Hyper Tech\n, cho phép máy nén tăng tốc nhanh đến tần số cao chỉ trong thời gian ngắn, giúp căn phòng nhanh chóng đạt mức nhiệt mong muốn. Nhờ đó, người dùng có thể cảm nhận luồng không khí mát lạnh gần như ngay sau khi khởi động, mang lại sự thoải mái tức thì.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Comfee\nnày trang bị\ncánh đảo gió lên xuống tự động\n, kết hợp\nđiều chỉnh trái phải bằng tay\ngiúp luồng khí lan tỏa linh hoạt, hơi lạnh được phân bổ đều, làm mát nhanh và hạn chế cảm giác lạnh buốt tại một vị trí.\n- Ngoài ra,\ntính năng Follow Me\ngiúp remote đo nhiệt độ ngay tại vị trí bạn đang ngồi hoặc nằm, thay vì chỉ đo ở dàn lạnh. Nhờ đó, máy sẽ tự điều chỉnh để khu vực xung quanh bạn luôn mát và dễ chịu.\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy duy trì nhiệt độ ổn định, vận hành êm ái và tiết kiệm điện năng, mang đến không gian mát mẻ và thoải mái cho cả gia đình.\n-\nCông nghệ ECO+\ntích hợp thuật toán AI giúp tiết kiệm điện năng hiệu quả nhưng vẫn đảm bảo không khí mát lạnh tối ưu.\nXem thêm:\nVì sao máy lạnh Inverter tiết kiệm hơn hẳn máy lạnh thường?\n*Hình ảnh chỉ mang tính chất minh họa\n-\nChế độ Gear+\nđược nâng cấp với 5 mức (20%, 40%, 60%, 80%, 100%), giúp bạn dễ dàng chọn công suất phù hợp với nhiệt độ phòng, vừa mang lại sự thoải mái, vừa tiết kiệm năng lượng.\n*Hình ảnh chỉ mang tính chất minh họa\nKhả năng lọc không khí\nMáy trang bị\nhệ thống lọc kép Dual Filtration\nvới khả năng loại bỏ bụi mịn, vi khuẩn, các chất độc hại và hạt siêu nhỏ gây dị ứng, đồng thời khử mùi khó chịu trong phòng. Nhờ đó, không gian sống luôn sạch sẽ, trong lành, giúp bảo vệ sức khỏe và giảm nguy cơ kích ứng hô hấp hay dị ứng.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ Hút ẩm\n: giảm độ ẩm dư thừa, mang lại không gian khô ráo, thoáng mát, bảo vệ nội thất và sức khỏe, đặc biệt hữu ích trong mùa mưa ẩm hoặc mùa nồm.\n-\nPCB phủ lớp UV\n: tăng khả năng chống ẩm, bảo vệ bo mạch và nâng cao tuổi thọ thiết bị ngay cả trong điều kiện thời tiết khắc nghiệt.\n-\nĐịnh vị thông minh\n: trong bán kính 15 km, bạn có thể bật/tắt điều hòa hoặc thiết lập phạm vi mong muốn để Comfee chủ động làm mát phòng trước khi bạn trở về nhà.\n- Thiết bị\nhỗ trợ kết nối linh hoạt\nvới nhiều thiết bị thông minh như máy tính bảng, đồng hồ,…đồng thời tương thích với các trợ lý ảo phổ biến như Google Assistant, Apple HomeKit và Maika Assistant, giúp bạn điều khiển từ xa hoặc sử dụng giọng nói tiếng Việt dễ dàng. Ngoài ra, máy còn cho phép chia sẻ quyền điều khiển để các thành viên trong gia đình cùng sử dụng tiện lợi hơn.\nXem thêm:\nHướng dẫn sử dụng các tính năng điều khiển bằng giọng nói trên máy lạnh Comfee\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Comfee Inverter 1 HP CFS-10VDM đáp ứng tốt nhu cầu làm mát hằng ngày cho phòng dưới 15m² nhờ khả năng vận hành êm ái và tiết kiệm điện hiệu quả. Sản phẩm tích hợp các tiện ích thông minh, mang đến trải nghiệm sử dụng tiện lợi và là lựa chọn đáng tin cậy cho lối sống hiện đại.\nXem thêm","specs":{"Loại máy":"1 chiều (chỉ làm lạnh)","Inverter":"Có Inverter","Công suất làm lạnh":"1 HP - 9.350 BTU","Phạm vi làm lạnh hiệu quả":"Dưới 15m² (từ 30 đến 45m³)","Độ ồn trung bình (được đo trong phòng thí nghiệm)":"Dàn lạnh: 40/35.5/32 dB - Dàn nóng: 51 dB","Dòng sản phẩm":"2026","Sản xuất tại":"Thái Lan","Thời gian bảo hành cục lạnh, cục nóng":"3 năm","Thời gian bảo hành máy nén":"Máy nén 5 năm","Chất liệu dàn tản nhiệt":"Ống dẫn gas bằng Đồng - Lá tản nhiệt bằng Nhôm phủ lớp chống ăn mòn Golden Coating","Loại Gas":"R-32","Tiêu thụ điện":"0.83 kWh","Nhãn năng lượng":"5 sao (Hiệu suất năng lượng 5.20)","Công nghệ tiết kiệm điện":"Eco+ Smart Inverter","Lọc bụi, kháng khuẩn, khử mùi":"Công nghệ lọc kép Dual Filtration","Chế độ gió":"Đảo gió lên xuống tự động, trái phải tùy chỉnh tay","Công nghệ làm lạnh nhanh":"Hyper Tech","Tiện ích":"Định vị vị trí thông minh - LBS Remote có đèn nền PCB với lớp phủ UV Kết nối thông minh IOT Kết nối qua ứng dụng SmartHome Cảm biến nhiệt độ Follow Me Chế độ chăm sóc giấc ngủ Sleep Curve Màn hình hiển thị nhiệt độ trên dàn lạnh Chức năng hút ẩm iECO - Quản lý điện năng tiêu thụ qua ứng dụng AI Humidity - Chế độ cân bằng độ ẩm AI Frost Clean - Chế độ làm sạch sâu Tự khởi động lại khi có điện Gear Control Công nghệ AI Cool - điều khiển bằng giọng nói","Kích thước dàn lạnh":"Dài 72.3 cm - Cao 28.6 cm - Dày 19.9 cm","Khối lượng dàn lạnh":"7.2 kg","Kích thước dàn nóng":"Dài 66.8 cm - Cao 46.9 cm - Dày 25.2 cm","Khối lượng dàn nóng":"16.9 kg","Chiều dài lắp đặt ống đồng":"Tối thiểu 3m - Tối đa 15m","Chiều cao lắp đặt tối đa giữa cục nóng-lạnh":"10m","Dòng điện vào":"Dàn nóng hoặc dàn lạnh","Dòng điện hoạt động":"1 pha","Kích thước ống đồng":"6/10","Số lượng kết nối dàn lạnh tối đa":"1","Hãng":"Comfee. Xem thông tin hãng"},"feats":["- Công nghệ AI Frost Clean : đóng băng bụi bẩn và vi khuẩn ở -10ºC, sau đó rã đông và làm sạch tự động, giúp dàn lạnh luôn sạch sẽ và luồng gió thổi ra trong lành, an toàn cho sức khỏe.","- Công nghệ AI Cool : cho phép điều khiển bật/tắt, thay đổi nhiệt độ, chuyển chế độ bằng giọng nói qua ứng dụng SmartHome.","- Mặt trước tích hợp đèn LED hiển thị nhiệt độ rõ ràng, giúp người dùng dễ dàng theo dõi và điều chỉnh ngay cả trong điều kiện thiếu sáng.","- Dàn nóng máy lạnh được thiết kế với kết cấu chắc chắn, có khả năng chịu đựng tốt các tác động từ môi trường như nắng nóng, mưa ẩm hay bụi bẩn.","- Máy lạnh 1 HP này có công suất làm lạnh 9.350 BTU , hoạt động hiệu quả cho phòng có diện tích dưới 15m² như phòng ngủ hoặc phòng làm việc nhỏ.","Xem thêm: Tổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng","- Ngoài ra, tính năng Follow Me giúp remote đo nhiệt độ ngay tại vị trí bạn đang ngồi hoặc nằm, thay vì chỉ đo ở dàn lạnh. Nhờ đó, máy sẽ tự điều chỉnh để khu vực xung quanh bạn luôn mát và dễ chịu.","- Công nghệ Inverter giúp máy duy trì nhiệt độ ổn định, vận hành êm ái và tiết kiệm điện năng, mang đến không gian mát mẻ và thoải mái cho cả gia đình.","- Công nghệ ECO+ tích hợp thuật toán AI giúp tiết kiệm điện năng hiệu quả nhưng vẫn đảm bảo không khí mát lạnh tối ưu.","Xem thêm: Vì sao máy lạnh Inverter tiết kiệm hơn hẳn máy lạnh thường?","- Chế độ Gear+ được nâng cấp với 5 mức (20%, 40%, 60%, 80%, 100%), giúp bạn dễ dàng chọn công suất phù hợp với nhiệt độ phòng, vừa mang lại sự thoải mái, vừa tiết kiệm năng lượng.","- Chế độ Hút ẩm : giảm độ ẩm dư thừa, mang lại không gian khô ráo, thoáng mát, bảo vệ nội thất và sức khỏe, đặc biệt hữu ích trong mùa mưa ẩm hoặc mùa nồm."],"sku":"363374","vid":"","mod":"363374","brand":"Comfee","slug":"363374-may-lanh-comfee-inverter-1-hp-cfs-10vdm","_source":"vai-market-add-product","_source_url":"","_added_at":"2026-09-04T10:18:49.722Z"},{"n":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","l":"","i":"https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806-700x467.jpg","p":"Giá niêm yết: 10.990.000đ — Giá KM: 6.490.000đ","pn":6490000,"listPn":10990000,"salePn":6490000,"priceMode":"both","c":"Máy giặt / sấy","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-638963804276138450-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-638963804285992497-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-99-638962219298592474-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-5-639063368977740536.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-639063369030108820.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-639063369065311055.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-639063369104866518.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-4-639063369150311821.jpg"],"sum":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","desc":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","specs":{"Loại máy giặt":"Cửa trước","Lồng giặt":"Lồng ngang","Khối lượng giặt":"10.5 Kg","Số người sử dụng":"Trên 7 người","Kiểu động cơ":"Truyền động gián tiếp (dây Curoa)","Tốc độ quay vắt tối đa":"1400 vòng/phút","Chất liệu lồng giặt":"Inox","Chất liệu vỏ máy":"Kim loại sơn tĩnh điện","Chất liệu cửa máy":"Nhựa","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2025","Thời gian bảo hành động cơ":"10 năm","Hiệu suất sử dụng điện":"5.7 Wh/kg","Loại Inverter":"Công nghệ Inverter","Chương trình":"Đồ màu Vải mỏng Đồ trẻ em Đồ lót Đồ len Đồ hỗn hợp Đồ cotton Đồ Jeans Áo sơ mi Xả + vắt Vệ sinh lồng giặt Vắt Giặt vệ sinh Giặt tiết kiệm Giặt nhanh Giặt chăn bông","Công nghệ giặt":"Giặt nước nóng Giặt hơi nước","Bảng điều khiển":"Song ngữ Anh - Việt có núm xoay, cảm ứng và màn hình hiển thị","Tiện ích":"Vệ sinh lồng giặt Khóa trẻ em Hẹn giờ giặt Chống nhăn Chỉnh số vòng vắt Chỉnh nhiệt độ nước","Kích thước - Khối lượng":"Cao 85 cm - Ngang 60 cm - Sâu 63.5 cm - Nặng 70 kg","Chiều dài ống cấp nước":"110 cm","Chiều dài ống thoát nước":"180 cm","Hãng":"Hitachi. Xem thông tin hãng"},"feats":["Thiết bị sử dụng kiểu động cơ gián tiếp truyền động dây curoa nên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.","Tiện ích giặt chống nhăn được thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.","Hẹn giờ giặt giúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.","Tùy chỉnh số vòng vắt, nhiệt độ nước cho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.","Vệ sinh lồng giặt bằng nước nóng giúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt."],"sku":"357869","vid":"","mod":"357869","brand":"Hitachi","slug":"357869-may-giat-hitachi-inverter-10-5-kg-bd-1054hvow","_source":"vai-market-add-product","_source_url":"","_added_at":"2026-09-04T10:18:43.947Z"},{"n":"Chậu 1 Hố Mạ Nano BN7546","l":"","i":"https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-1-ho-ma-nano.webp","p":"7.950.000đ","pn":7950000,"listPn":7950000,"salePn":7950000,"priceMode":"list","c":"Chậu rửa bát","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-1-ho-ma-nano.webp"],"sum":"Trong thiết kế gian bếp hiện đại, việc lựa chọn một chiếc chậu rửa phù hợp đóng vai trò quan trọng để đảm bảo công năng và tính thẩm mỹ. Chậu 1 hố mạ nano được xem là sự lựa chọn hoàn hảo nhờ đặc tính bền bỉ, thiết kế đẹp và nhiều tính năng đi kèm. Hãy cùng tìm hiểu về những điểm nổi bật của chậu 1 hố mạ nano qua bài viết sau.\nChất liệu Inox 304 Mạ Nano – Bảo Chứng Chất Lượng Chất liệu inox 304 mạ nano của Boss được sử dụng cho chậu 1 hố không chỉ mang lại tính thẩm mỹ cao mà còn đảm bảo độ bền bỉ trước tác nhân oxy hóa, rỉ sét. Lớp mạ nano giúp gia tăng khả năng chống bám bẩn, dễ dàng lau chùi và giữ cho bề mặt chậu luôn sáng bóng như mới.\nKèm Phụ Kiện Tiện Ích Mỗi bộ chậu 1 hố mạ nano đều được trang bị đầy đủ các phụ kiện cao cấp, bao gồm:\nThớt chậu nhỏ : Giúp người dùng tiết kiệm diện tích khi chuẩn bị thức phẩm. Rổ nhỏ : Tiên lợi cho việc rửa rau, hoa quả hay để nước thoát nhanh hơn. Nhờ những phụ kiện đi kèm, chậu 1 hố mạ nano không chỉ đem lại sự tiên nghi mà còn góp phần giãm bớt gánh nặng trong công việc bếp núc.\nĐặc Điểm Kỹ Thuật Vượt Trội Chậu 1 hố mạ nano được thiết kế để phù hợp với nhiều nhu cầu khác nhau. Hai mã sản phẩm phổ biến nhất là BN7546 và BN7848.\n1. Mã BN7546 Kích thước khoét đá: 42 x 72 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm 2. Mã BN7848 Kích thước khoét đá: 47 x 75.5 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm Với độ dày viền đạt 3.0 mm và thùng 1.0 mm, chậu 1 hố mạ nano bảo đảm tính chắc chắn, chống biến dạng trong quá trình sử dụng. Kích thước linh hoạt có thể đầu vừa với nhiều loại bếp từ truyền thống đến hiện đại.\nThiết Kế Hiện Đại – Tính Đa Năng Thiết kế của chậu 1 hố mạ nano được đánh giá cao nhờ tính đơn giản mà tính tế. Tất cả các chi tiết đều được gia công kỹ lưỡng, đáp ứng được các tiêu chuẩn cao nhất trong thiết kế nội thất.\nChậu 1 hố mạ nano\nKhông chỉ phù hợp cho những căn bếp hiện đại, chậu 1 hố còn mang lại khả năng đa dụng, tực hợp nhiều phụ kiện để đáp ứng nhu cầu của từng gia đình.\nLý Do Nên Chọn Chậu 1 Hố Mạ Nano 1. Bền Bỉ Vượt Trội Inox 304 là chất liệu nổi tiếng với độ bền bỉ, khả năng chống oxy hóa cao và không bị ảnh hưởng bởi các chất tẩy rửa mành.\n2. Tính Năng Chống Bám Bẩn Lớp mạ nano giúp dễ dàng lau chùi, ngăn ngừa vi khuẩn và bảo vệ an toàn sức khỏe cho gia đình.\n3. Thiết Kế Linh Hoạt Kích thước đa dạng phù hợp với nhiều loại bếp, từ bếp truyền thống đến hiện đại.\n4. Phụ Kiện Đi Kèm Với thớt chậu và rổ nhỏ, sản phẩm cung cấp đầy đủ tiên nghi cho gian bếp.\nHướng Dẫn Lắp Đặt Chậu 1 Hố Mạ Nano Đọc kỹ hướng dẫn sử dụng và bản vẽ kèm theo. Đo và đánh dấu vị trí khoét đá phù hợp: BN7546: 42 x 72 cm BN7848: 47 x 75.5 cm Lắp chậu và kết nối đáy tháo nước đảm bảo khít chặt. Hoàn thiện bằng cách làm sạch bặng vải mềm. Chậu 1 hố mạ nano không chỉ là một sản phẩm cao cấp với nhiều tính năng tiện ích mà còn mang lại tính thẩm mỹ và bền bỉ cho gian bếp của bạn. Với chất liệu inox 304, thiết kế độc đáo và phụ kiện đi kèm, sản phẩm này xứng đáng là một trong những lựa chọn tốt nhất cho bất kỳ gia đình nào","desc":"Trong thiết kế gian bếp hiện đại, việc lựa chọn một chiếc chậu rửa phù hợp đóng vai trò quan trọng để đảm bảo công năng và tính thẩm mỹ. Chậu 1 hố mạ nano được xem là sự lựa chọn hoàn hảo nhờ đặc tính bền bỉ, thiết kế đẹp và nhiều tính năng đi kèm. Hãy cùng tìm hiểu về những điểm nổi bật của chậu 1 hố mạ nano qua bài viết sau.\nChất liệu Inox 304 Mạ Nano – Bảo Chứng Chất Lượng Chất liệu inox 304 mạ nano của Boss được sử dụng cho chậu 1 hố không chỉ mang lại tính thẩm mỹ cao mà còn đảm bảo độ bền bỉ trước tác nhân oxy hóa, rỉ sét. Lớp mạ nano giúp gia tăng khả năng chống bám bẩn, dễ dàng lau chùi và giữ cho bề mặt chậu luôn sáng bóng như mới.\nKèm Phụ Kiện Tiện Ích Mỗi bộ chậu 1 hố mạ nano đều được trang bị đầy đủ các phụ kiện cao cấp, bao gồm:\nThớt chậu nhỏ : Giúp người dùng tiết kiệm diện tích khi chuẩn bị thức phẩm. Rổ nhỏ : Tiên lợi cho việc rửa rau, hoa quả hay để nước thoát nhanh hơn. Nhờ những phụ kiện đi kèm, chậu 1 hố mạ nano không chỉ đem lại sự tiên nghi mà còn góp phần giãm bớt gánh nặng trong công việc bếp núc.\nĐặc Điểm Kỹ Thuật Vượt Trội Chậu 1 hố mạ nano được thiết kế để phù hợp với nhiều nhu cầu khác nhau. Hai mã sản phẩm phổ biến nhất là BN7546 và BN7848.\n1. Mã BN7546 Kích thước khoét đá: 42 x 72 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm 2. Mã BN7848 Kích thước khoét đá: 47 x 75.5 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm Với độ dày viền đạt 3.0 mm và thùng 1.0 mm, chậu 1 hố mạ nano bảo đảm tính chắc chắn, chống biến dạng trong quá trình sử dụng. Kích thước linh hoạt có thể đầu vừa với nhiều loại bếp từ truyền thống đến hiện đại.\nThiết Kế Hiện Đại – Tính Đa Năng Thiết kế của chậu 1 hố mạ nano được đánh giá cao nhờ tính đơn giản mà tính tế. Tất cả các chi tiết đều được gia công kỹ lưỡng, đáp ứng được các tiêu chuẩn cao nhất trong thiết kế nội thất.\nChậu 1 hố mạ nano\nKhông chỉ phù hợp cho những căn bếp hiện đại, chậu 1 hố còn mang lại khả năng đa dụng, tực hợp nhiều phụ kiện để đáp ứng nhu cầu của từng gia đình.\nLý Do Nên Chọn Chậu 1 Hố Mạ Nano 1. Bền Bỉ Vượt Trội Inox 304 là chất liệu nổi tiếng với độ bền bỉ, khả năng chống oxy hóa cao và không bị ảnh hưởng bởi các chất tẩy rửa mành.\n2. Tính Năng Chống Bám Bẩn Lớp mạ nano giúp dễ dàng lau chùi, ngăn ngừa vi khuẩn và bảo vệ an toàn sức khỏe cho gia đình.\n3. Thiết Kế Linh Hoạt Kích thước đa dạng phù hợp với nhiều loại bếp, từ bếp truyền thống đến hiện đại.\n4. Phụ Kiện Đi Kèm Với thớt chậu và rổ nhỏ, sản phẩm cung cấp đầy đủ tiên nghi cho gian bếp.\nHướng Dẫn Lắp Đặt Chậu 1 Hố Mạ Nano Đọc kỹ hướng dẫn sử dụng và bản vẽ kèm theo. Đo và đánh dấu vị trí khoét đá phù hợp: BN7546: 42 x 72 cm BN7848: 47 x 75.5 cm Lắp chậu và kết nối đáy tháo nước đảm bảo khít chặt. Hoàn thiện bằng cách làm sạch bặng vải mềm. Chậu 1 hố mạ nano không chỉ là một sản phẩm cao cấp với nhiều tính năng tiện ích mà còn mang lại tính thẩm mỹ và bền bỉ cho gian bếp của bạn. Với chất liệu inox 304, thiết kế độc đáo và phụ kiện đi kèm, sản phẩm này xứng đáng là một trong những lựa chọn tốt nhất cho bất kỳ gia đình nào","specs":{"Kích thước (mã BN7546)":"Kích thước khoét đá 42 x 72 cm."},"feats":["Chất liệu cao cấp: Chậu được làm từ inox 304 mạ nano, bền bỉ và chống gỉ sét, phù hợp với mọi không gian bếp hiện đại.","Thiết kế chắc chắn: Độ dày viền 3.0mm và thùng chậu 1.0mm đảm bảo độ bền và khả năng chịu lực cao.","Phụ kiện đi kèm tiện ích: Bao gồm thớt chậu nhỏ và rổ nhỏ, hỗ trợ tối đa trong quá trình sử dụng.","Dễ dàng lắp đặt và vệ sinh: Thiết kế tối ưu hóa tiện ích và đảm bảo vệ sinh tuyệt đối trong không gian bếp"],"sku":"BN7546","vid":"","mod":"BN7546","brand":"Boss","slug":"bn7546-chau-1-ho-ma-nano-bn7546","_source":"vai-market-add-product","_source_url":"","_added_at":"2026-09-04T10:18:39.550Z"},{"n":"Bộ nồi chảo Inox cán rời (OMNI SA424)","l":"","i":"","p":"4.320.000đ","pn":4320000,"listPn":4320000,"salePn":4320000,"priceMode":"list","c":"Nồi chảo inox","cs":"san-pham-them-moi","ci":"fa-box","imgs":[],"sum":"Bộ nồi chảo Inox 304 cán rời, đáy 3 lớp. Tay cầm tháo rời. Sản phẩm mới catalogue Malloca 2026.","sku":"OMNISA424","mod":"OMNI SA424","brand":"Malloca","slug":"bo-noi-chao-inox-can-roi-omni-sa424","_source":"manual_admin_price","_added_at":"2026-09-04T00:25:15"}] \ No newline at end of file diff --git a/dist/catalogue/promos.json b/dist/catalogue/promos.json deleted file mode 100644 index efa36fb2ed303adb22ea5f9d88e3604d400aceb9..0000000000000000000000000000000000000000 --- a/dist/catalogue/promos.json +++ /dev/null @@ -1 +0,0 @@ -{"productEdits":{"283212":{"name":"Lò vi sóng Toshiba MWP-MM20P(BK) 20 lít","description":"Lò vi sóng\nToshiba MWP-MM20P(BK) 20 lít công suất 700W mạnh mẽ, trang bị chuông báo sau khi nấu xong, tiện lợi với chức năng rã đông, hâm nóng,...\nCông suất - Dung tích - Chức năng chính\n- Mẫu\nlò vi sóng Toshiba\nnày có công suất 700W hoạt động ổn định.\n-\nDung tích 20 lít\ncó thể bỏ vừa gà nguyên con khoảng 1 kg.\n- Chức năng chính: rã đông, hâm nóng.\nThiết kế của sản phẩm\n- Khoang lò làm bằng thép phủ sơn chống dính, an toàn cho sức khoẻ và dễ lau chùi.\n- Bảng điều khiển bằng nút vặn dễ tuỳ chỉnh mức công suất, nhiệt độ, dễ dàng sử dụng với ngôn ngữ tiếng Việt - Anh.\nTiện ích - Phụ kiện\n- Hẹn giờ tối đa 35 phút, có thể chủ động thời gian hâm nóng hoặc rã đông, giúp thức ăn không bị cháy khét hay khô.\n- Lò có trang bị\nchuông báo sau khi nấu xong\n, không lo để quên thức ăn trong lò.\n- Khoang lò có đèn giúp chiếu sáng bên trong lò vi sóng.\n- Đi kèm phụ kiện: đĩa xoay và vòng xoay.\nLưu ý sử dụng\n- Không dùng chung ổ điện với các thiết bị khác.\n- Để thêm một cốc nước khi hâm nóng thức ăn khô.\n- Không sử dụng đồ đựng thức ăn bằng kim loại trong lò vi sóng.\nXem thêm:\n13 thứ tuyệt đối không được cho vào lò vi sóng\n.\n- Rút điện trước khi vệ sinh khoang lò, không dùng các chất tẩy rửa mạnh để vệ sinh.\n- Không sử dụng lò vi sóng có cửa bị hỏng hoặc đóng không khít.\nLò vi sóng Toshiba MWP-MM20P(BK) 20 lít\nvới công suất 700W, đáp ứng đủ các nhu cầu làm nóng thức ăn của gia đình, lò còn có chức năng rã đông thuận tiện. Lò có thể tuỳ chỉnh nhiệt độ bằng nút vặn đơn giản, khoang lò bằng thép phủ sơn chống dính bền bỉ,... Nhìn chung, đây là một thiết bị gia dụng không thể thiếu trong gian bếp của mỗi gia đình.\nXem thêm","priceNum":1690000,"listPn":1990000,"salePn":1690000,"priceMode":"both","image":"https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit---1--1020x570.jpg","images":["https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit---1--1020x570.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit--(2).jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/toshiba-mwp-mm20p-bk-20-lit-chat-lieu-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit--(4).jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-2.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-3.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-4.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-5.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-6.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-7.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-8.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-10.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-9.jpg"],"specs":{"Loại lò":"Lò vi sóng không nướng","Dung tích":"20 lít","Công suất vi sóng":"700W","Chất liệu khoang lò":"Thép phủ sơn chống dính","Thương hiệu của":"Nhật Bản","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2022","Chức năng chính":"Rã đông, hâm","Ngôn ngữ":"Tiếng Việt Tiếng Anh","Bảng điều khiển":"Nút vặn","Tiện ích":"Chuông báo khi nấu xong Hẹn giờ lên tới 35 phút Khoang lò có đèn","Kích thước - Khối lượng":"Ngang 43.4 cm - Cao 25.8 cm - Sâu 35 cm - Nặng 11 kg","Kích thước khoang lò":"Ngang 27.5 cm - Cao 17.4 cm - Sâu 29.5 cm","Hãng":"Toshiba. Xem thông tin hãng"},"features":["Lò vi sóng Toshiba MWP-MM20P(BK) 20 lít công suất 700W mạnh mẽ, trang bị chuông báo sau khi nấu xong, tiện lợi với chức năng rã đông, hâm nóng,...","- Mẫu lò vi sóng Toshiba này có công suất 700W hoạt động ổn định.","- Dung tích 20 lít có thể bỏ vừa gà nguyên con khoảng 1 kg.","- Chức năng chính: rã đông, hâm nóng.","- Khoang lò làm bằng thép phủ sơn chống dính, an toàn cho sức khoẻ và dễ lau chùi.","- Bảng điều khiển bằng nút vặn dễ tuỳ chỉnh mức công suất, nhiệt độ, dễ dàng sử dụng với ngôn ngữ tiếng Việt - Anh.","- Hẹn giờ tối đa 35 phút, có thể chủ động thời gian hâm nóng hoặc rã đông, giúp thức ăn không bị cháy khét hay khô.","- Lò có trang bị chuông báo sau khi nấu xong , không lo để quên thức ăn trong lò.","- Khoang lò có đèn giúp chiếu sáng bên trong lò vi sóng.","- Đi kèm phụ kiện: đĩa xoay và vòng xoay.","- Không dùng chung ổ điện với các thiết bị khác.","- Để thêm một cốc nước khi hâm nóng thức ăn khô."],"model":"283212","brand":"vi sóng Toshiba","category":"Lò vi sóng","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"283212-lo-vi-song-toshiba-mwp-mm20p-bk-20-lit","_addedBy":"vai-add-product"},"303204":{"name":"Kệ xoong bản bắt mặt hộc inox 304 - Phụ kiện tủ bếp Higold","description":"Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303204 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303204. Đây là kệ đựng xoong nồi bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm và kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu HIGOLD.\nKệ Xoong Bản được sản xuất theo công nghệ tiên tiến của Đức, đạt tiêu chuẩn chất lượng cao của Châu Âu. Thiết kế của sản phẩm hoàn toàn phù hợp với các loại bếp hiện đại.\nĐiểm nổi bật của Kệ Xoong Bản là các tính năng thông minh giúp sắp xếp gọn gàng các đồ dùng nhà bếp như xoong, nồi, chảo, ấm đun,… ngăn nắp trong hộc tủ. Kệ được trang bị hệ thống ray trượt giảm chấn êm ái, kéo rút nhẹ nhàng.\nKệ Xoong Bản có tác dụng bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều lựa chọn kích thước khác nhau.\nKệ Xoong Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng các vật dụng nhà bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian và là điểm nhấn cho một không gian bếp hoàn hảo.\n","priceNum":2960000,"listPn":0,"salePn":2960000,"priceMode":"both","image":"https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303201.jpg","images":["https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303201.jpg"],"specs":{},"features":["Kệ Xoong Nồi Dạng Bản Inox 304 (303211 – 600mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303311 – 600mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303312 – 700mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303313 – 800mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303314 – 900mm) – Higold"],"model":"303204","brand":"Higold","category":"Kệ xoong nồi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"303204-ke-xoong-ban-bat-mat-hoc-inox-304-phu-kien-tu-bep-higold","_addedBy":"vai-add-product"},"303304":{"name":"Kệ chén dĩa bản bắt mặt hộc inox 304 - Phụ kiện tủ bếp Higold 303304","description":"Kệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 (303304 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303304. Đây là kệ để chén đĩa bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm, kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu.\nKệ Chén Dĩa Bản được sản xuất theo công nghệ hiện đại của Đức, đạt tiêu chuẩn chất lượng Châu Âu. Thiết kế của sản phẩm phù hợp với mọi loại bếp hiện đại.\nĐiểm nổi bật của sản phẩm là các công năng thông minh giúp sắp xếp chén đĩa, đũa muỗng,… ngăn nắp trong hộc tủ. Kệ còn được trang bị hệ thống ray trượt giảm chấn êm ái, đẩy kệ ra vào rất nhẹ nhàng.\nKệ Chén Dĩa Bản giúp bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều kích thước đa dạng.\nKệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng đồ đạc trong tủ bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian lưu trữ và là điểm nhấn cho một không gian bếp hoàn hảo.\n","priceNum":4140000,"listPn":0,"salePn":4140000,"priceMode":"both","image":"https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303301.jpg","images":["https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303301.jpg"],"specs":{},"features":["Kệ Chén Dĩa Dạng Bản Inox 304 (303311 – 600mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303201 – 600mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303202 – 700mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303203 – 800mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303204 – 900mm) – Higold"],"model":"303304","brand":"Higold","category":"Kệ chén dĩa","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"303304-ke-chen-dia-ban-bat-mat-hoc-inox-304-phu-kien-tu-bep-higold-303304","_addedBy":"vai-add-product"},"334018":{"name":"Máy lạnh Casper Inverter 1 HP QC-09IU36A","description":"Máy lạnh Casper Inverter 1 HP QC-09IU36A\nlà lựa chọn lý tưởng cho các không gian dưới 15m² như phòng ngủ, phòng làm việc cá nhân hoặc cửa hàng nhỏ. Với công suất 9.500 BTU, sản phẩm tích hợp công nghệ Inverter tiết kiệm điện, chế độ Turbo làm lạnh nhanh, c\nùng các tính năng như Silk Air, BabyCare mang đến trải nghiệm làm mát dễ chịu, tiết kiệm năng lượng và bảo vệ sức khỏe người dùng.\nThiết kế\nDàn lạnh\n-\nMáy lạnh Casper\nsở hữu thiết kế treo tường hiện đại, tiết kiệm không gian, kết hợp với gam màu trắng thanh lịch giúp sản phẩm dễ dàng hài hòa với nhiều phong cách nội thất.\n- Điểm nhấn độc đáo của thiết kế này là\nmàn hình LED hiển thị nhiệt độ\ntrực quan giúp người dùng dễ dàng quan sát và điều chỉnh vào ban đêm.\nDàn nóng\n- Dàn nóng được trang bị hệ thống\nống dẫn gas bằng đồng mạ vàng, lá tản nhiệt bằng nhôm mạ vàng\nđảm bảo hiệu quả làm lạnh, tăng độ bền cho thiết bị chống chịu trước thời tiết ẩm ướt, sương muối,...\n- Thiết bị sử dụng\ngas R32\nthân thiện với môi trường đồng thời đảm bảo hiệu suất làm lạnh.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh Casper 1 HP\nhoạt động với công suất\n9.500 BTU\n, phù hợp lắp đặt trong không gian vừa phải có diện tích\ndưới 15m².\nVì vậy, thiết bị có thể ứng dụng tại nhiều vị trí trong gia đình như phòng ngủ, phòng đọc sách, phòng quần áo,...\n- Nhờ\ncông nghệ Turbo\nmáy lạnh được trang bị máy nén công nghệ cao, giúp nhiệt độ phòng có thể giảm xuống thấp trong thời gian ngắn, nhanh chóng mang lại không gian mát lạnh và thoải mái cho người dùng.\n-\nCông nghệ Silk Air\nkhuếch tán không khí mát thông qua hàng ngàn lỗ khí siêu nhỏ, tạo luồng khí mềm mại, nhẹ nhàng, không gây buốt lạnh, phù hợp với người lớn tuổi và trẻ nhỏ\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Casper Inverter\ncó chế độ thổi gió được thiết kế\nlên xuống tự động\n, giúp luồng khí lạnh luân chuyển đồng đều khắp không gian, đảm bảo mọi vị trí trong phòng đều được làm mát.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy nén hoạt động linh hoạt theo nhiệt độ phòng, giảm dao động công suất không cần thiết - từ đó tiết kiệm điện hiệu quả và kéo dài tuổi thọ máy.\n-\nChế độ i-Save\ntối ưu hóa đường cong nhiệt độ khi làm lạnh, cho phép máy hoạt động ổn định ở mức năng lượng thấp mà vẫn duy trì cảm giác mát mẻ.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ BabyCare\nđiều chỉnh nhiệt độ nhẹ nhàng, duy trì không gian dễ chịu mà không gây lạnh đột ngột, phù hợp cho gia đình có trẻ em hoặc người cao tuổi.\n-\nCảm biến nhiệt độ thông minh I Feel\nsử dụng cảm biến để đo nhiệt độ tại vị trí người dùng, giúp\nmáy lạnh\nđiều chỉnh chính xác mức nhiệt độ phù hợp với khu vực bạn đang ngồi.\n-\nTự khởi động lại khi có điện\n, giữ nguyên chế độ hoạt động trước khi bị ngắt điện.\n-\nKhóa remote điều khiển\n, đảm bảo an toàn khi sử dụng trong gia đình có trẻ nhỏ.\n-\nCơ chế bảo vệ an toàn kép thông minh\n, phát hiện rò rỉ đảm bảo an toàn tuyệt đối khi sử dụng.\n-\nHẹn giờ bật, tắt máy\nlinh hoạt, phù hợp với lịch trình sinh hoạt của người dùng.\n-\nChức năng\niClean tự động làm sạch dàn lạnh\nngăn ngừa sự hình thành vi khuẩn, nấm mốc phát triển, bảo vệ sức khỏe người dùng và duy trì hiệu suất làm lạnh ổn định lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Casper Inverter 1 HP QC-09IU36A là lựa chọn hoàn hảo cho không gian nhỏ dưới 15m², mang đến khả năng làm lạnh nhanh, tiết kiệm điện và vận hành êm ái. Với các công nghệ hiện đại như Inverter, Silk Air, chế độ BabyCare và iClean, sản phẩm không chỉ đáp ứng nhu cầu làm mát mà còn bảo vệ sức khỏe và nâng cao chất lượng cuộc sống cho người dùng.\nXem thêm","priceNum":7590000,"listPn":8990000,"salePn":7590000,"priceMode":"both","image":"https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/334018-1920x1080.jpg","images":["https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/334018-1920x1080.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/1-1020x570-1.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/2-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/slider-1060x570-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/4-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/5-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/6-1020x570.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-1-638731575388494403.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-2-638731575401986689.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-3-638731575409037186.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-4-638731575419946302.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-5-638731575428692989.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-6-638731575439056769.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-7-638733153596915551.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-8-638731575460525267.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-9-638731575469259491.jpg"],"specs":{"Loại máy":"1 chiều (chỉ làm lạnh)","Inverter":"Có Inverter","Công suất làm lạnh":"1 HP - 9.500 BTU","Phạm vi làm lạnh hiệu quả":"Dưới 15m² (từ 30 đến 45m³)","Độ ồn trung bình (được đo trong phòng thí nghiệm)":"Dàn lạnh: 36 dB - Dàn nóng: 52 dB","Dòng sản phẩm":"2025","Sản xuất tại":"Thái Lan","Thời gian bảo hành cục lạnh, cục nóng":"3 năm","Thời gian bảo hành máy nén":"Máy nén 12 năm","Chất liệu dàn tản nhiệt":"Ống dẫn gas bằng Đồng mạ vàng - Lá tản nhiệt bằng Nhôm mạ vàng","Loại Gas":"R-32","Tiêu thụ điện":"1.03 kWh","Nhãn năng lượng":"3 sao (Hiệu suất năng lượng 4.27)","Công nghệ tiết kiệm điện":"Inverter Công nghệ I-Save","Chế độ gió":"Đảo gió lên xuống tự động","Công nghệ làm lạnh nhanh":"Turbo","Tiện ích":"Thiết kế thông minh EasyCare dễ dàng lắp đặt Khóa remote điều khiển Cảm biến nhiệt độ I Feel Cơ chế bảo vệ an toàn kép phát hiện rò rỉ thông minh Chức năng tự động làm sạch iClean Chức năng tự làm sạch dàn lạnh Chế độ ngủ đêm Sleep cho người già, trẻ nhỏ Chế độ BabyCare Màn hình hiển thị nhiệt độ trên dàn lạnh Hẹn giờ bật, tắt máy Tự khởi động lại khi có điện Công nghệ làm lạnh Silk Air","Kích thước dàn lạnh":"Dài 76.8 cm - Cao 28.7 cm - Dày 20 cm","Khối lượng dàn lạnh":"7.5 kg","Kích thước dàn nóng":"Dài 71 cm - Cao 45.5 cm - Dày 27.5 cm","Khối lượng dàn nóng":"16 kg","Chiều dài lắp đặt ống đồng":"Tối thiểu 3m - Tối đa 20m","Chiều cao lắp đặt tối đa giữa cục nóng-lạnh":"5m","Dòng điện vào":"Dàn lạnh","Dòng điện hoạt động":"1 pha","Kích thước ống đồng":"6/10","Số lượng kết nối dàn lạnh tối đa":"1","Hãng":"Casper. Xem thông tin hãng"},"features":["- Máy lạnh Casper sở hữu thiết kế treo tường hiện đại, tiết kiệm không gian, kết hợp với gam màu trắng thanh lịch giúp sản phẩm dễ dàng hài hòa với nhiều phong cách nội thất.","- Điểm nhấn độc đáo của thiết kế này là màn hình LED hiển thị nhiệt độ trực quan giúp người dùng dễ dàng quan sát và điều chỉnh vào ban đêm.","- Dàn nóng được trang bị hệ thống ống dẫn gas bằng đồng mạ vàng, lá tản nhiệt bằng nhôm mạ vàng đảm bảo hiệu quả làm lạnh, tăng độ bền cho thiết bị chống chịu trước thời tiết ẩm ướt, sương muối,...","- Thiết bị sử dụng gas R32 thân thiện với môi trường đồng thời đảm bảo hiệu suất làm lạnh.","- Công nghệ Silk Air khuếch tán không khí mát thông qua hàng ngàn lỗ khí siêu nhỏ, tạo luồng khí mềm mại, nhẹ nhàng, không gây buốt lạnh, phù hợp với người lớn tuổi và trẻ nhỏ","- Máy lạnh Casper Inverter có chế độ thổi gió được thiết kế lên xuống tự động , giúp luồng khí lạnh luân chuyển đồng đều khắp không gian, đảm bảo mọi vị trí trong phòng đều được làm mát.","- Công nghệ Inverter giúp máy nén hoạt động linh hoạt theo nhiệt độ phòng, giảm dao động công suất không cần thiết - từ đó tiết kiệm điện hiệu quả và kéo dài tuổi thọ máy.","- Chế độ i-Save tối ưu hóa đường cong nhiệt độ khi làm lạnh, cho phép máy hoạt động ổn định ở mức năng lượng thấp mà vẫn duy trì cảm giác mát mẻ.","Xem thêm: Tổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng","- Chế độ BabyCare điều chỉnh nhiệt độ nhẹ nhàng, duy trì không gian dễ chịu mà không gây lạnh đột ngột, phù hợp cho gia đình có trẻ em hoặc người cao tuổi.","- Cảm biến nhiệt độ thông minh I Feel sử dụng cảm biến để đo nhiệt độ tại vị trí người dùng, giúp máy lạnh điều chỉnh chính xác mức nhiệt độ phù hợp với khu vực bạn đang ngồi.","- Tự khởi động lại khi có điện , giữ nguyên chế độ hoạt động trước khi bị ngắt điện."],"model":"334018","brand":"Casper","category":"Hàng Casper","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"334018-may-lanh-casper-inverter-1-hp-qc-09iu36a","_addedBy":"vai-add-product"},"357869":{"name":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","description":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","priceNum":6490000,"listPn":10990000,"salePn":6490000,"priceMode":"both","image":"https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806-700x467.jpg","images":["https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-638963804276138450-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-638963804285992497-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-99-638962219298592474-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-5-639063368977740536.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-639063369030108820.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-639063369065311055.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-639063369104866518.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-4-639063369150311821.jpg"],"specs":{"Loại máy giặt":"Cửa trước","Lồng giặt":"Lồng ngang","Khối lượng giặt":"10.5 Kg","Số người sử dụng":"Trên 7 người","Kiểu động cơ":"Truyền động gián tiếp (dây Curoa)","Tốc độ quay vắt tối đa":"1400 vòng/phút","Chất liệu lồng giặt":"Inox","Chất liệu vỏ máy":"Kim loại sơn tĩnh điện","Chất liệu cửa máy":"Nhựa","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2025","Thời gian bảo hành động cơ":"10 năm","Hiệu suất sử dụng điện":"5.7 Wh/kg","Loại Inverter":"Công nghệ Inverter","Chương trình":"Đồ màu Vải mỏng Đồ trẻ em Đồ lót Đồ len Đồ hỗn hợp Đồ cotton Đồ Jeans Áo sơ mi Xả + vắt Vệ sinh lồng giặt Vắt Giặt vệ sinh Giặt tiết kiệm Giặt nhanh Giặt chăn bông","Công nghệ giặt":"Giặt nước nóng Giặt hơi nước","Bảng điều khiển":"Song ngữ Anh - Việt có núm xoay, cảm ứng và màn hình hiển thị","Tiện ích":"Vệ sinh lồng giặt Khóa trẻ em Hẹn giờ giặt Chống nhăn Chỉnh số vòng vắt Chỉnh nhiệt độ nước","Kích thước - Khối lượng":"Cao 85 cm - Ngang 60 cm - Sâu 63.5 cm - Nặng 70 kg","Chiều dài ống cấp nước":"110 cm","Chiều dài ống thoát nước":"180 cm","Hãng":"Hitachi. Xem thông tin hãng"},"features":["Thiết bị sử dụng kiểu động cơ gián tiếp truyền động dây curoa nên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.","Tiện ích giặt chống nhăn được thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.","Hẹn giờ giặt giúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.","Tùy chỉnh số vòng vắt, nhiệt độ nước cho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.","Vệ sinh lồng giặt bằng nước nóng giúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt."],"model":"357869","brand":"Hitachi","category":"Máy giặt / sấy","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"357869-may-giat-hitachi-inverter-10-5-kg-bd-1054hvow","_addedBy":"vai-add-product"},"363374":{"name":"Máy lạnh Comfee Inverter 1 HP CFS-10VDM","description":"Máy lạnh Comfee Inverter 1 HP CFS‑10VDM mang đến giải pháp sống hiện đại với loạt tính năng AI thông minh. Công suất 1 HP lý tưởng cho phòng dưới 15m², tạo không gian mát lạnh, thoải mái và tiết kiệm điện hiệu quả.\nTích hợp nhiều tính năng AI thông minh\n-\nCông nghệ AI Frost Clean\n: đóng băng bụi bẩn và vi khuẩn ở -10ºC, sau đó rã đông và làm sạch tự động, giúp dàn lạnh luôn sạch sẽ và luồng gió thổi ra trong lành, an toàn cho sức khỏe.\n-\nChế độ Sleep Curve\n: tự động tăng hoặc giảm nhiệt độ theo từng giai đoạn giấc ngủ giúp nhiệt độ phòng luôn cân bằng với thân nhiệt, tránh lạnh buốt, tiết kiệm điện và mang lại giấc ngủ sâu, thoải mái.\n*Hình ảnh chỉ mang tính chất minh họa\n-\nCông nghệ AI Cool\n: cho phép điều khiển bật/tắt, thay đổi nhiệt độ, chuyển chế độ bằng giọng nói qua ứng dụng SmartHome.\n-\nCông nghệ AI Humidity\n: tự động điều chỉnh tốc độ quạt và công suất làm lạnh để cân bằng độ ẩm trong phòng ở mức lý tưởng từ 40% - 70%, giúp không khí luôn trong lành, mát mẻ, mang đến sự thoải mái tối đa mà không cần canh chỉnh thủ công.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nDàn lạnh\n-\nMáy lạnh một chiều\nnày của Comfee sở hữu phong cách thiết kế tối giản với dạng hình hộp chữ nhật, giúp tiết kiệm diện tích và dễ dàng lắp đặt. Toàn bộ thân máy sử dụng tông màu trắng trang nhã, mang lại cảm giác sạch sẽ và hài hòa với đa dạng phong cách nội thất, từ hiện đại đến tối giản.\n- Mặt trước tích hợp\nđèn LED hiển thị nhiệt độ\nrõ ràng, giúp người dùng dễ dàng theo dõi và điều chỉnh ngay cả trong điều kiện thiếu sáng.\n*Hình ảnh chỉ mang tính chất minh họa\nDàn nóng\n- Dàn nóng\nmáy lạnh\nđược thiết kế với kết cấu chắc chắn, có khả năng chịu đựng tốt các tác động từ môi trường như nắng nóng, mưa ẩm hay bụi bẩn.\n- Sử dụng\nống dẫn gas bằng đồng\ngiúp tăng hiệu quả trao đổi nhiệt, từ đó hỗ trợ quá trình làm lạnh nhanh và ổn định hơn. Phần\nlá tản nhiệt bằng nhôm được phủ lớp bảo vệ Golden Coating\ngiúp hạn chế tình trạng ăn mòn, oxy hóa cũng như sự phát triển của nấm mốc, góp phần nâng cao độ bền cho thiết bị.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh 1 HP\nnày có\ncông suất làm lạnh 9.350 BTU\n, hoạt động hiệu quả cho phòng có diện tích dưới 15m² như phòng ngủ hoặc phòng làm việc nhỏ.\n- Máy được trang bị công nghệ làm lạnh hiện đại với\nchế độ Hyper Tech\n, cho phép máy nén tăng tốc nhanh đến tần số cao chỉ trong thời gian ngắn, giúp căn phòng nhanh chóng đạt mức nhiệt mong muốn. Nhờ đó, người dùng có thể cảm nhận luồng không khí mát lạnh gần như ngay sau khi khởi động, mang lại sự thoải mái tức thì.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Comfee\nnày trang bị\ncánh đảo gió lên xuống tự động\n, kết hợp\nđiều chỉnh trái phải bằng tay\ngiúp luồng khí lan tỏa linh hoạt, hơi lạnh được phân bổ đều, làm mát nhanh và hạn chế cảm giác lạnh buốt tại một vị trí.\n- Ngoài ra,\ntính năng Follow Me\ngiúp remote đo nhiệt độ ngay tại vị trí bạn đang ngồi hoặc nằm, thay vì chỉ đo ở dàn lạnh. Nhờ đó, máy sẽ tự điều chỉnh để khu vực xung quanh bạn luôn mát và dễ chịu.\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy duy trì nhiệt độ ổn định, vận hành êm ái và tiết kiệm điện năng, mang đến không gian mát mẻ và thoải mái cho cả gia đình.\n-\nCông nghệ ECO+\ntích hợp thuật toán AI giúp tiết kiệm điện năng hiệu quả nhưng vẫn đảm bảo không khí mát lạnh tối ưu.\nXem thêm:\nVì sao máy lạnh Inverter tiết kiệm hơn hẳn máy lạnh thường?\n*Hình ảnh chỉ mang tính chất minh họa\n-\nChế độ Gear+\nđược nâng cấp với 5 mức (20%, 40%, 60%, 80%, 100%), giúp bạn dễ dàng chọn công suất phù hợp với nhiệt độ phòng, vừa mang lại sự thoải mái, vừa tiết kiệm năng lượng.\n*Hình ảnh chỉ mang tính chất minh họa\nKhả năng lọc không khí\nMáy trang bị\nhệ thống lọc kép Dual Filtration\nvới khả năng loại bỏ bụi mịn, vi khuẩn, các chất độc hại và hạt siêu nhỏ gây dị ứng, đồng thời khử mùi khó chịu trong phòng. Nhờ đó, không gian sống luôn sạch sẽ, trong lành, giúp bảo vệ sức khỏe và giảm nguy cơ kích ứng hô hấp hay dị ứng.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ Hút ẩm\n: giảm độ ẩm dư thừa, mang lại không gian khô ráo, thoáng mát, bảo vệ nội thất và sức khỏe, đặc biệt hữu ích trong mùa mưa ẩm hoặc mùa nồm.\n-\nPCB phủ lớp UV\n: tăng khả năng chống ẩm, bảo vệ bo mạch và nâng cao tuổi thọ thiết bị ngay cả trong điều kiện thời tiết khắc nghiệt.\n-\nĐịnh vị thông minh\n: trong bán kính 15 km, bạn có thể bật/tắt điều hòa hoặc thiết lập phạm vi mong muốn để Comfee chủ động làm mát phòng trước khi bạn trở về nhà.\n- Thiết bị\nhỗ trợ kết nối linh hoạt\nvới nhiều thiết bị thông minh như máy tính bảng, đồng hồ,…đồng thời tương thích với các trợ lý ảo phổ biến như Google Assistant, Apple HomeKit và Maika Assistant, giúp bạn điều khiển từ xa hoặc sử dụng giọng nói tiếng Việt dễ dàng. Ngoài ra, máy còn cho phép chia sẻ quyền điều khiển để các thành viên trong gia đình cùng sử dụng tiện lợi hơn.\nXem thêm:\nHướng dẫn sử dụng các tính năng điều khiển bằng giọng nói trên máy lạnh Comfee\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Comfee Inverter 1 HP CFS-10VDM đáp ứng tốt nhu cầu làm mát hằng ngày cho phòng dưới 15m² nhờ khả năng vận hành êm ái và tiết kiệm điện hiệu quả. Sản phẩm tích hợp các tiện ích thông minh, mang đến trải nghiệm sử dụng tiện lợi và là lựa chọn đáng tin cậy cho lối sống hiện đại.\nXem thêm","priceNum":7290000,"listPn":7990000,"salePn":7290000,"priceMode":"both","image":"https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614184743353.jpg","images":["https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614184743353.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614214520509.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614238422955.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614272015263.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614305715205.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614341281583.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614354781600.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614368977788.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614384343425.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614398103352.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614413533341.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614430290567.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614445170607.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/13-1020x570.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-1-639078868082613354-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-2-639084780546821892-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-3-639084780556232501-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-5-639084780572901080-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-99-639081358308979326-700x467.jpg"],"specs":{"Loại máy":"1 chiều (chỉ làm lạnh)","Inverter":"Có Inverter","Công suất làm lạnh":"1 HP - 9.350 BTU","Phạm vi làm lạnh hiệu quả":"Dưới 15m² (từ 30 đến 45m³)","Độ ồn trung bình (được đo trong phòng thí nghiệm)":"Dàn lạnh: 40/35.5/32 dB - Dàn nóng: 51 dB","Dòng sản phẩm":"2026","Sản xuất tại":"Thái Lan","Thời gian bảo hành cục lạnh, cục nóng":"3 năm","Thời gian bảo hành máy nén":"Máy nén 5 năm","Chất liệu dàn tản nhiệt":"Ống dẫn gas bằng Đồng - Lá tản nhiệt bằng Nhôm phủ lớp chống ăn mòn Golden Coating","Loại Gas":"R-32","Tiêu thụ điện":"0.83 kWh","Nhãn năng lượng":"5 sao (Hiệu suất năng lượng 5.20)","Công nghệ tiết kiệm điện":"Eco+ Smart Inverter","Lọc bụi, kháng khuẩn, khử mùi":"Công nghệ lọc kép Dual Filtration","Chế độ gió":"Đảo gió lên xuống tự động, trái phải tùy chỉnh tay","Công nghệ làm lạnh nhanh":"Hyper Tech","Tiện ích":"Định vị vị trí thông minh - LBS Remote có đèn nền PCB với lớp phủ UV Kết nối thông minh IOT Kết nối qua ứng dụng SmartHome Cảm biến nhiệt độ Follow Me Chế độ chăm sóc giấc ngủ Sleep Curve Màn hình hiển thị nhiệt độ trên dàn lạnh Chức năng hút ẩm iECO - Quản lý điện năng tiêu thụ qua ứng dụng AI Humidity - Chế độ cân bằng độ ẩm AI Frost Clean - Chế độ làm sạch sâu Tự khởi động lại khi có điện Gear Control Công nghệ AI Cool - điều khiển bằng giọng nói","Kích thước dàn lạnh":"Dài 72.3 cm - Cao 28.6 cm - Dày 19.9 cm","Khối lượng dàn lạnh":"7.2 kg","Kích thước dàn nóng":"Dài 66.8 cm - Cao 46.9 cm - Dày 25.2 cm","Khối lượng dàn nóng":"16.9 kg","Chiều dài lắp đặt ống đồng":"Tối thiểu 3m - Tối đa 15m","Chiều cao lắp đặt tối đa giữa cục nóng-lạnh":"10m","Dòng điện vào":"Dàn nóng hoặc dàn lạnh","Dòng điện hoạt động":"1 pha","Kích thước ống đồng":"6/10","Số lượng kết nối dàn lạnh tối đa":"1","Hãng":"Comfee. Xem thông tin hãng"},"features":["- Công nghệ AI Frost Clean : đóng băng bụi bẩn và vi khuẩn ở -10ºC, sau đó rã đông và làm sạch tự động, giúp dàn lạnh luôn sạch sẽ và luồng gió thổi ra trong lành, an toàn cho sức khỏe.","- Công nghệ AI Cool : cho phép điều khiển bật/tắt, thay đổi nhiệt độ, chuyển chế độ bằng giọng nói qua ứng dụng SmartHome.","- Mặt trước tích hợp đèn LED hiển thị nhiệt độ rõ ràng, giúp người dùng dễ dàng theo dõi và điều chỉnh ngay cả trong điều kiện thiếu sáng.","- Dàn nóng máy lạnh được thiết kế với kết cấu chắc chắn, có khả năng chịu đựng tốt các tác động từ môi trường như nắng nóng, mưa ẩm hay bụi bẩn.","- Máy lạnh 1 HP này có công suất làm lạnh 9.350 BTU , hoạt động hiệu quả cho phòng có diện tích dưới 15m² như phòng ngủ hoặc phòng làm việc nhỏ.","Xem thêm: Tổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng","- Ngoài ra, tính năng Follow Me giúp remote đo nhiệt độ ngay tại vị trí bạn đang ngồi hoặc nằm, thay vì chỉ đo ở dàn lạnh. Nhờ đó, máy sẽ tự điều chỉnh để khu vực xung quanh bạn luôn mát và dễ chịu.","- Công nghệ Inverter giúp máy duy trì nhiệt độ ổn định, vận hành êm ái và tiết kiệm điện năng, mang đến không gian mát mẻ và thoải mái cho cả gia đình.","- Công nghệ ECO+ tích hợp thuật toán AI giúp tiết kiệm điện năng hiệu quả nhưng vẫn đảm bảo không khí mát lạnh tối ưu.","Xem thêm: Vì sao máy lạnh Inverter tiết kiệm hơn hẳn máy lạnh thường?","- Chế độ Gear+ được nâng cấp với 5 mức (20%, 40%, 60%, 80%, 100%), giúp bạn dễ dàng chọn công suất phù hợp với nhiệt độ phòng, vừa mang lại sự thoải mái, vừa tiết kiệm năng lượng.","- Chế độ Hút ẩm : giảm độ ẩm dư thừa, mang lại không gian khô ráo, thoáng mát, bảo vệ nội thất và sức khỏe, đặc biệt hữu ích trong mùa mưa ẩm hoặc mùa nồm."],"model":"363374","brand":"Comfee","category":"Hàng Comfee","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"363374-may-lanh-comfee-inverter-1-hp-cfs-10vdm","_addedBy":"vai-add-product"},"401354":{"name":"Kệ Gia Vị Nâng Hạ Điện STAR MOVE (401354 - 900mm) - Higold ","description":"Đặc điểm nổi bật \nGiá gia vị nâng hạ điện STAR MOVE sử dụng công nghệ cảm biến chạm hiện đại. Chỉ cần chạm nhẹ vào bộ cảm biến, giá gia vị sẽ tự động hạ xuống theo chiều thẳng đứng, giúp tận dụng được những khoang tủ cao. Người dùng có thể dừng giá ở bất kỳ vị trí nào hoặc đưa về trạng thái ban đầu chỉ với một thao tác chạm. Cảm biến hoạt động mượt mà ngay cả khi tay bạn ướt hoặc dính dầu mỡ.\nHệ thống ròng rọc và ray trượt chắc chắn giúp giá vận hành trơn tru. Khi nhận tín hiệu chạm, hệ thống sẽ kéo giá xuống. Trong quá trình di chuyển, nếu gặp vật cản phía dưới, giá sẽ tự động đảo chiều đi lên, đảm bảo an toàn cho người dùng và thiết bị.\nGiá được thiết kế 2 tầng riêng biệt. Tầng trên để các lọ gia vị nhỏ, tầng dưới phù hợp cho các chai lớn hơn, giúp phân loại và sắp xếp gọn gàng, tận dụng hiệu quả không gian tủ bếp trên – nơi thường khó với tới.\nToàn bộ khung và giỏ được làm từ hợp kim nhôm phủ sơn tĩnh điện, có khả năng chống oxy hóa, hạn chế han gỉ, bền bỉ trong môi trường bếp ẩm, đồng thời dễ dàng vệ sinh.\nKết cấu chắc chắn, sản phẩm có khả năng chịu tải lên đến 20kg.\nSản phẩm sử dụng điện áp định mức 100-220V, tương thích với hầu hết hệ thống điện trong gia đình.\nĐèn LED tích hợp trên giá giúp chiếu sáng khu vực lưu trữ, hỗ trợ người dùng dễ dàng nhận biết và lấy đúng chai lọ mình cần ngay cả trong điều kiện thiếu sáng.","priceNum":21000000,"listPn":21000000,"salePn":21000000,"priceMode":"list","image":"https://phukienbepthanhdat.com/wp-content/uploads/2025/10/ke-gia-vi-nang-ha-dien-star-move-1.jpg","images":["https://phukienbepthanhdat.com/wp-content/uploads/2025/10/ke-gia-vi-nang-ha-dien-star-move-1.jpg"],"specs":{"Kích thước (rộng x sâu x cao)":"864 x 263x 690mm","Chất liệu":"Thép cacbon + Hợp kim nhôm","Kích thước phủ bì":"900mm"},"features":["Giá được thiết kế 2 tầng riêng biệt. Tầng trên để các lọ gia vị nhỏ, tầng dưới phù hợp cho các chai lớn hơn, giúp phân loại và sắp xếp gọn gàng, tận dụng hiệu quả không gian tủ bếp trên – nơi thường khó với tới.","Toàn bộ khung và giỏ được làm từ hợp kim nhôm phủ sơn tĩnh điện, có khả năng chống oxy hóa, hạn chế han gỉ, bền bỉ trong môi trường bếp ẩm, đồng thời dễ dàng vệ sinh.","Kết cấu chắc chắn, sản phẩm có khả năng chịu tải lên đến 20kg.","Sản phẩm sử dụng điện áp định mức 100-220V, tương thích với hầu hết hệ thống điện trong gia đình.","Đèn LED tích hợp trên giá giúp chiếu sáng khu vực lưu trữ, hỗ trợ người dùng dễ dàng nhận biết và lấy đúng chai lọ mình cần ngay cả trong điều kiện thiếu sáng."],"model":"401354","brand":"Higold","category":"Kệ gia vị nâng hạ điện","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"401354-ke-gia-vi-nang-ha-dien-star-move-401354-900mm-higold","_addedBy":"vai-add-product"},"BN7546":{"name":"Chậu 1 Hố Mạ Nano BN7546","description":"Trong thiết kế gian bếp hiện đại, việc lựa chọn một chiếc chậu rửa phù hợp đóng vai trò quan trọng để đảm bảo công năng và tính thẩm mỹ. Chậu 1 hố mạ nano được xem là sự lựa chọn hoàn hảo nhờ đặc tính bền bỉ, thiết kế đẹp và nhiều tính năng đi kèm. Hãy cùng tìm hiểu về những điểm nổi bật của chậu 1 hố mạ nano qua bài viết sau.\nChất liệu Inox 304 Mạ Nano – Bảo Chứng Chất Lượng Chất liệu inox 304 mạ nano của Boss được sử dụng cho chậu 1 hố không chỉ mang lại tính thẩm mỹ cao mà còn đảm bảo độ bền bỉ trước tác nhân oxy hóa, rỉ sét. Lớp mạ nano giúp gia tăng khả năng chống bám bẩn, dễ dàng lau chùi và giữ cho bề mặt chậu luôn sáng bóng như mới.\nKèm Phụ Kiện Tiện Ích Mỗi bộ chậu 1 hố mạ nano đều được trang bị đầy đủ các phụ kiện cao cấp, bao gồm:\nThớt chậu nhỏ : Giúp người dùng tiết kiệm diện tích khi chuẩn bị thức phẩm. Rổ nhỏ : Tiên lợi cho việc rửa rau, hoa quả hay để nước thoát nhanh hơn. Nhờ những phụ kiện đi kèm, chậu 1 hố mạ nano không chỉ đem lại sự tiên nghi mà còn góp phần giãm bớt gánh nặng trong công việc bếp núc.\nĐặc Điểm Kỹ Thuật Vượt Trội Chậu 1 hố mạ nano được thiết kế để phù hợp với nhiều nhu cầu khác nhau. Hai mã sản phẩm phổ biến nhất là BN7546 và BN7848.\n1. Mã BN7546 Kích thước khoét đá: 42 x 72 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm 2. Mã BN7848 Kích thước khoét đá: 47 x 75.5 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm Với độ dày viền đạt 3.0 mm và thùng 1.0 mm, chậu 1 hố mạ nano bảo đảm tính chắc chắn, chống biến dạng trong quá trình sử dụng. Kích thước linh hoạt có thể đầu vừa với nhiều loại bếp từ truyền thống đến hiện đại.\nThiết Kế Hiện Đại – Tính Đa Năng Thiết kế của chậu 1 hố mạ nano được đánh giá cao nhờ tính đơn giản mà tính tế. Tất cả các chi tiết đều được gia công kỹ lưỡng, đáp ứng được các tiêu chuẩn cao nhất trong thiết kế nội thất.\nChậu 1 hố mạ nano\nKhông chỉ phù hợp cho những căn bếp hiện đại, chậu 1 hố còn mang lại khả năng đa dụng, tực hợp nhiều phụ kiện để đáp ứng nhu cầu của từng gia đình.\nLý Do Nên Chọn Chậu 1 Hố Mạ Nano 1. Bền Bỉ Vượt Trội Inox 304 là chất liệu nổi tiếng với độ bền bỉ, khả năng chống oxy hóa cao và không bị ảnh hưởng bởi các chất tẩy rửa mành.\n2. Tính Năng Chống Bám Bẩn Lớp mạ nano giúp dễ dàng lau chùi, ngăn ngừa vi khuẩn và bảo vệ an toàn sức khỏe cho gia đình.\n3. Thiết Kế Linh Hoạt Kích thước đa dạng phù hợp với nhiều loại bếp, từ bếp truyền thống đến hiện đại.\n4. Phụ Kiện Đi Kèm Với thớt chậu và rổ nhỏ, sản phẩm cung cấp đầy đủ tiên nghi cho gian bếp.\nHướng Dẫn Lắp Đặt Chậu 1 Hố Mạ Nano Đọc kỹ hướng dẫn sử dụng và bản vẽ kèm theo. Đo và đánh dấu vị trí khoét đá phù hợp: BN7546: 42 x 72 cm BN7848: 47 x 75.5 cm Lắp chậu và kết nối đáy tháo nước đảm bảo khít chặt. Hoàn thiện bằng cách làm sạch bặng vải mềm. Chậu 1 hố mạ nano không chỉ là một sản phẩm cao cấp với nhiều tính năng tiện ích mà còn mang lại tính thẩm mỹ và bền bỉ cho gian bếp của bạn. Với chất liệu inox 304, thiết kế độc đáo và phụ kiện đi kèm, sản phẩm này xứng đáng là một trong những lựa chọn tốt nhất cho bất kỳ gia đình nào","priceNum":7950000,"listPn":7950000,"salePn":7950000,"priceMode":"list","image":"https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-1-ho-ma-nano.webp","images":["https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-1-ho-ma-nano.webp"],"specs":{"Kích thước (mã BN7546)":"Kích thước khoét đá 42 x 72 cm."},"features":["Chất liệu cao cấp: Chậu được làm từ inox 304 mạ nano, bền bỉ và chống gỉ sét, phù hợp với mọi không gian bếp hiện đại.","Thiết kế chắc chắn: Độ dày viền 3.0mm và thùng chậu 1.0mm đảm bảo độ bền và khả năng chịu lực cao.","Phụ kiện đi kèm tiện ích: Bao gồm thớt chậu nhỏ và rổ nhỏ, hỗ trợ tối đa trong quá trình sử dụng.","Dễ dàng lắp đặt và vệ sinh: Thiết kế tối ưu hóa tiện ích và đảm bảo vệ sinh tuyệt đối trong không gian bếp"],"model":"BN7546","brand":"Boss","category":"Chậu rửa bát","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"bn7546-chau-1-ho-ma-nano-bn7546","_addedBy":"vai-add-product"},"MS7743SI":{"name":"Chậu rửa chén 1 hố Inox 304 hạn chế trầy xước kích thước 76 cm","description":"Loại sản phẩm: Chậu Rửa Chén\nLoại chậu: Lắp Nổi + Lắp âm\nChất liệu: Inox 304\nThiết kế Chậu: 1 Hố\nKích thước hố xả: 114\nPhụ kiện đi kèm: Thớt kháng khuẩn, 2 rổ Plastic ABS, bộ xả thông minh Z-Style, tiết kiệm không gian","priceNum":8250000,"listPn":0,"salePn":8250000,"priceMode":"both","image":"https://bizweb.dktcdn.net/100/567/847/products/ms7743si.jpg","images":["https://bizweb.dktcdn.net/100/567/847/products/ms7743si.jpg","https://bizweb.dktcdn.net/100/567/847/products/ms7743gr-si-dc58b1ae-540e-4a5b-9f71-4bbdb6374acd.jpg"],"specs":{"Loại sản phẩm":"Chậu Rửa Chén","Loại chậu":"Lắp Nổi + Lắp âm","Chất liệu":"Inox 304","Thiết kế Chậu":"1 Hố","Kích thước hố xả":"114","Phụ kiện đi kèm":"Thớt kháng khuẩn, 2 rổ Plastic ABS, bộ xả thông minh Z-Style, tiết kiệm không gian","Chiều rộng sản phẩm (mm)":"760","Chiều sâu sản phẩm (mm)":"430","Chiều cao sản phẩm (mm)":"220","Chiều rộng mặt cắt đá - Lắp nổi (mm)":"736","Chiều sâu mặt cắt đá - Lắp nổi (mm)":"406","Bo góc mặt cắt đá - Lắp nổi (mm)":"R10","Chiều rộng mặt cắt đá - Lắp âm (mm)":"726","Chiều sâu mặt cắt đá - - Lắp âm (mm)":"396","Bo góc mặt cắt đá - Lắp âm (mm)":"R25","Chiều rộng đóng gói (mm)":"845","Chiều sâu đóng gói (mm)":"515","Chiều cao đóng gói (mm)":"280","Mã SAP":"600001525","Rổ lọc rác bằng inox tiện lợi":"Có","Lớp chống ồn và chống ngưng tụ nước dưới đáy chậu":"Có","Bộ xả thông minh ngăn mùi hiệu quả":"Có"},"features":[],"model":"MS7743SI","brand":"Malloca","category":"Chậu rửa","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"ms7743si-chau-rua-chen-1-ho-inox-304-han-che-tray-xuoc-kich-thuoc-76-cm","_addedBy":"vai-add-product"},"KF-DR113L09BL":{"name":"MÁY SẤY CHÉN KAFF KF-DR113L09BL","description":"MÁY SẤY KAFF KF-DR113L09BL • Máy sấy cửa trước hiện đại lồng ngang • 15 chương trình sấy tự động tích hợp (Cotton Extra Dry, Cotton Cupboard Dry, Cotton Iron Dry, Synthetics Cupboard Dry, Synthetics Iron Dry, Delicate, Mix, Baby Care, Towels,Hygiene, Outdoor, Time drying, Refresh, Express, Shirts, Duvet, Sport, Wool refresh) • Khối lượng sấy khô 9 Kg • Công nghệ sấy cưỡng bức trực tiếp hiện đại - HEAT PUMP A++ (AL) • Lồng sấy inox, thân sơn tĩnh điện màu đen cao cấp • Chức năng diệt khuẩn an toàn UVC_TD • Motor Pump và máy nén Compressor motor kiểu PSC hoạt động đảo chiều, không sử dụng chổi than EcoSilence Drive giúp máy sấy hoạt động với đồ ồn thấp và bền bỉ - tiết kiệm năng lượng • Hệ thống cảm biến sấy an toàn Sensor Drying System • Đảo chiều lồng quay lúc sấy giúp sấy đồ khô nhanh hơn, hiệu quả hơn (Two Way Tumbling) • Điều khiển điện tử (Control system Electronic) • Hệ thống phát hiện lỗi khi sử dụng (Failure Detection System) • Khóa trẻ em an toàn (Child lock) • Hiện thị chu trình sấy (Drying cycle indicator) • Chức năng hẹn giờ lên đến 1-23h (Delay time adjustment via button) • Điều chỉnh cường độ sấy (Drying level adjustment via button) • Điều chỉnh chương trình sấy (Drying Target) • Điều chỉnh tốc độ sấy (Spin Speed Selection) • Màn hình hiện thị led màu sáng trắng LEDCOLOR_TD_T) • Hiện thị cảnh báo lọc đầy (Filter full indicator) • Hiện thị tank nước đầy (Water tank full indicator) • Cảnh báo cần làm sạch bình ngưng (Condenser cleaning indicator) • Thời lượng chương trình (phút) - Đầy tải: 208 • Thời lượng chương trình (phút) - Tải một phần: 116 • Thời lượng chương trình (phút) - Tải trọng 70%: 155 • ","priceNum":25800000,"listPn":0,"salePn":25800000,"priceMode":"both","image":"https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699435317207.jpg","images":["https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699435317207.jpg","https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699499640165.jpg"],"specs":{"Tiêu thụ năng lượng ở mức tải một phần (kWh/chu kỳ)":"1.19 • Tiêu thụ năng lượng ở mức đầy tải (kWh/chu kỳ): 2.12 • Công suất sấy 1000W • Tiêu thụ năng lượng (kWh/năm): 259 • Tốc độ quay (RPM): 600-800-1000-1200-1400-1600 Vòng • Thời gian sấy (phút): 10 - 30 - 60 - 90 - 120 - 150 • Nút bấm chọn tính năng: + Tắt mở (On/Off) + Chức năng tạm dừng (Start/Pause) + Chức năng chống nhăn quần áo (Anti-crease) + Tín hiệu sấy (Signal) + Đèn cảnh báo (Lamp) • Tiêu chuẩn tiết kiệm năng lượng A+++ theo tiêu chuẩn Châu Âu • Hệ thống SensitiveDrying Sytem giúp quần áo thấm một luồng không khí từ mọi phía khiến quần áo được sấy khô tuyệt đối mà vẫn mềm mại • Độ ồn chỉ 65dB nhờ công nghệ chống rung AntiVibration hiện đại • Chuông báo khi quá trình sấy kết thúc, kiểm soát mọi sự cố có thể gặp cho hệ thống điện, nước và ngưng mọi hoạt động vô cùng an toàn • Nguồn điện 220V-240V/50Hz • Công suất định mức 1000W - 10A • Áp suất nước tiêu chuẩn 0.05 - 1 Mpa • Bình giữ nhiệt an toàn • Cửa máy hoạt động đóng mở bằng khóa điện từ độ mở 180 độ hiệu quả tối đa, kinh tế, bền bỉ và êm ái • Kích thước sản phầm (HxWxD) (mm): 845x596x609 • Gross Weight (Shrink) (Kg) -Glass Door: 46.8 • Gross Weight (Carton) (kg) - Glass Door: 47.8 • Bảo hành 05 năm"},"features":[],"model":"KF-DR113L09BL","brand":"KAFF","category":"MÁY SẤY CHÉN","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"kf-dr113l09bl-may-say-chen-kaff-kf-dr113l09bl","_addedBy":"vai-add-product"},"KFFC9014":{"name":"VÒI RỬA NÓNG LẠNH KAFF KF-FC9014","description":"VÒI RỬA NÓNG LẠNH KAFF KF-FC9014 • Vòi lạnh • Bảo hành 3 năm","priceNum":4180000,"listPn":0,"salePn":4180000,"priceMode":"both","image":"https://kaff.vn/upload/products/large/voi-rua-lanh-kaff-kf-fc9014-1704925929991.jpg","images":["https://kaff.vn/upload/products/large/voi-rua-lanh-kaff-kf-fc9014-1704925929991.jpg"],"specs":{},"features":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"model":"KFFC9014","brand":"KAFF","category":"VÒI RỬA CHÉN","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"kffc9014-voi-rua-nong-lanh-kaff-kf-fc9014","_addedBy":"vai-add-product"},"KAFF KF - IC79H New Plus":{"name":"BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus","description":"Giá bán khuyến mãi 21,800,000đ BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus Bếp điện từ kết hợp: 02 từ + 01 điện – Xuất xứ: MALAYSIA Mặt kính Shott Ceran Made in Germany siêu bền, chịu lực chịu sốc nhiệt Đầu đốt EGO Made in Germany Chức năng Booster cực nhanh với bếp từ Bo mạch lGBT SIMENS Made in Germany Công nghệ Half- Bridge gia nhiệt liên tục 10 dải công suất Điều khiển cảm ứng Slider dạng ẩn trực tiếp trên mặt bếp Chế độ hẹn giờ, tiện dụng Chức năng Inverter và chia công suất tiết kiệm điện năng, bảo vệ bếp Bảo hành 05 năm","priceNum":21800000,"listPn":0,"salePn":21800000,"priceMode":"both","image":"https://kaff.vn/upload/products/large/bep-dien-tu-kaff-kf-ic79h-new-plus-170850056341.jpg","images":["https://kaff.vn/upload/products/large/bep-dien-tu-kaff-kf-ic79h-new-plus-170850056341.jpg"],"specs":{},"features":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"model":"KAFF KF - IC79H New Plus","brand":"KAFF","category":"BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"kaff-kf-ic79h-new-plus-bep-dien-tu-kaff-kf-ic79h-new-plus","_addedBy":"vai-add-product"},"GARDE820SEMI":{"name":"MÁY RỬA CHÉN KAFF KF-GARDE820 SEMI","description":"MÁY RỬA CHÉN KAFF KF-GARDE820 SEMI • Máy rửa chén âm bán phần • Sức chứa 15 bộ đồ ăn Châu Âu • 10 Chương trình rửa tích hợp: Prewash, Mini 14’ (Jet Wash), Quick 30’ 40°C, Eco (Standard Programme), Super 50’ 65°C (Quick Clean), Easy Care 60°C, Dual Pro Wash 60°C, Smart 30°C - 50°C, Smart 50°C - 60°C, Smart 60°C - 70°C. Chức năng đặc biệt: *Delay timer option • Eco Wash - Half load option (with 3 mode), Tablet option, Extra Hygiene option, Extra Drying option, Extra Silent option (Silent Wash), Extra Fast option, Energy Save option, Rinse-aid indicator, Salt indicator, Washing cycle indicators, End of cycle indicator • Chức năng UVON diệt khuẩn (UVON natural tech) • Chức năng ION diệt khuẩn (ION natural tech) • Hệ thống sấy khô Tubo (Drying system) • Khóa trẻ em (Child lock) • Chức năng tạo Ozon • Hệ thống chống Siphon • Điều khiển cảm ứng hiện đại, màn hình Led sang trọng • Chức năng hẹn giờ (Delay time) • Chức năng nâng hạ giàn rửa (Adjustable upper basket) • Vòi phun phụ • Độ ồn cực thấp maximum 42 dB • Tiêu chuẩn tiết kiệm năng lượng châu Âu A+++, chỉ số hiệu quả năng lượng A • Chức năng khóa máy khi có sự cố tác động (ngập nước, va đập, yếu điện, thiếu nước,...) • Chống rò nước từ máy • Hệ thống chuyển hướng điện (Electrical Diverter system) • Đèn báo máy hoạt động và kết thúc chương trình rửa • Chức năng kiểm tra độ cứng và làm mềm nước • Đèn chiếu sáng bên trong (One spot) • Bảo hành 05 năm","priceNum":30800000,"listPn":0,"salePn":30800000,"priceMode":"both","image":"https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1700107978718.jpg","images":["https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1700107978718.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490852905.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490852442.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853426.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853575.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853725.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-173449085368.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853605.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853664.jpg","https://kaff.vn/upload/products/large/may-rua-chen-am-ban-phan-kf-hb805se17-pro-1757658670600.jpg"],"specs":{},"features":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"model":"GARDE820SEMI","brand":"KAFF","category":"MÁY RỬA CHÉN","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"garde820semi-may-rua-chen-kaff-kf-garde820-semi","_addedBy":"vai-add-product"},"GRANITE KF - MONDY - 8552S":{"name":"Chậu rửa KAFF GRANITE KF - MONDY - 8552S","description":"Giá bán khuyến mãi 9,880,000đ Chậu rửa GRANITE KF - MONDY - 8552S • Chất liệu: Đá GRANITE • Màu sắc: Đen, trắng, vàng, kem, xám • Độ sâu bồn: 220mm • Kích thước: 850D x 515R mm • Đóng gói: 1 bộ tiêu chuẩn túi PE Foam (kèm siphon) • Bảo hành: 3 năm","priceNum":9880000,"listPn":0,"salePn":9880000,"priceMode":"both","image":"https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1704662337400.jpg","images":["https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1704662337400.jpg","https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1751539458342.jpg"],"specs":{"Màu sắc":"Đen, trắng, vàng, kem, xám • Độ sâu bồn: 220mm • Kích thước: 850D x 515R mm • Đóng gói: 1 bộ tiêu chuẩn túi PE Foam (kèm siphon) • Bảo hành: 3 năm"},"features":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"model":"GRANITE KF - MONDY - 8552S","brand":"KAFF","category":"Chậu rửa chén","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"granite-kf-mondy-8552s-chau-rua-kaff-granite-kf-mondy-8552s","_addedBy":"vai-add-product"},"EL988":{"name":"Khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi","description":"Tổng quan  khóa Demax EL988 24K Brass App Wifi \nTrong thị trường khóa thông minh ngày nay, Khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi từ Malaysia nổi bật với thiết kế và tính năng đa dạng, đáp ứng mọi yêu cầu của khách hàng. Với màu sắc Mạ Vàng 24K, khóa này thực sự là một tác phẩm nghệ thuật cho các không gian đại sảnh và biệt thự.\nChất liệu bền bỉ và thiết kế sang trọng \nKhóa cao cấp Brass được chế tạo từ đồng thau nguyên chất với lớp mạ vàng 24K, mang đến vẻ đẹp sang trọng và độ bền cao. Thân khóa làm từ thép SUS 304 chất lượng, giúp khóa chống chịu được va đập và thời tiết khắc nghiệt, bảo vệ tối đa cho ngôi nhà của bạn. \nVới sự kết hợp giữa thiết kế đẳng cấp và chất liệu chất lượng, tạo nên một điểm nhấn độc đáo cho không gian của bạn.\nƯu điểm của khóa \nMở khóa đa phương thức và bảo mật tuyệt đối \nThiết bị có khả năng mở khóa theo nhiều phương thức khác nhau, đảm bảo tính bảo mật tuyệt đối cho ngôi nhà của bạn. Bạn có thể mở khóa bằng nhận diện khuôn mặt FACE ID-3D, mở khóa từ xa thông qua ứng dụng Wifi, sử dụng vân tay, mật mã, thẻ từ, hoặc chìa khóa chống sao chép.\nTiện ích và linh hoạt \nSản phẩm không chỉ hướng đến tính bảo mật mà còn mang lại nhiều tiện ích và linh hoạt cho người dùng. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể dễ dàng quản lý quyền truy cập của gia đình và khách khứa.\nNgoài ra, khóa còn tích hợp nhiều tính năng thông minh như nhận dạng vân tay bằng sinh trắc học FPC từ Thụy Điển, chức năng thoát hiểm từ bên trong, tay nắm đổi chiều Phải - Trái, cảnh báo đột nhập, vô hiệu hóa thẻ bị mất và chức năng cập nhật thông tin. Bạn sẽ luôn được nhắc nhở khi pin yếu, đảm bảo khóa luôn hoạt động hiệu quả.\nKết nối thông minh và dễ dàng sử dụng \nKhóa có thể kết nối với điện thoại thông qua ứng dụng App wifi đơn giản, giúp bạn kiểm soát và điều khiển từ xa một cách dễ dàng. Bạn có thể mở khóa, cập nhật thông tin và nhận thông báo trạng thái của khóa mọi lúc, mọi nơi.\nKhả năng lưu trữ \nKhóa điện tử thông minh Brass App Wifi được trang bị nhiều tính năng hữu ích. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể quản lý quyền truy cập một cách linh hoạt và tiện lợi. Đồng thời, khóa còn hỗ trợ thẻ từ theo máy và chìa khóa chống sao chép, giúp tăng cường tính bảo mật cho ngôi nhà của bạn.\nTính năng độc đáo và thông minh \nKhóa cửa Demax EL988 24K Brass App Wifi mang đến nhiều tính năng độc đáo và thông minh. Với nhận diện vân tay bằng sinh trắc học FPC từ Thụy Điển, khóa đảm bảo độ chính xác và an toàn cao.\nHơn nữa, khóa còn được trang bị chức năng thoát hiểm từ bên trong, giúp bạn dễ dàng ra vào ngôi nhà trong trường hợp khẩn cấp.\nSự đa dạng và phù hợp với không gian \nKhóa đại sảnh 24K từ Malaysia không chỉ chú trọng đến tính năng và bảo mật, mà còn phù hợp với nhiều loại không gian khác nhau. Với kích thước mặt trong và mặt ngoài cùng là 80 x 735mm, khóa này có thể dễ dàng lắp đặt vào cửa đi của các đại sảnh và khóa cửa gỗ đại sảnh biệt thự.\nĐơn giản và thuận tiện trong sử dụng \nTrên đây là những thông tin về khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi, một sản phẩm kết hợp hoàn hảo giữa công nghệ và sang trọng. Với thiết kế đẳng cấp, tính bảo mật cao, tính năng đa dạng và kết nối thông minh, khóa này sẽ mang đến trải nghiệm tuyệt vời cho ngôi nhà của bạn.","priceNum":59990000,"listPn":59990000,"salePn":59990000,"priceMode":"list","image":"https://thienkimhome.com/application/upload/products/Demax-SL988-24K-Brass-App-Wifi.jpg","images":["https://thienkimhome.com/application/upload/products/Demax-SL988-24K-Brass-App-Wifi.jpg","https://thienkimhome.com/application/upload/products/kich-thuoc-sl-988-24k.png","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-1.jpg","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-2.jpg","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-3.jpg"],"specs":{"Mã sản phẩm":"Mã Mới: EL988 24K Brass Mã cũ: SL988 24K Brass App Wifi","Thương hiệu":"Demax Xem thông tin hãng","Xuất xứ":"Malaysia","Cách mở khoá":"– Mở khóa bằng nhận diện khuôn mặt FACE ID-3D – Mở khóa từ xa bằng App Wifi – Mở khóa bằng vân tay – Mở khóa bằng mật mã – Mở khóa bằng thẻ từ – Chìa khóa chống sao chép","Màu sắc":"Mạ Vàng 24K","Phù hợp cho":"Đại sảnh - biệt thự","Kích thước mặt trong":"80 x 735mm (Rộng x cao)","Kích thước mặt ngoài":"80 x 735mm (Rộng x cao)","Khả năng lưu trữ":"– Số vân tay: 100 – Số thẻ từ (cài đặt, sử dụng): 100 – Nhận dạng khuôn mặt: 100 – Thẻ từ theo máy: 2 – Chìa khóa chống sao chép: 2","Tính năng":"– Nhận dạng vân tay bằng sinh trắc học FPC – Thụy Điển – Chức năng thoát hiểm từ bên trong – Tay nắm đổi chiều Phải – Trái – Cảnh báo đột nhập – Vô hiệu hóa thẻ bị mật – Chức năng cập nhật thông tin – Nhắc nhở pin yếu","Vật liệu":"Đồng thau nguyên chất, mạ vàng 24 K – Thân khóa thép SUS 304","Nguồn điện":"7,4V Lithium (Pin sạc Lithium kép)","Nguồn khẩn cấp":"5V-2A, Micro USB","Độ dày cửa":"40~90 mm","Đố cửa":"> 100 mm","Loại cửa":"Cửa đi","Kết nối điện thoại":"Có","Phụ kiện kèm theo":"– Thẻ từ theo máy: 2 – Chìa khóa chống sao chép: 2"},"features":["Tổng quan  khóa Demax EL988 24K Brass App Wifi","Chất liệu bền bỉ và thiết kế sang trọng","Ưu điểm của khóa","Mở khóa đa phương thức và bảo mật tuyệt đối","Tiện ích và linh hoạt","Kết nối thông minh và dễ dàng sử dụng","Khả năng lưu trữ","Tính năng độc đáo và thông minh","Sự đa dạng và phù hợp với không gian","Đơn giản và thuận tiện trong sử dụng"],"model":"EL988","brand":"Demax","category":"Khóa điện tử","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"el988-khoa-dai-sanh-biet-thu-demax-el988-24k-brass-app-wifi","_addedBy":"vai-add-product"},"C1MO90B":{"name":"C1MO90B | Grob | Kệ Đựng Bát Đĩa Mix Oval Inox Sus304 Xước Mờ - cánh/phủ bì 900mm, lọt lòng 564mm","priceNum":4148000,"description":"KỆ ĐỰNG BÁT ĐĨA MIX OVAL INOX SUS304 XƯỚC MỜ","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"564*500*250 mm","Kích thước cánh/phủ bì":"900 mm","Khoang tủ/chiều rộng tủ":"900 mm","Kích thước lọt lòng/thực tế phụ kiện":"900 mm","Quy cách (Rộng x Sâu x Cao)":"R564 * S500 * C250 mm","kich_thuoc":"864 x 500 x 250mm","khoang_tu":"900mm"},"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p48.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p48.jpg"},"C1MO90":{"name":"C1MO90 | Grob | Kệ Đựng Xoong Nồi Mix Oval Inox Sus304 Xước Mờ - cánh/phủ bì 900mm, lọt lòng 564mm","priceNum":4083000,"description":"KỆ ĐỰNG XOONG NỒI MIX OVAL INOX SUS304 XƯỚC MỜ","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"564*500*250 mm","Kích thước cánh/phủ bì":"900 mm","Khoang tủ/chiều rộng tủ":"900 mm","Kích thước lọt lòng/thực tế phụ kiện":"900 mm","Quy cách (Rộng x Sâu x Cao)":"R564 * S500 * C250 mm","kich_thuoc":"864 x 500 x 250mm","khoang_tu":"900mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p47.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p47.jpg"},"H1270AT":{"name":"Hút Mùi Âm Tủ Canzy CZH1270AT","description":"Canzy CZ H1270AT: Máy hút mùi âm tủ kéo rút – Tinh gọn không gian, tối ưu sức mạnh Canzy CZ-H1270AT là dòng máy hút mùi âm tủ thế hệ mới, được thiết kế đặc biệt cho những căn hộ chung cư hoặc không gian bếp cần sự ngăn nắp tuyệt đối. Với cơ chế hoạt động kéo rút linh hoạt cùng khả năng vận hành siêu êm ái, CZ H1270AT k","priceNum":5980000,"listPn":5980000,"salePn":5980000,"priceMode":"list","image":"https://bizweb.dktcdn.net/100/357/739/products/d8a4ae24-299d-442f-8a77-a7aaeae9219b.jpg","images":["https://bizweb.dktcdn.net/100/357/739/products/d8a4ae24-299d-442f-8a77-a7aaeae9219b.jpg","https://bizweb.dktcdn.net/100/357/739/products/3cebb626-dd99-4f8d-ae1e-067ddac165a0.jpg"],"specs":{"Tiêu chí kỹ thuật":"Thông số chi tiết","Model":"CZ H1270AT","Thương hiệu":"Canzy (Chính hãng)","Kiểu máy":"Máy hút mùi âm tủ kéo rút (Kéo ra bật – Đóng vào tắt)","Chất liệu":"Inox cao cấp – Kính cường lực","Động cơ":"160W (Vận hành ổn định)","Công suất hút":"950 m³/h (Cực mạnh trong phân khúc)","Độ ồn":"≤ 38 dB (Siêu êm ái)","Điều khiển":"3 tốc độ linh hoạt","Hệ thống lọc mỡ":"2 lưới lọc Aluminum 3 lớp (Dễ vệ sinh)","Chế độ khử mùi":"Than hoạt tính hoặc ống thoát Ø120mm","Hệ thống chiếu sáng":"Đèn 2 × 40W (Hỗ trợ nấu nướng)","Tiện ích an toàn":"Lẫy cài Inox chống cháy, hẹn giờ mặc định","Đường kính ống thoát":"Ø120 mm"},"features":["• Tối ưu diện tích: Toàn bộ thân máy được giấu kín trong tủ bếp, chỉ để lộ phần thanh kéo thanh mảnh, giúp gian bếp trông rộng rãi và chuyên nghiệp hơn.","Động cơ 160W nội lực: Dù thiết kế nhỏ gọn, CZ H1270AT sở hữu công suất hút lên đến 950m3/h, loại bỏ nhanh chóng mùi thức ăn đậm mùi nhất.","Hệ thống khử mùi kép: Tích hợp chế độ khử mùi tại chỗ bằng than hoạt tính hoặc xả trực tiếp qua ống thoát Ø120mm, linh hoạt cho mọi địa hình lắp đặt.","Máy này có hẹn giờ không? Có, CZ H1270AT tích hợp chế độ hẹn giờ mặc định giúp bạn yên tâm để máy tự làm sạch không khí sau khi nấu.","Kéo ra một nửa máy có chạy không? Máy bắt đầu hoạt động ngay khi bạn kéo nhẹ thanh trượt, tuy nhiên nên kéo hết cỡ để diện tích hút khói là lớn nhất."],"model":"H1270AT","brand":"Canzy","category":"Máy hút mùi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"h1270at-hut-mui-am-tu-canzy-czh1270at","_addedBy":"vai-add-product"},"CZI39992C":{"name":"Bếp Điện Từ Canzy CZI39992C SERI8","description":"Bếp từ đôi Canzy CZ-I39992C Serial 8.0 là mẫu bếp âm hai vùng nấu dành cho căn bếp hiện đại, kết hợp mặt kính ELCD Platinum Ceramic đen bóng với bo viền nhôm màu sáng. Hai vùng từ vận hành độc lập, điều khiển cảm ứng trượt 9 mức nhiệt và công nghệ Inverter giúp nấu linh hoạt, tiết kiệm điện trong quá trình sử dụng hằng","priceNum":12980000,"listPn":12980000,"salePn":12980000,"priceMode":"list","image":"https://bizweb.dktcdn.net/100/357/739/products/758e2570-49e4-44aa-bd20-b7d006e318ad.jpg","images":["https://bizweb.dktcdn.net/100/357/739/products/758e2570-49e4-44aa-bd20-b7d006e318ad.jpg","https://bizweb.dktcdn.net/100/357/739/products/gen-n-6-1387979f-8fc6-4b67-adcb-5b8b4cbf877c.jpg"],"specs":{},"features":["Số vùng nấu 2 vùng từ","Mặt kính ELCD Platinum Ceramic đen bóng, bo viền nhôm màu sáng","Điều khiển Cảm ứng Slide, 9 cấp độ nấu","Công nghệ Inverter thông minh, tiết kiệm khoảng 30% điện năng","Vùng nấu trái Booster 2.400W","Vùng nấu phải Booster 2.400W","Điện áp 220/240V","Kích thước mặt bếp 730 x 430 mm","Kích thước cắt đá 690 x 390 mm","Chức năng nấu Sôi liu riu, Warm, Stir Fry, Pause, Booster, hẹn giờ","An toàn Tự ngắt khi không có nồi; cảnh báo dư nhiệt; chống tràn; khóa trẻ em; khóa phím; bảo vệ quá nhiệt - quá áp"],"model":"CZI39992C","brand":"Canzy","category":"Bếp từ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"czi39992c-bep-dien-tu-canzy-czi39992c-seri8","_addedBy":"vai-add-product"},"BD-1054HVOW":{"name":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","description":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","priceNum":5990000,"listPn":10990000,"salePn":5990000,"priceMode":"both","image":"https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806.jpg","images":["https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-638963804276138450.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-638963804285992497.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-99-638962219298592474.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-5-639063368977740536.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-639063369030108820.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-639063369065311055.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-639063369104866518.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-4-639063369150311821.jpg"],"specs":{"Loại máy giặt":"Cửa trước","Lồng giặt":"Lồng ngang","Khối lượng giặt":"10.5 Kg","Số người sử dụng":"Trên 7 người","Kiểu động cơ":"Truyền động gián tiếp (dây Curoa)","Tốc độ quay vắt tối đa":"1400 vòng/phút","Chất liệu lồng giặt":"Inox","Chất liệu vỏ máy":"Kim loại sơn tĩnh điện","Chất liệu cửa máy":"Nhựa","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2025","Thời gian bảo hành động cơ":"10 năm","Hiệu suất sử dụng điện":"5.7 Wh/kg","Loại Inverter":"Công nghệ Inverter","Chương trình":"Đồ màu Vải mỏng Đồ trẻ em Đồ lót Đồ len Đồ hỗn hợp Đồ cotton Đồ Jeans Áo sơ mi Xả + vắt Vệ sinh lồng giặt Vắt Giặt vệ sinh Giặt tiết kiệm Giặt nhanh Giặt chăn bông","Công nghệ giặt":"Giặt nước nóng Giặt hơi nước","Bảng điều khiển":"Song ngữ Anh - Việt có núm xoay, cảm ứng và màn hình hiển thị","Tiện ích":"Vệ sinh lồng giặt Khóa trẻ em Hẹn giờ giặt Chống nhăn Chỉnh số vòng vắt Chỉnh nhiệt độ nước","Kích thước - Khối lượng":"Cao 85 cm - Ngang 60 cm - Sâu 63.5 cm - Nặng 70 kg","Chiều dài ống cấp nước":"110 cm","Chiều dài ống thoát nước":"180 cm","Hãng":"Hitachi. Xem thông tin hãng"},"features":["Thiết bị sử dụng kiểu động cơ gián tiếp truyền động dây curoa nên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.","Tiện ích giặt chống nhăn được thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.","Hẹn giờ giặt giúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.","Tùy chỉnh số vòng vắt, nhiệt độ nước cho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.","Vệ sinh lồng giặt bằng nước nóng giúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt."],"model":"BD-1054HVOW","brand":"Hitachi","category":"Máy giặt / sấy","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"bd-1054hvow-may-giat-hitachi-inverter-10-5-kg-bd-1054hvow","_addedBy":"vai-add-product"},"GWE35":{"name":"Giá treo quần âu đôi Garis GWE35","description":"Giá treo quần âu đôi GW35E Thiết kế tiện lợi, chất liệu bền đẹp, tối ưu không gian tủ quần áo. Dễ lắp đặt, hỗ trợ lưu trữ quần âu ngăn nắp và gọn gàng","priceNum":2950000,"listPn":0,"salePn":2950000,"priceMode":"list","image":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C3%B4i%20GW35E.jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C3%B4i%20GW35E.jpg"],"specs":{},"features":["Màu xanh Emerald, tạo nên vẻ đẹp và sự tươi mới cho không gian treo quần áo. Màu sắc này cũng tạo điểm nhấn với sự phong cách cho sản phẩm."],"model":"GWE35","brand":"Garis","category":"Giá treo quần âu đôi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gwe35-gia-treo-quan-au-doi-garis-gwe35","_addedBy":"vai-add-product"},"GWE38":{"name":"Giá treo quần âu đơn cân Garis GWE38","description":"Giá treo quần âu đơn cân GW38E Thiết kế cân đối, bền đẹp, tối ưu hóa không gian tủ. Dễ lắp đặt, giữ quần âu phẳng phiu và ngăn nắp!","priceNum":2484000,"listPn":2484000,"salePn":2484000,"priceMode":"list","image":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C6%A1n%20c%C3%A2n%20GW38E.jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C6%A1n%20c%C3%A2n%20GW38E.jpg"],"specs":{},"features":["Màu xanh Emerald, tạo nên vẻ đẹp và sự tươi mới cho không gian treo quần áo. Màu sắc này cũng tạo điểm nhấn và sự phong cách cho sản phẩm."],"model":"GWE38","brand":"Garis","category":"Giá treo quần âu đơn cân ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gwe38-gia-treo-quan-au-don-can-garis-gwe38","_addedBy":"vai-add-product"},"1054HVOW":{"name":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW - giá tốt, mua trả chậm","description":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW giá rẻ chính hãng, mua trả chậm 0% lãi suất, bảo hành chính hãng - Giao hàng tận nơi, lắp đặt nhanh chóng, khuyến mãi hấp dẫn tại Điện máy XANH!","priceNum":7170000,"listPn":9290000,"salePn":7170000,"priceMode":"both","image":"https://cdn.tgdd.vn/2026/09/timerseo/357869.jpg","images":["https://cdn.tgdd.vn/2026/09/timerseo/357869.jpg"],"specs":{},"features":[],"model":"1054HVOW","brand":"Siêu thị Điện Máy XANH","category":"Máy giặt / sấy","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"1054hvow-may-giat-hitachi-inverter-10-5-kg-bd-1054hvow-gia-tot-mua-tra-cham","_addedBy":"vai-add-product"},"GW0470":{"name":"Giá treo quần âu đa năng kết hợp khay đựng đồ Garis GW0470","description":"Giá treo quần âu đa năng GW04 – Thiết kế linh hoạt, chất liệu bền đẹp, phù hợp cho mọi không gian tủ quần áo. Giúp quần âu luôn thẳng phẳng và ngăn nắp.","priceNum":4730400,"listPn":4730400,"salePn":4730400,"priceMode":"list","image":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91a%20n%C4%83ng%20GW04%201.jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91a%20n%C4%83ng%20GW04%201.jpg"],"specs":{"Chất liệu":": Khung bằng thép sơn tĩnh điện, nan bằng thép phủ nano","Tải trọng":": 30kg","Màu sắc":": Trắng","Bảo hành":": 24 tháng"},"features":[],"model":"GW0470","brand":"Garis","category":"Giá treo quần âu đa năng","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gw0470-gia-treo-quan-au-da-nang-ket-hop-khay-dung-do-garis-gw0470","_addedBy":"vai-add-product"},"XL.90S2":{"name":"GIÁ BÁT NÂNG HẠ NAN DẸT XL.90S2","description":"ĐẶC TÍNH SẢN PHẨM \nGiá bát đĩa nâng hạ 2 tầng nan Dẹt SUS304\nBề mặt điện hóa xước mờ\nKhung chính bằng Thép Carbon sơn nhiệt màu xám đậm\nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợp\nvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval bằng INOX SUS 304\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT NÂNG HẠ NAN DẸT XL.90S2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":10890000,"listPn":0,"salePn":10890000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2026/09/XL.60.70.80.90S1_2-02.jpg","images":["https://grandx.com.vn/wp-content/uploads/2026/09/XL.60.70.80.90S1_2-02.jpg"],"specs":{"Mã sản phẩm":"XL.90S2","Chất liệu rổ":"SUS304","Chất liệu khung":"Inox 304","Kích thước sản phẩm":"R864*S280*C550","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["ĐẶC TÍNH SẢN PHẨM","Giá bát đĩa nâng hạ 2 tầng nan Dẹt SUS304","Bề mặt điện hóa xước mờ","Khung chính bằng Thép Carbon sơn nhiệt màu xám đậm","Điều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợp","với nhu cầu sử dụng thực tế","2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh","Ống tay cầm hình oval bằng INOX SUS 304","THÔNG SỐ SẢN PHẨM","Mở rộng"],"model":"XL.90S2","brand":"GrandX","category":"Phụ kiện tủ bếp trên","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xl-90s2-gia-bat-nang-ha-nan-det-xl-90s2","_addedBy":"vai-add-product"},"XS.40S2":{"name":"GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S2 - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\n","priceNum":3950000,"listPn":0,"salePn":3950000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2025/01/XS.25S.40S2.png","images":["https://grandx.com.vn/wp-content/uploads/2025/01/XS.25S.40S2.png"],"specs":{"Mã sản phẩm":"XS.40S2","Chất liệu rổ":"SUS304","Chất liệu khung":"INOX 304","Kích thước sản phẩm (mm)":"R335*S485*C450","Chiều rộng tủ (mm)":"400"},"features":["ĐẶC TÍNH SẢN PHẨM","Giá đựng chai lọ gia vị nan dẹt","Chất liệu SUS304","Bề mặt hoàn thiện điện hóa xước mờ","Dùng cho cánh kéo","Hệ chuyển động sử dụng bộ ray âm","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"model":"XS.40S2","brand":"GrandX","category":"Giá dao thớt, gia vị","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xs-40s2-gia-dung-chai-lo-gia-vi-nan-det-xs-40s2-grandx","_addedBy":"vai-add-product"},"XS.40S1":{"name":"GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S1 - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":3630000,"listPn":0,"salePn":3630000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XS.25S.40S2-PHOI-CANH.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XS.25S.40S2-PHOI-CANH.png"],"specs":{"Mã sản phẩm":"XS.40S1","Chất liệu rổ":"SUS304","Chất liệu khung":"Thép Carbon sơn nhiệt","Kích thước sản phẩm (mm)":"R335*S485*C450","Chiều rộng tủ (mm)":"400"},"features":["ĐẶC TÍNH SẢN PHẨM","Giá đựng chai lọ gia vị nan dẹt","Chất liệu SUS304","Bề mặt hoàn thiện điện hóa xước mờ","Dùng cho cánh kéo","Hệ chuyển động sử dụng bộ ray âm","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"model":"XS.40S1","brand":"GrandX","category":"Giá dao thớt, gia vị","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xs-40s1-gia-dung-chai-lo-gia-vi-nan-det-xs-40s1-grandx","_addedBy":"vai-add-product"},"XS.40T":{"name":"GIÁ GIA VỊ TITANIUM XS.40T - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị Grand X với ngăn kéo thu gọn trong hộc tủ, tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng nhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ TITANIUM XS.40T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":6680000,"listPn":0,"salePn":6680000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-copy.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-copy.png"],"specs":{},"features":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"model":"XS.40T","brand":"GrandX","category":"Giá dao thớt, gia vị","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xs-40t-gia-gia-vi-titanium-xs-40t-grandx","_addedBy":"vai-add-product"},"SUS304":{"name":"GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2 - Grandx","description":"Đặc tính sản phẩm \nGiá bát đĩa nâng hạ 2 tầng nan Oval SUS304\nBề mặt điện hóa xước mờ \nKhung chính bằng INOX SUS304 màu xám đậm \nĐiều chỉnh trợ lực \nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval nâng bằng INOX SUS 304 \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":11100000,"listPn":0,"salePn":11100000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg"],"specs":{"Mã sản phẩm":"XL.90M2","Chất liệu rổ":"SUS304","Chất liệu khung":"INOX 304","Kích thước sản phẩm (mm)":"R864*S280*C550","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["Đặc tính sản phẩm","Giá bát đĩa nâng hạ 2 tầng nan Oval SUS304","Bề mặt điện hóa xước mờ","Khung chính bằng INOX SUS304 màu xám đậm","Điều chỉnh trợ lực","Điều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế","2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh","Ống tay cầm hình oval nâng bằng INOX SUS 304","THÔNG SỐ SẢN PHẨM","Mở rộng"],"model":"SUS304","brand":"GrandX","category":"Phụ kiện tủ bếp trên","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"sus304-gia-bat-dia-nang-ha-nan-oval-sus304-xl-90m2-grandx","_addedBy":"vai-add-product"},"XK.40M2":{"name":"GIÁ DAO THỚT GIA VỊ NAN OVAL XK.40M2 - Grandx","description":"Đặc tính sản phẩm \nGiá dao thớt gia vị nan Oval\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho tủ cánh kéo \nTính năng đột phá \nTích hợp giỏ đựng thìa, dĩa\nKhay đựng nước nhựa cao cấp ABS có viền nhôm 2 mặt chống cong vênh\nHệ chuyển động sử dụng bộ ray âm hoạt động ổn định, độ bền cao \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ DAO THỚT GIA VỊ NAN OVAL XK.40M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":5230000,"listPn":0,"salePn":5230000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-5-2.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-5-2.png"],"specs":{"Mã sản phẩm":"XK.40M2","Chất liệu rổ":"SUS304 Oval","Chất liệu khung":"INOX 304 sơn nhiệt","Kích thước sản phẩm (mm)":"R357*S438*C506","Chiều rộng tủ (mm)":"400mm"},"features":["Tích hợp giỏ đựng thìa, dĩa Khay đựng nước nhựa cao cấp ABS có viền nhôm 2 mặt chống cong vênh Hệ chuyển động sử dụng bộ ray âm hoạt động ổn định, độ bền cao"],"model":"XK.40M2","brand":"GrandX","category":"Giá dao thớt, gia vị","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xk-40m2-gia-dao-thot-gia-vi-nan-oval-xk-40m2-grandx","_addedBy":"vai-add-product"},"SMI6ZCS16E":{"name":"MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E","description":"Trang chủ / Sản phẩm / MÁY RỬA CHÉN BOSCH / MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E \nChi tiết sản phẩm\nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E\n33,300,000 ₫ 26,590,000 ₫ \r\nLượt xem : 5154 \r\nMáy Rửa Chén Bosch SMI6ZCS16E- Nhập Khẩu Đức – Bảo Hành 3 Năm\nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E số lượng \nMua hàng \nDanh mục: MÁY RỬA CHÉN BOSCH \nTừ khóa: bosch SMI6ZCS16E , máy rửa chén bosch , SMI6ZCS16E \nMô tả \nĐánh giá \nMô tả\nMáy Rửa Chén Bosch SMI6ZCS16E \n* THÔNG TIN KỸ THUẬT: \nMáy rửa bát Bosch SMI6ZCS16E có xuất xứ từ Châu Âu, mang đến bước đột phá cho người dùng những trải nghiệm hoàn toàn mới. Máy được trang bị nhiều công nghệ hiện đại như Sấy Zeolite® (Zeolith) – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo. \nGiàn Max Flex: tải máy rửa chén linh hoạt và thoải mái, có bánh xe chạy êm. \nNgăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn. \nGiá đỡ 3 tầng: Chiều cao có thể điều chỉnh theo 3 mức lên đến 5 cm, ngay cả khi giàn phía trên đã được chất đầy đồ. \nSilence Pro: máy rửa chén cực kỳ yên tĩnh (40 decibel). \nChương trình im lặng: Với chương trình này, tiếng ồn khi vận hành máy rửa chén của bạn sẽ tự động giảm xuống mức độ ồn thấp nhất. \nNgoại hình và thiết kế \nMáy rửa bát Bosch SMI6ZCS16E có thiết kế bán âm, được làm từ chất liệu thép không gỉ, bạn cần ốp thêm tấm gỗ vào mặt trước của máy cho đồng bộ với hệ tủ giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn \nBảng điều khiển của Máy rửa bát Bosch SMI6ZCS16E được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng. \n2 Giàn rửa + 1 ngăn kéo: Hệ thống giàn rửa của Máy rửa bát Bosch SMI6ZCS16E gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn. Máy có sức chứa lên tới 14 bộ chén bát, phù hợp cho gia đình từ 4-6 thành viên. \nKích thước thiết bị: Máy rửa bát Bosch SMI6ZCS16E có kích thước Cao 815-875 x Rộng 598 x Sâu 573 mm với trọng lượng 47 kg. \nKích thước lắp đặt: Cao 815-875 x Rộng 600 x Sâu min 550 mm. \nTính năng và công nghệ \n8 Chương trình rửa \nTùy vào số lượng, chất liệu và độ bẩn của bát đĩa mà người dùng lựa chọn chương trình rửa phù hợp để tối ưu hiệu quả rửa và sấy. Máy rửa bát Bosch SMI6ZCS16E được trang bị 8 chương trình rửa đa dạng: \nRửa tiết kiệm 50°C (Eco) \nRửa tự động 45 – 65°C (Auto 45 – 65°C) \nRửa thông minh (Intelligence) \nRửa chuyên sâu 70°C (Intensive) \nRửa nhanh 60°C (Express) \nRửa ly 40°C  \nRửa yên tĩnh 50°C \nRửa yêu thích/ Rửa tráng (Favourite) \nChương trình rửa đặc biệt: \nRửa nhanh tăng cường (SpeedPerfect Plus) \nSấy tăng cường (ExtraDry) \nĐiều khiển từ xa (Home Connect) \nRửa tăng cường giàn dưới cùng (IntensizeZone) \nZeolith \nVới Công nghệ sấy Zeolith trên Máy rửa bát Bosch SMI6ZCS16E giúp bát đĩa khô hoàn hảo hơn. Đây là một khoáng chất tự nhiên có tác dụng hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm. Quá trình hút hơi ẩm này được lặp đi lặp lại nhiều lần cho đến khi kết thúc quá trình rửa. Nhờ công nghệ Zeolith mà bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn. Bởi sấy Zeolith không sử dụng điện năng để sấy khô. \nFavourite / Rửa tráng \nTính năng Favourite giúp quá trình rửa và sấy bát đĩa trở nên dễ dàng hơn. Đồng thời tận dụng tối đa công dụng mà máy rửa bát mang lại. \nMặc định, chương trình Favourite sẽ là tính năng rửa tráng bát đĩa (PreWash). Khi tùy chọn Favourite, người dùng có thể kết hợp một chương trình cơ bản với một tính năng đặc biệt mà bạn yêu thích. Chẳng hạn như bạn kết hợp rửa Eco 50 độ với sấy hé cửa hiệu quả EfficientDry. Sau đó, bạn có thể lưu lại chương trình kết hợp này bằng cách nhấn giữ nút Favourite trong vòng 3 giây. Và khi cần sử dụng tính năng kết hợp này, người dùng chỉ việc kích hoạt Favourite với một lần chạm để bắt đầu. \nNgoài ra, người dùng cũng có thể tự thiết lập chương trình Favourite ngay trên ứng dụng Home Connect. \nExtra Clean Zone \nMáy rửa bát Bosch SMI6ZCS16E được trang bị hệ thống vòi phun Extra Clean Zone. Đây là hệ thống vòi phun thủy lực giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa. Người dùng cũng có thể chủ động bật tắt thông qua công tắc ON/OFF ngay trên hệ thống. \nMachine Care \nDầu mỡ và các cặn bẩn thức ăn có thể làm tăng sự phát triển của mùi hôi và các loại vi khuẩn, nấm mốc bám bên trong khoang máy. Điều này gây ảnh hưởng không nhỏ đến kết quả làm sạch bát đĩa của máy và sức khỏe con người. Vì vậy, người dùng nên có thói quen thường xuyên vệ sinh máy rửa bát theo định kỳ. \nMachine Care là chương trình vệ sinh tự động buồng máy rửa bát. Khi kích hoạt, tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo. \nChương trình này được sử dụng bằng cách cho chạy không tải (Không bát đĩa, đũa muỗng, thìa dĩa,…) kết hợp với chất tẩy rửa vệ sinh máy đặc biệt. Người dùng chỉ việc kích hoạt Machine Care và chọn Start để bắt đầu mà không cần kết hợp với chương trình nào khác. Thời lượng của tính năng Machine Care là 135 phút. \nNgoài ra, sau 30 chu kỳ rửa, Machine Care sẽ nhắc nhở bạn vệ sinh máy. Hoặc nếu thiết bị không nhắc nhở, chúng tôi khuyên bạn nên thực hiện vệ sinh khoang máy theo định kỳ (sau 30 lần rửa). \nChức năng an toàn \nMáy rửa bát Bosch SMI6ZCS16E được trang bị các tính năng và hệ thống bảo vệ an toàn cho người sử dụng: \nKhóa trẻ em (ChildLock): là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển. \nHệ thống AquaStop: là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài. \nHệ thống chống sét lan truyền: là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan. \nSản phẩm tương tự \nGiảm giá! \nMÁY RỬA CHÉN ĐỂ BÀN BOSCH SKS62E32EU\n21,400,000 ₫ 15,890,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ĐỘC LẬP BOSCH SMS6ZCI00P\n30,790,000 ₫ 24,790,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMV4HCX48E\n30,390,000 ₫ 24,190,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN BOSCH SMS4HMC25M\n27,990,000 ₫ 18,690,000 ₫ \r\nMua hàng","priceNum":24500000,"listPn":46750000,"salePn":24500000,"priceMode":"both","image":"https://boschs.com.vn/wp-content/uploads/2025/02/fef-Sao-chep.jpg","images":["https://boschs.com.vn/wp-content/uploads/2025/02/fef-Sao-chep.jpg"],"specs":{"Lượt xem":"5154"},"features":["Giàn Max Flex: tải máy rửa chén linh hoạt và thoải mái, có bánh xe chạy êm.","Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn.","Giá đỡ 3 tầng: Chiều cao có thể điều chỉnh theo 3 mức lên đến 5 cm, ngay cả khi giàn phía trên đã được chất đầy đồ.","Silence Pro: máy rửa chén cực kỳ yên tĩnh (40 decibel).","Chương trình im lặng: Với chương trình này, tiếng ồn khi vận hành máy rửa chén của bạn sẽ tự động giảm xuống mức độ ồn thấp nhất."],"model":"SMI6ZCS16E","brand":"BOSCH","category":"Máy rửa chén","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"smi6zcs16e-may-rua-chen-am-tu-bosch-smi6zcs16e","_addedBy":"vai-add-product"},"KR14L":{"name":"THÙNG RÁC TRÒN EUROKING KR.14L","description":"Mã sản phẩm: KR.14L Hãng sản xuất: EUROKING Loại: Thùng rác","priceNum":1100000,"listPn":0,"salePn":1100000,"priceMode":"both","image":"http://ahabep.com/upload/images/thung-rac-tron-euroking-kr-14l.png","images":["http://ahabep.com/upload/images/thung-rac-tron-euroking-kr-14l.png"],"specs":{"THÔNG SỐ SẢN PHẨM VÀ KÍCH THƯỚC LẮP ĐẶT Kích thước sản phẩm":"14 lít W370*D330*H400"},"features":[],"model":"KR14L","brand":"EUROKING","category":"THÙNG ĐỰNG RÁC NHÀ BẾP","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"kr14l-thung-rac-tron-euroking-kr-14l","_addedBy":"vai-add-product"},"XD.80T":{"name":"GIÁ BÁT ĐĨA TITANIUM XD.90T - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng bát đĩa, với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc lưu trữ tối ưu hóa vật liệu, kết cấu và công năng , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc …đáy phủ lớp chống trượt chống va đập đồ. \nGiá bát đĩa GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \n","priceNum":9300000,"listPn":0,"salePn":9300000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png"],"specs":{"Mã sản phẩm":"XD.80T","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R864*S470*C226","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"model":"XD.80T","brand":"GrandX","category":"Giá bát đĩa, Xoong nồi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xd-80t-gia-bat-dia-titanium-xd-90t-grandx","_addedBy":"vai-add-product"},"XPR.450S1":{"name":"Tủ đồ khô cánh mở GrandX XPR.450S","description":"Tủ đồ khô cánh mở XPR.450S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.450S1 \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.450S1 được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.450S1 còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.450S1 nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 415mm , dành riêng cho các khoang tủ rộng 450mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.450S1 được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.450S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.450S1 chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\n","priceNum":13120000,"listPn":0,"salePn":13120000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg","images":["https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg"],"specs":{"Mã sản phẩm":"XPR.450S1","Chất liệu":"INOX SUS 304","Kích thước sản phẩm (mm)":"R385*S500*C(1650-1950)","Kích thước lọt lòng tủ (mm)":"≥ 415","Chiều rộng tủ (mm)":"450","Số tầng rổ":"6 tầng","Tải trọng mỗi tầng":"Tối đa 5kg"},"features":["Khả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.","Bề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.","Khung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp."],"model":"XPR.450S1","brand":"GrandX","category":"Tủ đồ khô","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xpr-450s1-tu-do-kho-canh-mo-grandx-xpr-450s","_addedBy":"vai-add-product"},"XR.G302B":{"name":"THÙNG GẠO MẶT KÍNH NÚT NHẤN XR.G302B - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nThùng gạo mặt kính cường lực cao cấp \nChất liệu vỏ thùng đựng gạo INOX cao cấp \nĐạt các tiêu chuẩn vệ sinh an toàn cho sức khỏe được kiểm tra chứng nhận bởi FDA \nMặt trước kính cường lực \nNhấn nút để lấy gạo dễ dàng \nDung tích chứa tối đa: 25kg \nLắp đặt âm tủ \nKích thước sản phẩm R300*S405*C650 mm \nKích thước khoét âm tủ R264*S410*C630 mm \n","priceNum":2920000,"listPn":0,"salePn":2920000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XR.G302B-1024x683.jpg","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XR.G302B-1024x683.jpg"],"specs":{"Mã sản phẩm":"XR.G302B","Chất liệu":"SUS304 + Kính","Đặc tính sản phẩm":"Màu đen","Kích thước sản phẩm (mm)":"R300*S396*C650","Chiều rộng tủ (mm)":"300","Đơn vị":"Bộ"},"features":["ĐẶC TÍNH SẢN PHẨM","Thùng gạo mặt kính cường lực cao cấp","Chất liệu vỏ thùng đựng gạo INOX cao cấp","Đạt các tiêu chuẩn vệ sinh an toàn cho sức khỏe được kiểm tra chứng nhận bởi FDA","Mặt trước kính cường lực","Nhấn nút để lấy gạo dễ dàng","Dung tích chứa tối đa: 25kg","Lắp đặt âm tủ","Kích thước sản phẩm R300*S405*C650 mm","Kích thước khoét âm tủ R264*S410*C630 mm"],"model":"XR.G302B","brand":"GrandX","category":"Thùng gạo","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xr-g302b-thung-gao-mat-kinh-nut-nhan-xr-g302b-grandx","_addedBy":"vai-add-product"},"XL90M2":{"name":"GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2 - Grandx","description":"Đặc tính sản phẩm \nGiá bát đĩa nâng hạ 2 tầng nan Oval SUS304\nBề mặt điện hóa xước mờ \nKhung chính bằng INOX SUS304 màu xám đậm \nĐiều chỉnh trợ lực \nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval nâng bằng INOX SUS 304 \n","priceNum":11100000,"listPn":0,"salePn":11100000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg"],"specs":{"Mã sản phẩm":"XL.90M2","Chất liệu rổ":"SUS304","Chất liệu khung":"INOX 304","Kích thước sản phẩm (mm)":"R864*S280*C550","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["Đặc tính sản phẩm","Giá bát đĩa nâng hạ 2 tầng nan Oval SUS304","Bề mặt điện hóa xước mờ","Khung chính bằng INOX SUS304 màu xám đậm","Điều chỉnh trợ lực","Điều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế","2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh","Ống tay cầm hình oval nâng bằng INOX SUS 304","THÔNG SỐ SẢN PHẨM","Mở rộng"],"model":"XL90M2","brand":"GrandX","category":"Phụ kiện tủ bếp trên","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xl90m2-gia-bat-dia-nang-ha-nan-oval-sus304-xl-90m2-grandx","_addedBy":"vai-add-product"},"C1830":{"name":"C1830 | Grob | Kệ Đựng Dao Thớt Nan Vuông Inox Xước Mờ Sus304 - cánh/phủ bì 183mm, lọt lòng 165mm","priceNum":3270000,"description":"KỆ ĐỰNG DAO THỚT NAN VUÔNG INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"165*500*530 mm","Kích thước cánh/phủ bì":"183 mm","Khoang tủ/chiều rộng tủ":"183 mm","Kích thước lọt lòng/thực tế phụ kiện":"183 mm","Quy cách (Rộng x Sâu x Cao)":"R165 * S500 * C530 mm","kich_thuoc":"265 x 500 x 530mm","khoang_tu":"300mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p80.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p80.jpg"},"C1830B":{"name":"C1830B | Grob | Kệ Đựng Gia Vị Nan Vuông Inox Xước Mờ Sus304 - cánh/phủ bì 183mm, lọt lòng 165mm","priceNum":3270000,"description":"KỆ ĐỰNG GIA VỊ NAN VUÔNG INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"165*500*530 mm","Kích thước cánh/phủ bì":"183 mm","Khoang tủ/chiều rộng tủ":"183 mm","Kích thước lọt lòng/thực tế phụ kiện":"183 mm","Quy cách (Rộng x Sâu x Cao)":"R165 * S500 * C530 mm","kich_thuoc":"265 x 500 x 530mm","khoang_tu":"300mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p81.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p81.jpg"},"C1MO40":{"name":"C1MO40 | Grob | Kệ Đựng Dao Thớt Mix Oval Inox Sus304 Xước Mờ - cánh/phủ bì 400mm, lọt lòng 365mm","priceNum":4043000,"description":"KỆ ĐỰNG DAO THỚT MIX OVAL INOX SUS304 XƯỚC MỜ","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"365*500*530 mm","Kích thước cánh/phủ bì":"400 mm","Khoang tủ/chiều rộng tủ":"400 mm","Kích thước lọt lòng/thực tế phụ kiện":"400 mm","Quy cách (Rộng x Sâu x Cao)":"R365 * S500 * C530 mm","kich_thuoc":"365 x 500 x 530mm","khoang_tu":"400mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p45.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p45.jpg"},"GW30AR":{"name":"Thanh suốt treo quần áo, hợp kim nhôm Garis GW30AR","description":"Bộ giá treo quần áo cố định GW30.AR – Kiểu dáng chắc chắn, chất liệu cao cấp, tối ưu không gian lưu trữ. Giải pháp tiện lợi cho tủ quần áo hiện đại.","priceNum":939600,"listPn":0,"salePn":939600,"priceMode":"both","image":"https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg","images":["https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg"],"specs":{},"features":[],"model":"GW30AR","brand":"Garis","category":"Bộ giá treo quần áo cố định","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gw30ar-thanh-suot-treo-quan-ao-hop-kim-nhom-garis-gw30ar","_addedBy":"vai-add-product"},"GW30BR":{"name":"Bass suốt treo quần áo, hợp kim nhôm Garis GW30BR","description":"Bộ giá treo quần áo cố định GW30.BR – Kiểu dáng chắc chắn, chất liệu cao cấp, tối ưu không gian lưu trữ. Giải pháp tiện lợi cho tủ quần áo hiện đại.","priceNum":248400,"listPn":0,"salePn":248400,"priceMode":"both","image":"https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg","images":["https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg"],"specs":{},"features":[],"model":"GW30BR","brand":"Thanh suốt treo quần áo, hợp kim nhôm GW30AR/GW30BR","category":"Garis","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gw30br-bass-suot-treo-quan-ao-hop-kim-nhom-garis-gw30br","_addedBy":"vai-add-product"},"EL909AG":{"name":"Khóa cửa nhôm Demax EL909AG CNC FACE ID REMOTE APP WIFI","description":"Kích thước khóa: 38x420mm Độ dày cửa: 40~80mm Độ rộng đố cửa: >60mm","priceNum":19800000,"listPn":0,"salePn":19800000,"priceMode":"both","image":"https://bepviet.vn/media/product/10316_909111.png","images":["https://bepviet.vn/media/product/10316_909111.png"],"specs":{"Mã bảo vệ":"[Đổi mã khác]"},"features":[],"model":"EL909AG","brand":"Demax","category":"Khóa cửa nhôm Demax EL909AG CNC FACE ID REMOTE APP WIFI","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"el909ag-khoa-cua-nhom-demax-el909ag-cnc-face-id-remote-app-wifi","_addedBy":"vai-add-product"},"ELG908":{"name":"Khóa cửa cổng sắt chống nước Demax ELG908 AC/GB IP56 APP REMOTE","description":"Khóa cửa cổng sắt chống nước Demax ELG908 AC/GB IP66 APP REMOTE là dòng khóa thông minh cao cấp chuyên dụng cho cửa cổng, nổi bật với khả năng chống nước – chống bụi vượt trội cùng công nghệ mở khóa đa dạng như nhận diện khuôn mặt 3D, tĩnh mạch lòng bàn tay và điều khiển từ xa. Sản phẩm mang đến giải pháp an ninh hiện đại, tiện nghi cho nhà phố, biệt thự và khu vực ngoài trời.\nĐặc điểm nổi bật \nVật liệu cao cấp \nKhóa được chế tạo từ hợp kim nhôm đúc nguyên khối phay CNC chắc chắn, tăng độ bền và khả năng chịu lực\nBảng điều khiển kính cường lực chống trầy xước, chống ố vàng, đảm bảo tính thẩm mỹ lâu dài\nThân khóa thép không gỉ SUS 304 chống ăn mòn, phù hợp môi trường ngoài trời\nThiết kế chuyên dụng cho cửa cổng \nThiết kế chắc chắn, phù hợp lắp đặt cho cửa sắt, cổng ngoài trời\nKiểu dáng hiện đại, màu đen sang trọng, nâng tầm không gian sống\nTính năng mở khóa đa dạng \nMở khóa bằng nhận diện khuôn mặt FACE ID 3D\nMở khóa bằng tĩnh mạch lòng bàn tay\nMở khóa từ xa qua App Wi-Fi (Tuya)\nMở khóa bằng NFC từ smartphone (tùy chọn)\nMở khóa bằng vân tay\nMở khóa bằng thẻ từ\nMở khóa bằng mật mã\nChìa khóa cơ chống sao chép\nMở khóa bằng remote điều khiển từ xa\nChức năng thông minh và an toàn \nChống nước, chống bụi tiêu chuẩn IP66, hoạt động ổn định ngoài trời\nCảnh báo đột nhập, nhắc nhở pin yếu\nVô hiệu hóa thẻ bị mất giúp tăng cường bảo mật\nChế độ thông phòng linh hoạt\nHỗ trợ tự động khóa (Auto Lock)\nCông nghệ sinh trắc học FPC Thụy Điển cho độ chính xác cao\nDung lượng và vận hành \nLưu trữ tối đa 50 khuôn mặt và 50 tĩnh mạch lòng bàn tay\nLưu trữ 100 vân tay và 200 thẻ từ\nThẻ từ kèm theo 2 chiếc, chìa khóa cơ 2 chiếc, remote 2 chiếc\nMật mã động 10 chữ số tăng cường bảo mật\nĐộng cơ DC siêu nhỏ giúp vận hành êm ái, ổn định\nHoạt động tốt trong môi trường từ -20°C đến 60°C\nĐộ ẩm phù hợp từ 15% đến 90%\nThông số kỹ thuật \nKích thước khóa ngoài: 61 x 197 mm\nKích thước khóa trong: 145 x 105 mm\nNguồn cung cấp: Pin sạc Lithium 7.4V – 3200 mAh\nThời gian sử dụng: 3 – 6 tháng/lần sạc\nNguồn điện khẩn cấp: Cổng USB Type-C\nĐộ dày cửa: 40 – 80 mm\nĐộ rộng đố cửa: > 80 mm\nMàu hoàn thiện: Đen\nXuất xứ: Malaysia\nBảo hành: 3 năm","priceNum":15680000,"listPn":0,"salePn":15680000,"priceMode":"both","image":"https://b1.congngheviet.com.vn/file/s2-hc08/khoadientunhapkhau-com-vn/wp-content/uploads/2026/04/image_1775631075773.jpg","images":["https://b1.congngheviet.com.vn/file/s2-hc08/khoadientunhapkhau-com-vn/wp-content/uploads/2026/04/image_1775631075773.jpg"],"specs":{"Bảo hành":"3 năm"},"features":["Malaysia","Chưa có đánh giá nào."],"model":"ELG908","brand":"Demax","category":"Khóa cổng","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"elg908-khoa-cua-cong-sat-chong-nuoc-demax-elg908-ac-gb-ip56-app-remote","_addedBy":"vai-add-product"},"C112660":{"name":"C112660 | Grob | Tủ đồ khô - cánh/phủ bì 112mm, lọt lòng 564mm","priceNum":13200000,"description":"KỆ ĐỰNG TỦ ĐỒ KHÔ NAN DẸT, ĐÁY OVAL, INOX XƯỚC MỜ SUS304\nKÍCH THƯỚC LĐ KHOANG TỦ\n**GC304-645, GC304-260 Nan dẹt, đáy inox sợi tròn\n**Chú ý: Nên sử dụng bản lề thẳng và bản lề cong 1/2 cho cánh tủ","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 12 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"564*535*(600-750) mm","Kích thước cánh/phủ bì":"112 mm","Khoang tủ/chiều rộng tủ":"112 mm","Kích thước lọt lòng/thực tế phụ kiện":"112 mm","Quy cách (Rộng x Sâu x Cao)":"R564 * S535 * C600 mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p84.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p84.jpg"},"C112190F":{"name":"C112190F | Grob | Giá Bát Nâng Hạ Nan Dẹt Inox Mờ Full Sus304 - cánh/phủ bì 112mm, lọt lòng 865mm","priceNum":12826000,"description":"GIÁ BÁT NÂNG HẠ NAN DẸT INOX MỜ FULL SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"865*300*650 mm","Kích thước cánh/phủ bì":"112 mm","Khoang tủ/chiều rộng tủ":"112 mm","Kích thước lọt lòng/thực tế phụ kiện":"112 mm","Quy cách (Rộng x Sâu x Cao)":"R865 * S300 * C650 mm","kich_thuoc":"865 x 300 x 650mm","khoang_tu":"900mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p96.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p96.jpg"},"GT145A":{"name":"GT145A | Grob | Khay chia thìa dĩa inox - cánh/phủ bì 145mm","priceNum":1555000,"description":"Khay chia thìa dĩa inox Grob GT-145A\nThông số:\n• Xuất xứ: Trung Quốc\n• Thương hiệu: Grob\n• Bảo hành: 24 tháng","specs":{"Xuất xứ":"Trung Quốc","Thương hiệu":"Grob","Bảo hành":"24 tháng","Kích thước cánh/phủ bì":"145 mm","Khoang tủ/chiều rộng tủ":"145 mm","kich_thuoc":"516 x 472 x 64mm","khoang_tu":"500mm","Kích thước lọt lòng/thực tế phụ kiện":"145 mm"},"features":[],"images":["https://thuanphathome.vn/uploads/grob/khay-chia-thia-dia/GT145A/GT-145A.slide.jpg"],"image":"https://thuanphathome.vn/uploads/grob/khay-chia-thia-dia/GT145A/GT-145A.slide.jpg"},"XPR.600S1":{"name":"Tủ đồ khô cánh mở GrandX XPR.600S","description":"Tủ đồ khô cánh mở XPR.600S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.600S \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.600S được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.600S còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.600S nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 564 mm , dành riêng cho các khoang tủ rộng 600mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.600S được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.600S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.600S chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “TỦ ĐỒ KHÔ CÁNH MỞ XPR.600S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":14850000,"listPn":0,"salePn":14850000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg","images":["https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg"],"specs":{"Mã sản phẩm":"XPR.600S1","Chất liệu":"INOX SUS 304","Kích thước sản phẩm (mm)":"R530*S500*C(1650-1950)","Kích thước lọt lòng tủ (mm)":"≥ 564","Chiều rộng tủ (mm)":"600","Số tầng rổ":"6 tầng","Tải trọng mỗi tầng":"Tối đa 5kg"},"features":["Khả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.","Bề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.","Khung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp."],"model":"XPR.600S1","brand":"GrandX","category":"Tủ đồ khô","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xpr-600s1-tu-do-kho-canh-mo-grandx-xpr-600s","_addedBy":"vai-add-product"},"XC27080S1":{"name":"MÂM XOAY 3/4 -270° XC.270.80S1 - Grandx","description":"Đặc tính sản phẩm \nKệ góc mâm xoay góc mở 3/4 -270° \nChất liệu SUS304 nan dẹt\nBề mặt hoàn thiện điện hóa xước mờ \nKhung thép Carbon sơn nhiệt\nHệ chuyển động trục nhẹ nhàng êm ái\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “MÂM XOAY 3/4 -270° XC.270.80S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":3810000,"listPn":0,"salePn":3810000,"priceMode":"sale","image":"https://grandx.com.vn/wp-content/uploads/2025/03/XC.270.80S.png","images":["https://grandx.com.vn/wp-content/uploads/2025/03/XC.270.80S.png"],"specs":{"Tên sản phẩm":"Mâm xoay 3/4 -270° XC.270.80S1","Kích thước sản phẩm":"R710*S800-900*C(600-800)","Đơn vị":"Bộ","Chiều rộng tủ":"800","Khoảng mở cánh":"≥ 370mm","Chiều sâu tủ":"≥530mm","Chiều cao":"620-800mm","Lưu ý":"Để thuận tện cho việc sử dụng quý khách nên thiết kế khoảng hở chiều rộng cánh ≥ 400mm"},"features":["Đặc tính sản phẩm","Kệ góc mâm xoay góc mở 3/4 -270°","Chất liệu SUS304 nan dẹt","Bề mặt hoàn thiện điện hóa xước mờ","Khung thép Carbon sơn nhiệt","Hệ chuyển động trục nhẹ nhàng êm ái","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"model":"XC27080S1","brand":"GrandX","category":"Kệ góc, mâm xoay liên hoàn","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xc27080s1-mam-xoay-3-4-270-xc-270-80s1-grandx","_addedBy":"vai-add-product"},"XS.40MT":{"name":"GIÁ GIA VỊ 3 TẦNG ĐỘC LẬP TITANIUM XS.40MT - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị 3 tầng Grand X với 02 ngăn kéo trên thu gọn trong hộc tủ treo vào tủ độc lập tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng\nnhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nNgăn kéo dưới cùng hỗ trợ lưu trữ được hầu hết các loại gia vị và chai lọ giúp ngăn nắp, gọn gàng cho không gian bếp \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp\ncho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ 3 TẦNG ĐỘC LẬP TITANIUM XS.40MT” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":11130000,"listPn":0,"salePn":11130000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XS.40MT-1024x683.jpg","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XS.40MT-1024x683.jpg"],"specs":{"Mã sản phẩm":"XS.40MT","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R364*S447*C548","Kích thước lọt lòng tủ (mm)":"364","Chiều rộng tủ (mm)":"400"},"features":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"model":"XS.40MT","brand":"GrandX","category":"Giá dao thớt, gia vị","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xs-40mt-gia-gia-vi-3-tang-doc-lap-titanium-xs-40mt-grandx","_addedBy":"vai-add-product"},"XD.90T":{"name":"GIÁ BÁT ĐĨA TITANIUM XD.90T - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng bát đĩa, với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc lưu trữ tối ưu hóa vật liệu, kết cấu và công năng , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc …đáy phủ lớp chống trượt chống va đập đồ. \nGiá bát đĩa GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT ĐĨA TITANIUM XD.90T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":9300000,"listPn":0,"salePn":9300000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png"],"specs":{"Mã sản phẩm":"XD.90T","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R864*S470*C226","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"model":"XD.90T","brand":"GrandX","category":"Giá bát đĩa, Xoong nồi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xd-90t-gia-bat-dia-titanium-xd-90t-grandx","_addedBy":"vai-add-product"},"XP.90T":{"name":"GIÁ XOONG NỒI TITANIUM XP.90T - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng xoong nồi với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc tối ưu hóa vật liệu, kết cấu và công năng lưu trữ , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc … đáy phủ lớp chống trượt chống va đập đồ. \nGiá xoong nồi GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ XOONG NỒI TITANIUM XP.90T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":6100000,"listPn":0,"salePn":6100000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-7.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-7.png"],"specs":{"Mã sản phẩm":"XP.90T","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R864*S470*C226","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"model":"XP.90T","brand":"GrandX","category":"Giá bát đĩa, Xoong nồi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xp-90t-gia-xoong-noi-titanium-xp-90t-grandx","_addedBy":"vai-add-product"},"XTP900":{"name":"KHAY CHIA THÌA NĨA ĐA NĂNG CHẤT LIỆU NHỰA PP CAO CẤP XT.P900 / XT.P900-1 - Grandx","description":"Đặc tính sản phẩm \nKhay chia thìa nĩa\nChất liệu nhựa cao cấp PP chịu nhiệt\nĐạt các têu chuẩn vệ sinh an toàn cho sức khỏe được\nkiểm tra chứng nhận bởi FDA\nKích thước sản phẩm đa dạng, dễ lắp đặt, dễ vệ sinh \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “KHAY CHIA THÌA NĨA ĐA NĂNG CHẤT LIỆU NHỰA PP CAO CẤP XT.P900 / XT.P900-1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":940000,"listPn":0,"salePn":940000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XT.P600.P900-2.jpg","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XT.P600.P900-2.jpg"],"specs":{"Tên sản phẩm":"Khay chia thìa dĩa đa năng chất liệu nhựa PP cao cấp XT.P900 / XT.P900-1","Chất liệu":"PP","Đặc tính sản phẩm":"Màu Dark Grey","Kích thước sản phẩm (mm)":"W850*D490*H55","Chiều rộng tủ (mm)":"900","Đơn vị":"Cái"},"features":["Đặc tính sản phẩm","Khay chia thìa nĩa","Chất liệu nhựa cao cấp PP chịu nhiệt","Đạt các têu chuẩn vệ sinh an toàn cho sức khỏe được","kiểm tra chứng nhận bởi FDA","Kích thước sản phẩm đa dạng, dễ lắp đặt, dễ vệ sinh","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"model":"XTP900","brand":"GrandX","category":"Khay chia thìa, dĩa","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xtp900-khay-chia-thia-nia-da-nang-chat-lieu-nhua-pp-cao-cap-xt-p900-xt-p900-1-grandx","_addedBy":"vai-add-product"},"rau-c-u-s-n-thu-":{"name":"Rau câu sơn thuỷ","description":"Rau câu sơn thuỷ","priceNum":40000,"salePn":40000,"priceMode":"sale","specs":{"Đơn vị":"hộp"},"model":"rau-c-u-s-n-thu-","category":"Thực phẩm - Nước uống","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"san-pham","_addedBy":"vai-add-product","_bulk":true},"rau-cau-son-thuy":{"name":"Rau câu sơn thuỷ","description":"Rau câu sơn thuỷ","priceNum":40000,"salePn":40000,"priceMode":"sale","specs":{"Đơn vị":"hộp"},"model":"rau-cau-son-thuy","category":"Thực phẩm - Nước uống","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"rau-cau-son-thuy","_addedBy":"vai-add-product","_bulk":true},"banh-bong-tuyet-trung-muoi":{"name":"Bánh bông tuyết trứng muối","description":"Bánh bông tuyết trứng muối","priceNum":50000,"salePn":50000,"priceMode":"sale","specs":{"Đơn vị":"gr"},"model":"banh-bong-tuyet-trung-muoi","category":"Thực phẩm - Nước uống","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"banh-bong-tuyet-trung-muoi","_addedBy":"vai-add-product","_bulk":true},"banh-ngoi-hanh-nhan":{"name":"Bánh ngói hạnh nhân","description":"Bánh ngói hạnh nhân","priceNum":70000,"salePn":70000,"priceMode":"sale","specs":{"Đơn vị":"gr"},"model":"banh-ngoi-hanh-nhan","category":"Thực phẩm - Nước uống","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"banh-ngoi-hanh-nhan","_addedBy":"vai-add-product","_bulk":true},"banh-pho-mai-nhat":{"name":"Bánh PHÔ MAI nhật","description":"Bánh PHÔ MAI nhật","priceNum":115000,"salePn":115000,"priceMode":"sale","specs":{"Đơn vị":"bánh"},"model":"banh-pho-mai-nhat","category":"Thực phẩm - Nước uống","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"banh-pho-mai-nhat","_addedBy":"vai-add-product","_bulk":true},"HB CG26F":{"name":"KHÓA CỬA ĐIỆN TỬ HUBERT HB CG26F","description":"Description\nKHÓA CỬA THÔNG MINH HUBERT HB CG26F – CÔNG NGHỆ HIỆN ĐẠI, AN TOÀN TUYỆT ĐỐI \nTrong thời đại công nghệ 4.0, khóa cửa thông minh trở thành lựa chọn tối ưu cho những ai đề cao tính bảo mật, tiện lợi và hiện đại trong không gian sống. Hubert HB CG26F là dòng khóa điện tử cao cấp tích hợp nhiều công nghệ tiên tiến, đặc biệt là nhận diện khuôn mặt 3D , mang lại trải nghiệm sử dụng an toàn và đẳng cấp cho gia đình và doanh nghiệp.\nNHỮNG TÍNH NĂNG NỔI BẬT CỦA HUBERT HB CG26F \nCông nghệ mở khóa hiện đại – bảo mật tối ưu \nNhận diện khuôn mặt 3D : \nMở khóa siêu tốc chỉ trong 0,5 giây. Khả năng hoạt động chính xác trong điều kiện thiếu sáng và chống giả mạo khuôn mặt.\nMở khóa từ xa qua WiFi : Kết nối qua ứng dụng Wishome  \ncho phép mở khóa và theo dõi lịch sử sử dụng ngay trên điện thoại.\nCảm biến vân tay FPC Thụy Điển : Nhận diện chính xác, bảo mật cao, thời gian phản hồi chỉ 0,5 giây.\nMật khẩu bảo mật cao : Hỗ trợ mã số dài tới 32 ký tự, có chức năng xáo trộn số để chống nhìn trộm.\nThẻ từ: Quét nhanh, tiện lợi, phù hợp cho người già và trẻ nhỏ\nChìa khóa cơ chống sao chép : Dự phòng trong trường hợp khẩn cấp, đảm bảo an toàn cao hơn\nAn toàn vượt trội \nCảnh báo xâm nhập : Kích hoạt còi báo động khi có hành vi phá khóa hoặc nhập sai mã/vân tay nhiều lần.\nChế độ bảo mật riêng tư : Có thể khóa từ bên trong để đảm bảo an toàn tuyệt đối khi cần thiết.\nPin sạc lithium 5000mAh : Dung lượng lớn, tiết kiệm năng lượng, có thể sử dụng trong thời gian dài mà không cần thay pin thường xuyên.\nCamera hiển thị hình ảnh : Cho phép quan sát trực tiếp người đang đứng trước cửa, tăng cường bảo vệ và nhận diện.\nFace ID 3D siêu nhanh : Nhận diện chính xác, kể cả khi có thay đổi nhẹ trên khuôn mặt.\nChống cháy nổ – chống giật : Trang bị bo mạch chống chập điện, đảm bảo an toàn tuyệt đối trong điều kiện khí hậu nóng ẩm tại Việt Nam.\nTHÔNG SỐ KỸ THUẬT","priceNum":6000000,"listPn":0,"salePn":6000000,"priceMode":"both","image":"data:image/jpeg;base64,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m5t795vCLwheeKDm5t8d5vCLwheeKG04ANWObm3v1Og3hF4QvPFBzc2+O83hH4QvPFDacAGrHNzb37zeEXhC88UHNzb37zeEXhC88UNpwAasc3NvfvN4ReELzxQc3NvjvN4ReELzxQ2nABqxzc29+83hF4QvPFD60n9vylNymEOEtKU/+Y3vixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+373osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLFl4NSWO75OVrjZaVrQpyqE3lzDkFXRVadnm1Slyi1xxuU7QDkAAAAAAAAAAAAAAAAdV51pT8mceOS32ReeznHyyg9kHfWVfWDxnV+yDz2c4+WOL0Uu6joQyd6tRMnwh871TjUVG9smCbPjv021c3Lon2BT+sHWfCVTPZ1ESfDJd10/OFybNfm22H7ftPjCm0/OFxbNXm3WH7ftPjiIE32yPumsRfbFD5qiKbR66QXFtlfdN4i+2KHzVEUyn11MX32G/XkXnmkX57TM/nJx6EXOhvq3ZdH0xisT+YYeevkXHmj357TM/nKg9EpKmtEuU/TG5/ijIfzzYOcVArtf2u8OmLGSVFcYepczJGdYK9cYyjgh6fpaYnD2SbxrczhypkImNNmTsS8nRtHLq9nkyl9UbkEFd3fpsLihGu71jeZfcCTRpHE+qnOPEqoNUuG1a9v1YrK95nfN+GOnXi2eQv8Ax7oRdai5eeVr26jnnpa+nClueZz+MfDnkcjHlXXPz1p+nD889Tf07/xFMc8CvbH45vn9Np/KHKLiVutP00WhsmyS10bUWGUI14yv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","images":["data:image/jpeg;base64,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m5t795vCLwheeKDm5t8d5vCLwheeKG04ANWObm3v1Og3hF4QvPFBzc2+O83hH4QvPFDacAGrHNzb37zeEXhC88UHNzb37zeEXhC88UNpwAasc3NvfvN4ReELzxQc3NvjvN4ReELzxQ2nABqxzc29+83hF4QvPFD60n9vylNymEOEtKU/+Y3vixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+373osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLFl4NSWO75OVrjZaVrQpyqE3lzDkFXRVadnm1Slyi1xxuU7QDkAAAAAAAAAAAAAAAAdV51pT8mceOS32ReeznHyyg9kHfWVfWDxnV+yDz2c4+WOL0Uu6joQyd6tRMnwh871TjUVG9smCbPjv021c3Lon2BT+sHWfCVTPZ1ESfDJd10/OFybNfm22H7ftPjCm0/OFxbNXm3WH7ftPjiIE32yPumsRfbFD5qiKbR66QXFtlfdN4i+2KHzVEUyn11MX32G/XkXnmkX57TM/nJx6EXOhvq3ZdH0xisT+YYeevkXHmj357TM/nKg9EpKmtEuU/TG5/ijIfzzYOcVArtf2u8OmLGSVFcYepczJGdYK9cYyjgh6fpaYnD2SbxrczhypkImNNmTsS8nRtHLq9nkyl9UbkEFd3fpsLihGu71jeZfcCTRpHE+qnOPEqoNUuG1a9v1YrK95nfN+GOnXi2eQv8Ax7oRdai5eeVr26jnnpa+nClueZz+MfDnkcjHlXXPz1p+nD889Tf07/xFMc8CvbH45vn9Np/KHKLiVutP00WhsmyS10bUWGUI14yv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"],"specs":{"Công nghệ di chuyển":"AIVI 3D + LSD","Điều khiển qua App":"Ecovacs Home","Dòng":"Lau hút đồng thời","Dung tích hộp nước":"240ml","Dung tích Hộp rác":"470ml","Dung lượng PIN":"5200mAh","Hạng mục":"Chi tiết","Lưu trữ":"100 vân tay, 100 thẻ từ, 100 mã số, 30 khuôn mặt","Chất liệu":"Hợp kim nhôm + ABS cao cấp","Kích thước cửa phù hợp":"Độ dày từ 40–90mm, độ rộng đố cửa tối thiểu 80mm","Ruột khóa":"Chuẩn 6068 – độ bền cao, chống cắt phá"},"features":["Description","KHÓA CỬA THÔNG MINH HUBERT HB CG26F – CÔNG NGHỆ HIỆN ĐẠI, AN TOÀN TUYỆT ĐỐI","NHỮNG TÍNH NĂNG NỔI BẬT CỦA HUBERT HB CG26F","Công nghệ mở khóa hiện đại – bảo mật tối ưu","Nhận diện khuôn mặt 3D :","Mở khóa từ xa qua WiFi : Kết nối qua ứng dụng Wishome","Thẻ từ: Quét nhanh, tiện lợi, phù hợp cho người già và trẻ nhỏ","Chìa khóa cơ chống sao chép : Dự phòng trong trường hợp khẩn cấp, đảm bảo an toàn cao hơn","An toàn vượt trội","THÔNG SỐ KỸ THUẬT"],"model":"HB CG26F","brand":"Hubert","category":"Khóa vân tay","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"hb-cg26f-khoa-cua-dien-tu-hubert-hb-cg26f","_addedBy":"vai-add-product"},"BV101":{"name":"Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 Chính Hãng","description":"Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 là một thiết bị nhà bếp tối giản nhưng sở hữu hiệu năng vận hành ấn tượng và bền bỉ. Được chế tác từ chất liệu inox 304 mờ cao cấp kết hợp kiểu dáng cổ tròn mềm mại, dòng vòi cố định này mang lại sự vững chãi cùng tính linh hoạt tối đa cho bồn rửa bát. Đây chắc chắn là giải pháp tinh tế, dễ sử dụng giúp công việc nội trợ hằng ngày của gia đình bạn trở nên nhẹ nhàng hơn bao giờ hết.\nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nThông Số Kỹ Thuật Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nChất liệu cấu tạo: Inox 304 mờ cao cấp\nChức năng chính: Thân vòi cố định, cổ tròn xoay hướng 360 độ mượt mà\nChế độ nước: 2 đường nước Nóng và Lạnh liên hoàn\nChiều cao tổng thể từ chân vòi: 355 mm\nChiều cao từ mặt đá đến đầu xả nước: 250 mm\nKhoảng cách vươn vòi (Từ tâm thân vòi đến đầu vòi): 200 mm\nChiều cao phần bầu vòi cố định: 90 mm\nKích thước: Chân đế Ø50 mm / Thân dưới Ø45 mm / Thân trên Ø25 mm\nKích thước vòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nĐặc Điểm Nổi Bật Của Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \n1. Chất liệu Inox 304 mờ cao cấp \nSản phẩm được làm hoàn toàn từ chất liệu inox 304 mờ thượng hạng, đem lại độ bền vượt trội, chịu nhiệt tốt từ đường nước nóng và không lo hoen rỉ.\nBề mặt inox mờ có khả năng chống bám bẩn, hạn chế tối đa các vệt ố của nước cứng hay cặn dầu mỡ, giúp việc vệ sinh, lau chùi vòi nước bồn rửa bát hằng ngày trở nên cực kỳ đơn giản.\n2. Thiết kế cố định bền vững kết hợp tính năng xoay 360 độ linh hoạt \nCấu trúc cố định cứng cáp: Khác biệt với dòng dây rút, mẫu vòi rửa chén Boss mã BV101 sở hữu kết cấu thân cố định vững vàng, cho cảm giác sử dụng đầm tay, bền bỉ lâu dài và không lo các lỗi hỏng vặt.\nXoay hướng đa chiều: Cổ vòi tròn cong mềm mại có khả năng xoay 360 độ cực kỳ trơn tru, giúp bạn dễ dàng dẫn nước đến mọi góc của chậu rửa hoặc xoay gọn vòi sang một bên khi cần đặt các loại xoong nồi lớn vào bồn.\n3. Tích hợp 2 đường nước nóng lạnh tiện dụng \nDòng vòi rửa bát này tích hợp sẵn hai đường nước nóng và lạnh đáp ứng mọi nhu cầu sinh hoạt:\nNước nóng: Giúp rửa trôi dầu mỡ bám trên bát đĩa nhanh chóng, đồng thời hỗ trợ khử khuẩn đồ dùng nhà bếp một cách an toàn.\nNước lạnh: Tiện lợi cho công việc sơ chế thực phẩm, rửa dọn thông thường hằng ngày.\nHướng Dẫn Sử Dụng Và Lưu Ý Lắp Đặt Để Tăng Tuổi Thọ Vòi \nXả sạch đường ống trước khi lắp: Mở van cho nước chảy tự do từ 1 – 2 phút trước khi lắp vòi để đẩy sạch các loại cát sỏi, cặn bẩn xây dựng ra ngoài, tránh làm nghẹt lưới lọc đầu vòi.\nVệ sinh vòi đúng cách: Chỉ lau chùi thân vòi bằng khăn mềm ẩm hoặc nước rửa chén pha loãng. Tuyệt đối không dùng bùi nhùi sắt hoặc chất tẩy rửa có tính axit mạnh chà xát lên vòi để tránh gây trầy xước bề mặt inox mờ.\nThao tác gạt nước nhẹ nhàng: Gạt cần điều chỉnh lượng nước và nhiệt độ nóng lạnh với lực vừa phải, giúp lõi chia nước bên trong vòi vận hành êm ái, bền bỉ qua năm tháng.\nĐặt Mua Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 Chính Hãng Tại Đâu? \nVòi Boss Cố Định Cổ Tronfn Xoay 360 Độ BV101 hiện đang được phân phối chính hãng tại hệ thống của Vật tư tổng hợp giá sỉ , cam kết bảo đảm đầy đủ mọi quyền lợi tiêu dùng từ nhà sản xuất cùng chính sách độc quyền Bảo hành gỉ vĩnh viễn.\nLiên hệ ngay Hotline hoặc chat trực tiếp để được tư vấn kích thước chậu rửa phù hợp, nhận thông tin ưu đãi tốt nhất và hỗ trợ kỹ thuật lắp đặt nhanh chóng ngay hôm nay!","priceNum":1740000,"listPn":0,"salePn":1740000,"priceMode":"both","image":"https://vattutonghopgiasi.com/wp-content/uploads/2026/07/voi-boss-co-dinh-co-tron-xoay-360-do-bv101-2.jpg","images":["https://vattutonghopgiasi.com/wp-content/uploads/2026/07/voi-boss-co-dinh-co-tron-xoay-360-do-bv101-2.jpg"],"specs":{},"features":["Sản phẩm được làm hoàn toàn từ chất liệu inox 304 mờ thượng hạng, đem lại độ bền vượt trội, chịu nhiệt tốt từ đường nước nóng và không lo hoen rỉ.","Bề mặt inox mờ có khả năng chống bám bẩn, hạn chế tối đa các vệt ố của nước cứng hay cặn dầu mỡ, giúp việc vệ sinh, lau chùi vòi nước bồn rửa bát hằng ngày trở nên cực kỳ đơn giản.","Cấu trúc cố định cứng cáp: Khác biệt với dòng dây rút, mẫu vòi rửa chén Boss mã BV101 sở hữu kết cấu thân cố định vững vàng, cho cảm giác sử dụng đầm tay, bền bỉ lâu dài và không lo các lỗi hỏng vặt.","Xoay hướng đa chiều: Cổ vòi tròn cong mềm mại có khả năng xoay 360 độ cực kỳ trơn tru, giúp bạn dễ dàng dẫn nước đến mọi góc của chậu rửa hoặc xoay gọn vòi sang một bên khi cần đặt các loại xoong nồi lớn vào bồn.","Dòng vòi rửa bát này tích hợp sẵn hai đường nước nóng và lạnh đáp ứng mọi nhu cầu sinh hoạt: Nước nóng: Giúp rửa trôi dầu mỡ bám trên bát đĩa nhanh chóng, đồng thời hỗ trợ khử khuẩn đồ dùng nhà bếp một cách an toàn.","Nước lạnh: Tiện lợi cho công việc sơ chế thực phẩm, rửa dọn thông thường hằng ngày.","Xả sạch đường ống trước khi lắp: Mở van cho nước chảy tự do từ 1 – 2 phút trước khi lắp vòi để đẩy sạch các loại cát sỏi, cặn bẩn xây dựng ra ngoài, tránh làm nghẹt lưới lọc đầu vòi.","Vệ sinh vòi đúng cách: Chỉ lau chùi thân vòi bằng khăn mềm ẩm hoặc nước rửa chén pha loãng. Tuyệt đối không dùng bùi nhùi sắt hoặc chất tẩy rửa có tính axit mạnh chà xát lên vòi để tránh gây trầy xước bề mặt inox mờ."],"model":"BV101","brand":"Boss","category":"Chậu rửa, Vòi rửa","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"bv101-voi-boss-co-dinh-co-tron-xoay-360-do-bv101-chinh-hang","_addedBy":"vai-add-product"},"BA7545":{"name":"Chậu Đúc 1 Hố Âm Bàn BA7545 - Boss Việt Nam","priceNum":5720000,"description":"Chậu Đúc 1 Hố Âm Bàn là một trong những sản phẩm đang được ưa chuộng trên thị trường hiện nay, nhờ vào thiết kế tinh tế, chất liệu bền bỉ và tính năng vượt trội. Được chế tạo từ inox 304 chất lượng cao, sản phẩm này không chỉ mang đến sự hiện đại, sang trọng cho không gian bếp, mà còn đảm bảo độ bền theo thời gian. Nếu bạn đang tìm kiếm một sản phẩm bếp tiện lợi và thẩm mỹ, Chậu Đúc 1 Hố Âm Bàn chính là lựa chọn lý tưởng. \n1. Chất Liệu Inox 304 Cao Cấp \nChậu Đúc 1 Hố Âm Bàn của Boss được làm từ inox 304, một loại inox phổ biến trong ngành sản xuất đồ dùng bếp cao cấp. Với tính năng chống ăn mòn, chống oxi hóa và bền bỉ trong môi trường ẩm ướt, inox 304 giúp sản phẩm không chỉ giữ được vẻ đẹp sáng bóng mà còn có tuổi thọ lâu dài. Bề mặt inox mịn màng, dễ dàng vệ sinh, giúp chậu luôn sạch sẽ và không bị bám bẩn. \n2. Thiết Kế Đúc Âm Bàn Tinh Tế \nMột trong những ưu điểm nổi bật của Chậu Đúc 1 Hố Âm Bàn chính là thiết kế khoét âm bàn, tạo ra một không gian bếp gọn gàng và hiện đại. Việc lắp đặt chậu âm bàn không chỉ tiết kiệm diện tích mà còn dễ dàng trong việc vệ sinh, không bị bụi bẩn bám vào các đường viền như các loại chậu truyền thống. Thiết kế này mang đến sự sang trọng, nâng tầm không gian bếp của bạn. \n3. Các Kích Thước Phù Hợp Với Mọi Không Gian \nChậu Đúc 1 Hố Âm Bàn có nhiều kích thước khác nhau, giúp bạn dễ dàng lựa chọn sao cho phù hợp với không gian bếp của mình. Ba loại kích thước phổ biến của chậu đúc âm bàn bao gồm: \nChậu đúc 1 hố âm bàn \nBA6845 : Kích thước khoét đá 64 x 41 cm, phù hợp với không gian bếp có diện tích vừa phải. \nBA7545 : Kích thước khoét đá 71 x 41 cm, là lựa chọn lý tưởng cho những căn bếp rộng rãi, mang đến sự thoải mái trong việc sử dụng. \nBA7845 : Kích thước khoét đá 74 x 41 cm, với không gian rộng rãi hơn, mang đến sự tiện lợi cho việc nấu nướng và vệ sinh. \nMỗi kích thước đều được thiết kế để đảm bảo tính thẩm mỹ và công năng, giúp bạn lựa chọn được sản phẩm phù hợp nhất với nhu cầu sử dụng. \n4. Độ Dày Vượt Trội \nChậu Đúc 1 Hố Âm Bàn có độ dày viền 3.0mm và dày thùng 1.0mm, mang lại độ bền cao và khả năng chống va đập hiệu quả. Với thiết kế này, chậu có thể chịu được lực tác động mạnh mà không bị biến dạng, giúp sản phẩm duy trì hình dáng hoàn hảo suốt thời gian sử dụng. Độ dày của inox cũng giúp chậu không bị móp méo, đồng thời giữ được tính thẩm mỹ và độ bền lâu dài. \n5. Dễ Dàng Vệ Sinh Và Bảo Quản \nChậu Đúc 1 Hố Âm Bàn không chỉ nổi bật với thiết kế tinh tế mà còn rất dễ dàng vệ sinh. Với bề mặt inox mịn màng và không có các khe hở, việc lau chùi, rửa chén bát hay làm sạch sau khi nấu nướng trở nên đơn giản hơn bao giờ hết. Không chỉ giúp tiết kiệm thời gian, chậu còn giúp không gian bếp của bạn luôn sạch sẽ và gọn gàng. \n6. Tính Năng Tiện Dụng Và Hiện Đại \nChậu Đúc 1 Hố Âm Bàn mang lại sự tiện nghi tối đa cho người sử dụng. Bạn có thể dễ dàng rửa thực phẩm, chén bát hoặc các vật dụng nhà bếp khác mà không lo bị tràn ra ngoài. Bề mặt chậu phẳng, tạo sự thuận tiện khi đặt đồ vật lên, tránh việc nước tràn hoặc bẩn ra ngoài. Đặc biệt, thiết kế âm bàn còn giúp tiết kiệm diện tích, làm cho không gian bếp của bạn trở nên rộng rãi và gọn gàng hơn. \n7. Đặc Điểm Kỹ Thuật Sản Phẩm \nChất liệu : Inox 304 \nĐộ dày viền : 3.0mm \nĐộ dày thùng : 1.0mm \nKích thước khoét đá : BA6845 : 64 x 41 cm \nBA7545 : 71 x 41 cm \nBA7845 : 74 x 41 cm \n8. Lý Do Nên Chọn Chậu Đúc 1 Hố Âm Bàn \nChất lượng vượt trội : Sản phẩm được làm từ inox 304, bền bỉ và không bị ăn mòn, giúp chậu duy trì vẻ sáng bóng lâu dài. \nThiết kế sang trọng : Với kiểu dáng khoét âm bàn, chậu giúp không gian bếp trở nên hiện đại và gọn gàng hơn. \nDễ dàng vệ sinh : Bề mặt inox mịn màng và không có các khe hở giúp việc vệ sinh trở nên dễ dàng. \nChống va đập tốt : Độ dày viền và thùng inox giúp chậu chống chịu lực tốt và có độ bền lâu dài. \nPhù hợp với mọi không gian : Các kích thước khác nhau giúp bạn dễ dàng lựa chọn sản phẩm phù hợp với không gian bếp của mình. \nChậu Đúc 1 Hố Âm Bàn là sự kết hợp hoàn hảo giữa tính năng, chất lượng và thẩm mỹ. Sản phẩm này không chỉ đáp ứng nhu cầu sử dụng của bạn trong bếp mà còn tạo điểm nhấn cho không gian bếp hiện đại, sang trọng. Với chất liệu inox 304, thiết kế thông minh và dễ dàng vệ sinh, đây là lựa chọn lý tưởng cho mọi gia đình. \nHãy lựa chọn Chậu Đúc 1 Hố Âm Bàn để mang đến sự tiện lợi và vẻ đẹp cho không gian bếp của bạn","specs":{"BA7545":"Kích thước khoét đá 71 x 41 cm, là lựa chọn lý tưởng cho những căn bếp rộng rãi, mang đến sự thoải mái trong việc sử dụng.","BA7845":"Kích thước khoét đá 74 x 41 cm, với không gian rộng rãi hơn, mang đến sự tiện lợi cho việc nấu nướng và vệ sinh.","Chất liệu":"Inox 304","Độ dày viền":"3.0mm","Độ dày thùng":"1.0mm","BA6845":"64 x 41 cm"},"features":["1. Chất Liệu Inox 304 Cao Cấp","2. Thiết Kế Đúc Âm Bàn Tinh Tế","3. Các Kích Thước Phù Hợp Với Mọi Không Gian","Chậu đúc 1 hố âm bàn","4. Độ Dày Vượt Trội","5. Dễ Dàng Vệ Sinh Và Bảo Quản","6. Tính Năng Tiện Dụng Và Hiện Đại","7. Đặc Điểm Kỹ Thuật Sản Phẩm","Chất liệu : Inox 304","Độ dày viền : 3.0mm"],"images":["https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-duc-1-ho-am-ban.jpg"],"image":"https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-duc-1-ho-am-ban.jpg","_addedBy":"vai-add-product","brand":"Boss","salePn":5720000,"listPn":0,"priceMode":"both","category":"Chậu rửa chén","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"ba7545-chau-duc-1-ho-am-ban-ba7545-boss-viet-nam","model":"BA7545"},"__verify__":{"deleted":true},"__final_check__":{"deleted":true},"TL869IMAX":{"name":"Bếp Từ Canzy CZTL869IMAX","description":"BẾP TỪ ĐÔI CANZY CZ TL869I MAX Canzy CZ TL869I MAX là dòng bếp từ đôi cao cấp hội tụ những tính năng hiện đại nhất, mang lại trải nghiệm nấu nướng an toàn, nhanh chóng và cực kỳ tiết kiệm điện năng cho gia đình bạn. ĐẶC ĐIỂM NỔI BẬT VỀ THIẾT KẾ Mặt kính Kanger vát cạnh tinh tế: Được bo viền nhôm 4 cạnh chắc chắn, vừa t","priceNum":6200000,"listPn":14980000,"salePn":6200000,"priceMode":"both","image":"https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","images":["https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742205457-be482ddf736ace36ea7308fe3a2b6806.jpg","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742322070-a36944508c279d6b99c2ae58d77621bd.jpg","https://bizweb.dktcdn.net/100/344/152/products/1-4dfb6f78-f7ff-4322-b4fb-70815e12b95f.png","https://bizweb.dktcdn.net/100/344/152/products/2-59f34d91-4f3f-4477-a43b-2cac5dae561a.png"],"specs":{},"features":[],"model":"TL869IMAX","brand":"Canzy","category":"Bếp Từ Canzy CZ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"tl869imax-bep-tu-canzy-cztl869imax","_addedBy":"vai-add-product"},"GW0630G":{"name":"Thùng rác đôi GW0630G","description":"Thùng rác đôi GW06.30G Ray bi giảm chấn toàn phần, khung bắt đáy, Khung bằng thép sơn tĩnh điện, dày dặn, chắc chắn bằng thép!","priceNum":4248720,"listPn":0,"salePn":4248720,"priceMode":"both","image":"https://garis.vn/uploaded/GS06_30G%20N%204.jpg","images":["https://garis.vn/uploaded/GS06_30G%20N%204.jpg"],"specs":{},"features":[],"model":"GW0630G","brand":"Garis","category":"Thùng rác","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gw0630g-thung-rac-doi-gw0630g","_addedBy":"vai-add-product"},"GP0270E":{"name":"Giá xoong nồi, rổ nan dẹt, cánh kéo Garis GP0270E","description":"Giá xoong nồi GP02E được thiết kế thông minh với kiểu dáng hiện đại, giúp tổ chức không gian bếp một cách gọn gàng và tiện lợi","priceNum":3716280,"listPn":0,"salePn":3716280,"priceMode":"both","image":"https://garis.vn/uploaded/Gia%CC%81%20xoong%20no%CC%82%CC%80i%20GP02E1-1.jpg","images":["https://garis.vn/uploaded/Gia%CC%81%20xoong%20no%CC%82%CC%80i%20GP02E1-1.jpg"],"specs":{},"features":[],"model":"GP0270E","brand":"Garis","category":"Giá xoong nồi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gp0270e-gia-xoong-noi-ro-nan-det-canh-keo-garis-gp0270e","_addedBy":"vai-add-product"},"MM0235V":{"name":"Kệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V GM- Garis V","description":"Nan quả trám, inox 304, bề mặt điện hóa bóng gương, dùng cho cánh mở và kéo (duy nhất tại Việt Nam)\nGợi ý kết hợp phụ kiện khi thiết kế căn bếp : Căn bếp sẽ đẹp hơn khi kết hợp giá dao thớt, gia vị, chai lọ MM02V với các sản phẩm khác trong MV Series.\nKèm theo: Ray âm giảm chấn MEGKEL (bắt vách tủ), 1 bộ bắt mặt tùy chọn dùng cho cánh kéo, 1 khay hứng nước, phiếu bảo hành, giấy chứng nhận inox 304\nKệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V Quý Khách có thể tham khảo Hướng dẫn lắp đặt phía dưới:","priceNum":7128000,"listPn":0,"salePn":7128000,"priceMode":"both","image":"https://garis-vn.com/wp-content/uploads/2024/03/1-MM02V-2.png","images":["https://garis-vn.com/wp-content/uploads/2024/03/1-MM02V-2.png"],"specs":{"Chất liệu":"Inox 304, tiêu chuẩn Nhật Bản JIS G4305","Bề mặt":"Bề mặt rổ bóng sáng với công nghệ điện hóa bóng gương Mirror BA","Tải trọng":"25kg","Bảo hành":"25 năm (bảo hành rỉ rổ)"},"features":["Nan quả trám, inox 304, bề mặt điện hóa bóng gương, dùng cho cánh mở và kéo (duy nhất tại Việt Nam)","Kệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V"],"model":"MM0235V","brand":"Garis","category":"Kệ đựng gia vị dao thớt","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"mm0235v-ke-dao-thot-gia-vi-chai-lo-canh-mo-keo-mm02-35v-gm-garis-v","_addedBy":"vai-add-product"},"SMS6ZCI16E":{"name":"Máy rửa bát độc lập Bosch SMS6ZCI16E serie 6","description":"Máy rửa bát Bosch SMS6ZCI16E có xuất xứ từ Châu Âu được trang bị nhiều công nghệ hiện đại như Sấy Zeolith – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo…, mang đến cho người dùng những trải nghiệm hoàn toàn mới.\nĐặc điểm nổi bật của máy rửa bát Bosch SMS6ZCI16E \nThiết kế độc lập linh hoạt vị trí lắp đặt (có thể đặt âm). Máy được làm từ chất liệu thép không gỉ, bề mặt màu inox có lớp phủ chống bám vân tay. Tổng thể của chiếc máy giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn.\nBảng điều khiển đặt ở phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng.\nHệ thống phân phối viên rửa dosing assistant thông minh\nTự vệ sinh: tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo.\nẢnh thực tế của máy rửa bát độc lập Bosch SMS6ZCI16E serie 6 \nHệ thống khay rửa  \nHệ thống giàn rửa gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn.\nNgăn kéo VarioDrawer để đựng các đồ dùng nhỏ như đũa, thìa, dĩa…  Đồng thời giúp giải phóng và tăng diện tích chứa cho ngăn dưới cùng.\nHệ thống Rackmatic điều chỉnh chiều cao giàn rửa theo nhu cầu. Bạn có thể dễ dàng thay đổi vị trí độ cao giàn rửa thông qua khớp nâng hạ, ngay cả khi giàn chứa đang đầy.\nHệ thống vòi phun Extra Clean Zone: giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa.\nChương trình rửa  \n8 chương trình rửa: \nRửa Eco 50°C\nRửa tự động 45-65°C\nRửa thông minh (Intelligent)\nRửa chuyên sâu 70°C\nRửa nhanh 60°C (Express)\nRửa ly 40°C (Glass)\nRửa yên tĩnh 50°C\nRửa tráng (Favorite)\nBảng điều khiển của máy rửa bát độc lập Bosch SMS6ZCI16E  \nChương trình rửa đặc biệt \nTăng tốc độ rửa (SpeedPerfect Plus)\nRửa chuyên sâu (IntensiveZone)\nSấy tăng cường (Extra Dry)\nCông nghệ và cảm biến  \nExtra Dry (sấy tăng cường ): tăng nhiệt độ nước ở lần tráng cuối cùng và kéo dài thời gian sấy khô hơn. Đồng thời, các hạt nước đọng trên bát đĩa sẽ bốc hơi, ngưng tụ và rơi xuống đáy máy\nIntensiveZone (vùng rửa chuyên sâu) : được kích hoạt để tăng áp suất phun kết hợp nhiệt độ cao để rửa sạch hoàn toàn các vết bẩn cứng đầu, bám lâu ngày trên những vật dụng ở giàn dưới cùng.\nZeolith (công nghệ sấy Zeolith) : hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm giúp  bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn\nCông nghệ rửa thông minh , tối ưu quá trình rửa: máy sẽ tự động điều chỉnh các cài đặt và cung cấp một số lựa chọn thay thế cho người dùng\nHome Connect : giúp bạn dễ dàng điều khiển máy rửa bát mà không cần lại gần máy: lượng tiêu thụ điện nước và chất tẩy rửa, hoạt động của máy rửa bát\nCảm biến nước và cảm biến tải giúp tiết kiệm điện năng mà vẫn đảm bảo rửa sạch sẽ bát đũa\nĐộng cơ không chổi than hoạt động bền bỉ, tiếng ồn nhỏ không làm ảnh hưởng đến sinh hoạt của các thành viên khác trong gia đình\nHệ thống làm sạch sâu của máy rửa bát độc lập Bosch SMS6ZCI16E  \nHoạt động và tiêu thụ năng lượng  \nNhãn năng lượng: B\nĐiện / nước: 65 kWh / 9 liters\nThời gian Eco: 3h35′\nĐộ ồn: 40 dB\nNhãn độ ồn: B\nĐộ ồn yên lượng: 39 dB\nTính năng an toàn  \nKhóa trẻ em (ChildLock) : là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển.\nHệ thống AquaStop : là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài.\nHệ thống chống sét lan truyền : là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan.\nThông số kỹ kỹ thuật","priceNum":19200000,"listPn":28790000,"salePn":19200000,"priceMode":"both","image":"https://b1.congngheviet.com.vn/file/s3-vn01/bosch-house-com-vn/wp-content/uploads/2024/01/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6.jpg","images":["https://b1.congngheviet.com.vn/file/s3-vn01/bosch-house-com-vn/wp-content/uploads/2024/01/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6.jpg"],"specs":{"Rất phù hợp với các loại món ăn":"Bình sữa trẻ em, Chảo nướng, Bát đĩa nửa tải, Nồi và chảo lớn, Hộp nhựa, Ly uống rượu (23cm)","Chiếu sáng nội thất":"Có","Chương trình giặt":"Chu kỳ tự động, tiết kiệm, chuyên sâu, ngắn, im lặng","Chức năng nửa tải":"–","Cảm biến tải":"–","Chức năng chu kỳ rút ngắn":"Có","Chiếu sàn":"KHÔNG","Giá đỡ dưới có chức năng nâng":"–","Phát hiện chất tẩy rửa":"Co","Nạp chất tẩy rửa máy rửa chén tự động":"–","Chỉ báo nạp muối":"Có","Chỉ báo nạp nước trợ xả":"Có","Tín hiệu kết thúc chu kỳ":"Có","Loại tín hiệu kết thúc chu kỳ":"Quang học","Khóa an toàn trẻ em":"Có","Chất lượng giặt":"Cao cấp","Số nhiệt độ làm sạch":"6","Nhiệt độ làm sạch tối đa":"70°C","Phương pháp sấy":"Zeolit ​​(bát khô thêm)","Vùng chuyên sâu":"Nhanh","Điều khiển qua ứng dụng":"Có","Điều khiển máy sấy qua ứng dụng":"Vận hành từ xa, Đọc thông tin qua ứng dụng","Bắt đầu trì hoãn":"Có","Bắt đầu phân chia độ trễ":"1 – 24 giờ","Tùy chọn tắt tự động":"Có","Ngôn ngữ bảng điều khiển":"Tiếng Anh, Ký hiệu","Nhãn năng lượng":"B","Chi phí năng lượng hàng năm":"72,8 euro","Tiêu thụ năng lượng hàng năm":"182 kWh","Tiêu thụ năng lượng trên mỗi chu kỳ":"0,65 kWh","Chức năng tiết kiệm năng lượng":"Tự động tắt, Chu trình tiết kiệm năng lượng, Cấp nước nóng, Lượng nước sử dụng được xác định theo mức độ bẩn","Thời lượng chu kỳ sinh thái":"215 phút","Chi phí nước hàng năm":"3,43 euro","Lượng nước sử dụng hàng năm":"2520 lít","Lượng nước sử dụng mỗi chu kỳ":"9 lít","Thân thiện với môi trường":"Đúng","Xây dựng chất lượng":"Cao cấp","Số lượng vòi phun tay phun":"2","Loại động cơ":"Biến tần","Chất liệu nội thất":"Thép không gỉ","Đầu nối nước":"Nước lạnh và nước ấm","Bảo vệ rò rỉ":"Có","Loại bảo vệ rò rỉ":"Cảm biến rò rỉ đáy, Bảo vệ chống tràn, Ống an toàn","Ống đầu vào có thể tháo rời":"–","Ống thoát nước có thể tháo rời":"–","Chiều dài ống đầu vào":"1,65 m","Loại nguồn điện":"Mạng lưới điện","Nguồn điện tối thiểu":"2400W"},"features":["Bảng điều khiển đặt ở phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng.","Hệ thống phân phối viên rửa dosing assistant thông minh","Tự vệ sinh: tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo.","Ngăn kéo VarioDrawer để đựng các đồ dùng nhỏ như đũa, thìa, dĩa… Đồng thời giúp giải phóng và tăng diện tích chứa cho ngăn dưới cùng.","Hệ thống Rackmatic điều chỉnh chiều cao giàn rửa theo nhu cầu. Bạn có thể dễ dàng thay đổi vị trí độ cao giàn rửa thông qua khớp nâng hạ, ngay cả khi giàn chứa đang đầy."],"model":"SMS6ZCI16E","brand":"Bosch","category":"Máy rửa chén","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"sms6zci16e-may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6","_addedBy":"vai-add-product"},"ZZTEST-SKIP":{"name":"ZZTEST SKIP","description":"ZZTEST SKIP","priceNum":1000,"listPn":0,"salePn":1000,"priceMode":"sale","image":"","images":[],"specs":{},"features":[],"model":"ZZTEST-SKIP","brand":"","category":"","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"zztest-skip","_addedBy":"vai-add-product"},"ZZTEST-NEW2":{"name":"ZZTEST NEW PRODUCT","description":"ZZTEST NEW PRODUCT","priceNum":1000,"listPn":0,"salePn":1000,"priceMode":"sale","image":"","images":[],"specs":{},"features":[],"model":"ZZTEST-NEW2","brand":"","category":"","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"zztest-new2","_addedBy":"vai-add-product"},"ZZVERIFY-A1":{"name":"ZZ Verify San Pham Moi A1 (re-sync lan 3)","description":"ZZ Verify San Pham Moi A1 (re-sync lan 3)","priceNum":2000,"listPn":0,"salePn":2000,"priceMode":"sale","image":"","images":[],"specs":{},"features":[],"model":"ZZVERIFY-A1","brand":"","category":"","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"zzverify-a1-url-scraper-v3","_addedBy":"vai-add-product"},"MPV0260":{"name":"Giá xoong nồi vách hộp, rổ nan oval, cánh kéo MPV0260","description":"Với thiết kế vách hộp thông minh, giúp phân chia không gian lưu trữ hiệu quả, MP02V giúp tiết kiệm diện tích bếp, đồng thời giữ cho các dụng cụ bếp luôn trong tầm tay khi cần sử dụng","priceNum":6145200,"listPn":0,"salePn":6145200,"priceMode":"both","image":"https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%20v%C3%A1ch%20h%E1%BB%99p%20MP02V%20(1).jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%20v%C3%A1ch%20h%E1%BB%99p%20MP02V%20(1).jpg"],"specs":{},"features":[],"model":"MPV0260","brand":"Garis","category":"Giá xoong nồi vách hộp MPV2 cánh kéo màu Titan MV Series","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"mpv0260-gia-xoong-noi-vach-hop-ro-nan-oval-canh-keo-mpv0260","_addedBy":"vai-add-product"},"MDV0260":{"name":"Giá bát đĩa, thìa đũa vách hộp, rổ nan oval, cánh kéo MDV0260","description":"Thiết kế vách hộp tiện lợi, giúp phân chia không gian lưu trữ hiệu quả, phù hợp với mọi không gian bếp. MD02V mang đến sự tiện nghi và tính thẩm mỹ cao cho căn bếp của bạn.","priceNum":6685200,"listPn":0,"salePn":6685200,"priceMode":"both","image":"https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%2C%20th%C3%ACa%20%C4%91%C5%A9a%20v%C3%A1ch%20h%E1%BB%99p%20MD02V%20(3).jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%2C%20th%C3%ACa%20%C4%91%C5%A9a%20v%C3%A1ch%20h%E1%BB%99p%20MD02V%20(3).jpg"],"specs":{},"features":[],"model":"MDV0260","brand":"Garis","category":"Giá bát đĩa, thìa đũa vách hộp MDV2 màu Titan chính hãng","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"mdv0260-gia-bat-dia-thia-dua-vach-hop-ro-nan-oval-canh-keo-mdv0260","_addedBy":"vai-add-product"},"GD0470N":{"name":"Giá xoong nồi + bát đĩa, rổ nan oval, cánh mở hoặc kéo GD0470N","description":"Thiết kế thông minh với nhiều ngăn chứa rộng rãi, phù hợp với nhiều loại xoong nồi, bát đĩa khác nhau. MD04N không chỉ mang đến sự tiện lợi tối ưu mà còn góp phần tăng tính thẩm mỹ cho căn bếp hiện đại.","priceNum":3985200,"listPn":0,"salePn":3985200,"priceMode":"both","image":"https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%2C%20b%C3%A1t%20%C4%91%C4%A9a%20MD04N%20(1).jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%2C%20b%C3%A1t%20%C4%91%C4%A9a%20MD04N%20(1).jpg"],"specs":{},"features":[],"model":"GD0470N","brand":"Garis","category":"Giá xoong nồi + bát đĩa, rổ nan oval, cánh mở hoặc kéo GDN4","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gd0470n-gia-xoong-noi-bat-dia-ro-nan-oval-canh-mo-hoac-keo-gd0470n","_addedBy":"vai-add-product"},"GT0370AG":{"name":"Hệ khay chia thìa đũa độc lập GT0370AG","description":"Thanh chia có thể tháo rời, chỉnh khoảng cách linh hoạt Khung bằng nhôm hàng không AA (Aviation Aluminium) Đáy có tấm chống trơn trượt Tải trọng 25kg Bảo hành 24 tháng, bảo hành gì 20 năm","priceNum":4201200,"listPn":0,"salePn":4201200,"priceMode":"both","image":"https://garis.vn/uploaded/GT03_6AG%20(1).jpg","images":["https://garis.vn/uploaded/GT03_6AG%20(1).jpg"],"specs":{},"features":[],"model":"GT0370AG","brand":"Garis","category":"Hệ khay chia thìa đũa độc lập GTAG3","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gt0370ag-he-khay-chia-thia-dua-doc-lap-gt0370ag","_addedBy":"vai-add-product"},"GM0230E":{"name":"Giá dao thớt, gia vị, chai lọ, rổ nan dẹt cánh kéo GME230","description":"Giá dao thớt, chai lọ GM02.30E Nan dẹt, inox 304, bề mặt điện hóa xước mờ, dùng cho cánh kéo, ray giảm chấn hiệu quả, bền bỉ và sang trọng. Mua hàng chính hãng tại Garis Việt Nam!","priceNum":3996000,"listPn":0,"salePn":3996000,"priceMode":"both","image":"https://garis.vn/uploaded/Gi%C3%A1%20dao%20th%E1%BB%9Bt%2C%20chai%20l%E1%BB%8D%20GM02%2030E%20(3).jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20dao%20th%E1%BB%9Bt%2C%20chai%20l%E1%BB%8D%20GM02%2030E%20(3).jpg"],"specs":{},"features":["Giá dao thớt, chai lọ có hệ thống bắt mặt cánh tủ dạng 3D duy nhất trên thị trường. Điều này mang lại sự ổn định và độ chắc chắn cho giá dao thớt, chai lọ khi sử dụng.","Giá dao thớt, chai lọ đi kèm với rổ phụ gia vị có thể nhấc ra dễ dàng. Điều này giúp tiện lợi trong việc lấy và sắp xếp các chai lọ và phụ gia vị."],"model":"GM0230E","brand":"Garis","category":"Giá dao thớt, gia vị, chai lọ, rổ nan dẹt, cánh kéo","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gm0230e-gia-dao-thot-gia-vi-chai-lo-ro-nan-det-canh-keo-gme230","_addedBy":"vai-add-product"},"GKE225001":{"name":"Giá gia vị, chai lọ, rổ nan dẹt, cánh kéo GKE225","description":"Giá gia vị, chai lọ GK02.30E (new) thiết kế thông minh, tiện ích, chất liệu cao cấp, giúp sắp xếp gọn gàng, tối ưu không gian bếp hiện đại.","priceNum":3942000,"listPn":0,"salePn":3942000,"priceMode":"both","image":"https://garis.vn/uploaded/GK02_25E%201.jpg","images":["https://garis.vn/uploaded/GK02_25E%201.jpg"],"specs":{},"features":[],"model":"GKE225001","brand":"Garis","category":"Giá gia vị, chai lọ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gke225001-gia-gia-vi-chai-lo-ro-nan-det-canh-keo-gke225","_addedBy":"vai-add-product"},"EV80":{"name":"Giá Bát Đĩa Đa Năng Euplus Inox 304, Nan Vuông EV80","description":"Nội dung chính\nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở Đặc điểm nổi bật : \nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở\nGiá bát đĩa đa năng Euplus EV Inox 304 xước mờ cánh mở nan vuông  là  Phụ kiện tủ bế p  được nhập khẩu chính hãng từ thương hiệu nổi tiếng Euplus. Thiết kế của sản phẩm tuy đơn giản nhưng rất sang trọng và hiện đại, nổi bật với các thanh inox sáng bóng không tì vết.\nĐặc điểm nổi bật :\nChất liệu làm bằng inox nan theo tiêu chuẩn Nhật Bản JIS G4303 cao cấp chống gỉ bền bỉ theo thời gian.\nSàn để úp bát đĩa tiện dụng, có thể dùng đề đồ khô và các vật dụng khác trong không gian bếp\nCó khay hứng nước để khi úp trực tiếp xoong nồi ướt nước không bị rây ra ngoài, khay hứng nước được tháo lắp dễ dàng.\nTích hợp bộ ray giảm chấn có tác dụng đóng mở nhẹ nhàng, không gây tiếng ồn.","priceNum":2937000,"listPn":0,"salePn":2937000,"priceMode":"both","image":"https://euplus.com.vn/wp-content/uploads/2021/03/BAT-DA-NANG-1.jpg","images":["https://euplus.com.vn/wp-content/uploads/2021/03/BAT-DA-NANG-1.jpg"],"specs":{"Bảo hành":"20 năm rỉ rổ và bảo hành khác 2 năm","Thương hiệu":"EUPLUS","Xuất xứ":"Việt Nam","Kích thước":"800mm"},"features":["Thông số kỹ thuật","Đánh giá (0)","Giá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở Đặc điểm nổi bật :","Chất liệu làm bằng inox nan theo tiêu chuẩn Nhật Bản JIS G4303 cao cấp chống gỉ bền bỉ theo thời gian.","Sàn để úp bát đĩa tiện dụng, có thể dùng đề đồ khô và các vật dụng khác trong không gian bếp","Có khay hứng nước để khi úp trực tiếp xoong nồi ướt nước không bị rây ra ngoài, khay hứng nước được tháo lắp dễ dàng.","Tích hợp bộ ray giảm chấn có tác dụng đóng mở nhẹ nhàng, không gây tiếng ồn."],"model":"EV80","brand":"EUPLUS","category":"Giá Để Xoong Nồi Chén Dĩa","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"ev80-gia-bat-dia-da-nang-euplus-inox-304-nan-vuong-ev80","_addedBy":"vai-add-product"},"EV180":{"name":"Giá bát nâng hạ 800mm Euplus EV180","description":"Giá bát nâng hạ 800mm Euplus EV.180 \nMÔ TẢ SẢN PHẨM \n+ Chất liệu : Inox SUS304, tiêu chuẩn Nhật Bản JIS G4305\n+ Kích thước : 765*300*650\n+  Màu sắc : Inox\n+ Tải trọng: 12kg (6kg/tầng)\n+ Bảo hành sản phẩm 24 tháng, bảo hành hoen gỉ 15 năm\nXem thêm: Phụ kiện bếp Euplus – Hotline: 0988 078 900 \nGiá bát đĩa nâng hạ Euplus nan vuông – Chất lượng đảm bảo – Không lo về giá!\nGiá bát đĩa nâng hạ Euplus  là dòng sản phẩm được đại đa số người tiêu dùng lựa chọn với thương hiệu đã được khẳng định trên thị trường, chi phí vô cùng hợp lý và dịch vụ bảo hành nhanh chóng, chuyên nghiệp.\nPhụ kiện bếp hiện đại  không chỉ mang lại cho bạn sự tiện lợi mà còn giúp “nâng tầm đẳng cấp” cho căn bếp nhà bạn.  Giá bát đĩa nâng hạ  là một trong Top 11 những phụ kiện tủ bếp thông minh được người tiêu dùng lựa chọn nhiều nhất cho tủ bếp gia đình.\nGiá bát đĩa nâng hạ Euplus nan vuông sẽ mang lại cho bạn những trải nghiệm tuyệt vời nhất trong chính căn bếp nhà mình bởi tính năng tiện dụng, thiết kế chắc chắn nhưng cũng không kém phần đẹp mắt; kèm theo đó còn có những chính sách khuyến mại và bảo hành hấp dẫn.\nThiết kế giá bát đĩa nâng hạ 2 tầng thông thoáng \nSản phẩm được thiết kế với 2 sàn đựng chuyên biệt. Sàn dưới thiết kế nan chữ V ngược úp đĩa gọn gàng, tiện lợi. Sàn trên thiết kế nan thông thoáng giúp việc úp bát dễ dàng hơn, không bị đọng nước hay ẩm ướt.\nChất liệu Inox 304 bền đẹp, trường tồn với thời gian \nGiá bát đĩa nâng hạ  Euplus nan vuông được làm từ chất liệu inox 304 theo tiêu chuẩn Nhật Bản JISG4303, khẳng định chất lượng bền bỉ, trường tồn với thời gian.\nCơ cấu giảm chấn thông minh \nBạn sẽ không còn lo lắng bát đĩa bị va chạm mỗi khi nâng lên hay hạ xuống. Cơ cấu giảm chấn luôn hoạt động một cách hiệu quả giúp bát đĩa luôn ổn định khi nâng hạ, sắp xếp.\n2 nút trợ lực thiết kế linh hoạt \nSản phẩm có tải trọng 12kg rất vững chãi và chắc chắn, bạn có thể điều chỉnh 2 nút ở hai bên của bộ cơ cấu để tăng mức trợ lực từ 5 – 12kg.\nKhay nhựa đựng nước và ngăn để đĩa tiện dụng \nSản phẩm được thiết kế bởi 2 khay đựng nước cho 2 tầng trên và dưới, giúp bát đĩa nhà bạn luôn khô ráo, sạch sẽ. Ngăn để bát đĩa được thiết kế bởi chất liệu Inox cao cấp cực bền bỉ, nỗi lo rỉ sét sẽ không còn tồn tại với các bà nội trợ.\nPhụ kiện nhập khẩu chính hãng \nEuplus  là nhãn hàng phụ kiện bếp nổi tiếng và lâu đời chuyên cung cấp các sản phẩm chất lượng với mức giá hợp lý.\nMột vài lưu ý khi sử dụng giá bát đĩa nâng hạ \nNên vệ sinh định kỳ để giữ được sản phẩm inox luôn trắng sáng và kéo dài thời gian sử dụng cho sản phẩm.\nNên vệ sinh lau chùi bề mặt inox bằng những sản phẩm tẩy rửa chuyên dụng để tránh sự ăn mòn gây tổn hại đến bề mặt inox.\nKhông nên để nhiều bát đĩa bị quá so với trọng lượng tối đa của giá bát.","priceNum":8013000,"listPn":0,"salePn":8013000,"priceMode":"both","image":"https://grob-vn.com/wp-content/uploads/2025/10/Gia-bat-nang-ha-Euplus.jpg","images":["https://grob-vn.com/wp-content/uploads/2025/10/Gia-bat-nang-ha-Euplus.jpg"],"specs":{"Chất liệu":"Inox SUS304, tiêu chuẩn Nhật Bản JIS G4305","Kích thước":"765*300*650","Màu sắc":"Inox","Tải trọng":"12kg (6kg/tầng)"},"features":["Giá bát đĩa nâng hạ Euplus nan vuông được làm từ chất liệu inox 304 theo tiêu chuẩn Nhật Bản JISG4303, khẳng định chất lượng bền bỉ, trường tồn với thời gian.","Sản phẩm có tải trọng 12kg rất vững chãi và chắc chắn, bạn có thể điều chỉnh 2 nút ở hai bên của bộ cơ cấu để tăng mức trợ lực từ 5 – 12kg."],"model":"EV180","brand":"Euplus","category":"Giá bát nâng hạ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"ev180-gia-bat-nang-ha-800mm-euplus-ev180","_addedBy":"vai-add-product"},"GD0260E":{"name":"Giá bát đĩa, rổ nan dẹt, cánh kéo GD0260E","description":"Giá bát đĩa đa năng GD02E tích hợp thiết kế đa năng, GD02E không chỉ giúp sắp xếp bát đĩa gọn gàng mà còn phù hợp để lưu trữ các vật dụng bếp khác như ly, chén, hoặc nồi nhỏ","priceNum":3326400,"listPn":0,"salePn":3326400,"priceMode":"both","image":"https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%20%C4%91a%20n%C4%83ng%20GD02E%20(4).jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%20%C4%91a%20n%C4%83ng%20GD02E%20(4).jpg"],"specs":{},"features":[],"model":"GD0260E","brand":"Giá bát đĩa, rổ nan dẹt, cánh kéo GD0260E","category":"Giá bát đĩa đa năng","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gd0260e-gia-bat-dia-ro-nan-det-canh-keo-gd0260e","_addedBy":"vai-add-product"},"GTP0370":{"name":"Khay chia ngăn kéo nhựa cao cấp GTP0370","description":"Khay chia nhựa cao cấp GT03 màu xám Dùng đặt trong ngăn kéo tủ bếp, để dao, thìa, dĩa và dụng cụ nhà bếp. Hàng Garis chính hãng, giá tốt nhất!","priceNum":972000,"listPn":0,"salePn":972000,"priceMode":"both","image":"https://garis.vn/uploaded/Khay%20chia%20nh%E1%BB%B1a%20cao%20c%E1%BA%A5p%20GT03%20(3).jpg","images":["https://garis.vn/uploaded/Khay%20chia%20nh%E1%BB%B1a%20cao%20c%E1%BA%A5p%20GT03%20(3).jpg"],"specs":{},"features":[],"model":"GTP0370","brand":"Garis","category":"Khay chia nhựa ABS cao cấp ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gtp0370-khay-chia-ngan-keo-nhua-cao-cap-gtp0370","_addedBy":"vai-add-product"},"C112170":{"name":"C112170 | Grob | Giá Bát Nâng Hạ Nan Dẹt, Inox Xước Mờ Sus304 - cánh/phủ bì 112mm, lọt lòng 565mm","priceNum":10643000,"description":"GIÁ BÁT NÂNG HẠ NAN DẸT, INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"665*300*650 mm","Kích thước cánh/phủ bì":"112 mm","Khoang tủ/chiều rộng tủ":"112 mm","Kích thước lọt lòng/thực tế phụ kiện":"112 mm","Quy cách (Rộng x Sâu x Cao)":"R665 * S300 * C650 mm","kich_thuoc":"665 x 300 x 650mm","khoang_tu":"700mm"},"features":[],"images":["https://hsn.vn/images/stories/virtuemart/product/resized/gia-bat-dia-nang-ha-grob-gv304-170_300x0.jpg"],"image":"https://hsn.vn/images/stories/virtuemart/product/resized/gia-bat-dia-nang-ha-grob-gv304-170_300x0.jpg"},"GV304170":{"name":"GV304170 | Grob | Giá Bát Nâng Hạ Nan Dẹt, Inox Xước Mờ Sus304 - cánh/phủ bì 700mm, lọt lòng 665mm","priceNum":10643000,"description":"GIÁ BÁT NÂNG HẠ NAN DẸT, INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"665*300*650 mm","Khoang tủ":"700 mm","Kích thước cánh/phủ bì":"700 mm","Khoang tủ/chiều rộng tủ":"700 mm","Kích thước lọt lòng/thực tế phụ kiện":"700 mm","Quy cách (Rộng x Sâu x Cao)":"R665 * S300 * C650 mm","kich_thuoc":"665 x 300 x 650mm","khoang_tu":"700mm"},"features":[],"images":["https://hsn.vn/images/stories/virtuemart/product/resized/gia-bat-dia-nang-ha-grob-gv304-170_300x0.jpg"],"image":"https://hsn.vn/images/stories/virtuemart/product/resized/gia-bat-dia-nang-ha-grob-gv304-170_300x0.jpg"},"CS30471":{"name":"CS30471 | Grob | Kệ Đựng Xoong Nồi Nan Vuông Inox Xước Mờ Sus304 - cánh/phủ bì 700mm, lọt lòng 664mm","priceNum":2930000,"description":"KỆ ĐỰNG XOONG NỒI NAN VUÔNG INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"664*500*250 mm","Khoang tủ":"700 mm","Kích thước cánh/phủ bì":"700 mm","Khoang tủ/chiều rộng tủ":"700 mm","Kích thước lọt lòng/thực tế phụ kiện":"700 mm","Quy cách (Rộng x Sâu x Cao)":"R664 * S500 * C250 mm","kich_thuoc":"664 x 500 x 250mm","khoang_tu":"700mm"},"features":[],"images":["https://www.grobhcm.com/wp-content/uploads/2024/09/KE-CHEN-DIA-INOX-304-NAN-VUONG-GROB-800x533.jpg"],"image":"https://www.grobhcm.com/wp-content/uploads/2024/09/KE-CHEN-DIA-INOX-304-NAN-VUONG-GROB-800x533.jpg"}},"bigsale":[{"code":"TL869IMAX","name":"Bếp Từ Canzy CZTL869IMAX","category":"Bếp Từ Canzy CZ","price":"14.980.000","bigsale":"6.200.000","discount":"59%","status":"TỰ ĐỘNG","qty":1,"image":"https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png"},{"code":"SMI6ZCS16E","name":"MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E","category":"Máy rửa chén","price":"46.750.000","bigsale":"24.500.000","discount":"48%","status":"TỰ ĐỘNG","qty":1,"image":"https://boschs.com.vn/wp-content/uploads/2025/02/fef-Sao-chep.jpg"},{"code":"BD-1054HVOW","name":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","category":"Máy giặt / sấy","price":"10.990.000","bigsale":"5.990.000","discount":"45%","status":"TỰ ĐỘNG","qty":1,"image":"https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806.jpg"}],"combo":[{"name":"CZ D7OOB | Canzy | Máy hú + CZ IIQAM Serial 8.0 | Can","price":"9990000","items":[{"name":"CZ D7OOB | Canzy | Máy hút mùi âm tủ","sku":"CZD7OOB","price":5350000,"image":"https://huggingface.co/spaces/bep40/V.AISTUDIO/resolve/main/canzy_products_img/canzy_product_CZD7OOB.jpg"},{"name":"CZ IIQAM Serial 8.0 | Canzy | Máy rửa bát","sku":"CZIIQAMSerial80","price":18980000,"image":"https://huggingface.co/spaces/bep40/V.AISTUDIO/resolve/main/canzy_products_img/canzy_product_CZIIQAMSerial80.jpg"}]}]} \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index 251aab880387b26620edb973f2d85029f659d477..3caeea0121b08a21a73274b4143dd13a756c79e4 100644 --- a/dist/index.html +++ b/dist/index.html @@ -8,22 +8,10 @@ Semantic Image Field — Nội thất - - + + -
- \ No newline at end of file + diff --git a/dist/share/og-image.png b/dist/share/og-image.png deleted file mode 100644 index 90bf082850d448ca9b84673e05feb76cb6ba7249..0000000000000000000000000000000000000000 --- a/dist/share/og-image.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19cdbc5d1db636f590f7e22a480e88a3d81a0d81d91139b59ba40dde9048315c -size 984948 diff --git a/index.html b/index.html index 50a09d1fedfeec1be1c8bc01df95ca20490ace59..e2c91ae10a4a5966d6834706d290fe480bc820a0 100644 --- a/index.html +++ b/index.html @@ -4,77 +4,12 @@ - - - - - - - - - - - - - - - - - + - Thư viện tìm kiếm ảnh theo ngữ nghĩa ngôn ngữ tự nhiên | V.AI STUDIO - - - - - - - - - + Semantic Image Field — Nội thất + +
diff --git a/package-lock.json b/package-lock.json index 767333137c122e6303bda0b04c63a978752eb580..711824af2f48d1cff1a87af00de03545ce7161e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,6 @@ "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.7", "globals": "^17.12.0", - "playwright": "^1.63.0", "vite": "^8.3.0" }, "engines": { @@ -4346,35 +4345,6 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "license": "MIT" }, - "node_modules/playwright": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", - "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.63.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/playwright-core": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", - "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", diff --git a/package.json b/package.json index 9b51b0c57edc79930ae81b91d1cd599e33f00db4..b9d6d81d5620b03a012be9189ddd8ca26d55202b 100644 --- a/package.json +++ b/package.json @@ -6,12 +6,7 @@ "scripts": { "dev": "vite", "build": "vite build", - "preview": "vite preview", - "test": "node scripts/test-avatar-interiors.mjs", - "test:ui": "node scripts/test-neon-ui.mjs", - "sync:catalogue": "node scripts/sync-catalogue.mjs", - "refresh:catalogue": "node scripts/refresh-catalogue.mjs", - "seed:catalogue": "node scripts/seed-catalogue.mjs" + "preview": "vite preview" }, "dependencies": { "@huggingface/transformers": "4.3.0", @@ -32,7 +27,6 @@ "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.7", "globals": "^17.12.0", - "playwright": "^1.63.0", "vite": "^8.3.0" }, "engines": { diff --git a/products-index.json b/products-index.json index 15dfbec9bf5a0481c9139a0052ac179492dfc3df..146da5d2f0441d2390baeb479c42292d9c71cc9b 100644 --- a/products-index.json +++ b/products-index.json @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ce355fb48dbd036fbc775a15edcfc6b1ea3f261748fad9ec6311c0ec93984ac -size 4371102 +oid sha256:871670ad80cfc7409cb00d14665a2a6ef76b9a53f0ad79c7790b174d131d907b +size 3155324 diff --git a/public/brand/vaistudio_center.png b/public/brand/vaistudio_center.png deleted file mode 100644 index 8ab6d3d5bb7b3ea8718087e8bdab5ebcd849f4bc..0000000000000000000000000000000000000000 --- a/public/brand/vaistudio_center.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00d1a10cdcb4e150b51ae6636b9a06c4aa184c9ff72f2a65c84636dcde08b513 -size 656398 diff --git a/public/catalogue/products.json b/public/catalogue/products.json deleted file mode 100644 index a605a69c945e32d8246715ee98e44b51a5d5ce48..0000000000000000000000000000000000000000 --- a/public/catalogue/products.json +++ /dev/null @@ -1 +0,0 @@ -[{"n":"CS30471 | Grob | Kệ Đựng Xoong Nồi Nan Vuông Inox Xước Mờ Sus304 - cánh/phủ bì 700mm, lọt lòng 664mm","l":"","i":"https://www.grobhcm.com/wp-content/uploads/2024/09/KE-CHEN-DIA-INOX-304-NAN-VUONG-GROB-800x533.jpg","p":"2.930.000đ","pn":2930000,"listPn":0,"salePn":2930000,"priceMode":"sale","c":"","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://www.grobhcm.com/wp-content/uploads/2024/09/KE-CHEN-DIA-INOX-304-NAN-VUONG-GROB-800x533.jpg"],"sum":"KỆ ĐỰNG XOONG NỒI NAN VUÔNG INOX XƯỚC MỜ SUS304","desc":"KỆ ĐỰNG XOONG NỒI NAN VUÔNG INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"664*500*250 mm","Khoang tủ":"700 mm","Kích thước cánh/phủ bì":"700 mm","Khoang tủ/chiều rộng tủ":"700 mm","Kích thước lọt lòng/thực tế phụ kiện":"700 mm","Quy cách (Rộng x Sâu x Cao)":"R664 * S500 * C250 mm","kich_thuoc":"664 x 500 x 250mm","khoang_tu":"700mm"},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"san-pham","_source":"avatar2-bulk-import","_added_at":"2026-10-17T04:24:42.738Z"},{"n":"Khay chia ngăn kéo nhựa cao cấp GTP0370","l":"https://garis.vn/khay-chia-nhua-cao-cap-gt03.html","i":"https://garis.vn/uploaded/Khay%20chia%20nh%E1%BB%B1a%20cao%20c%E1%BA%A5p%20GT03%20(3).jpg","p":"972.000đ","pn":972000,"listPn":0,"salePn":972000,"priceMode":"both","c":"Khay chia nhựa ABS cao cấp ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Khay%20chia%20nh%E1%BB%B1a%20cao%20c%E1%BA%A5p%20GT03%20(3).jpg"],"sum":"Khay chia nhựa cao cấp GT03 màu xám Dùng đặt trong ngăn kéo tủ bếp, để dao, thìa, dĩa và dụng cụ nhà bếp. Hàng Garis chính hãng, giá tốt nhất!","desc":"Khay chia nhựa cao cấp GT03 màu xám Dùng đặt trong ngăn kéo tủ bếp, để dao, thìa, dĩa và dụng cụ nhà bếp. Hàng Garis chính hãng, giá tốt nhất!","specs":{},"feats":[],"sku":"GTP0370","vid":"","mod":"GTP0370","brand":"Garis","slug":"gtp0370-khay-chia-ngan-keo-nhua-cao-cap-gtp0370","_source":"avatar2-add-product","_source_url":"https://garis.vn/khay-chia-nhua-cao-cap-gt03.html","_added_at":"2026-10-17T04:18:38.812Z"},{"n":"Giá bát đĩa, rổ nan dẹt, cánh kéo GD0260E","l":"https://garis.vn/gia-bat-dia-da-nang-gd02e.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%20%C4%91a%20n%C4%83ng%20GD02E%20(4).jpg","p":"3.326.400đ","pn":3326400,"listPn":0,"salePn":3326400,"priceMode":"both","c":"Giá bát đĩa đa năng","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%20%C4%91a%20n%C4%83ng%20GD02E%20(4).jpg"],"sum":"Giá bát đĩa đa năng GD02E tích hợp thiết kế đa năng, GD02E không chỉ giúp sắp xếp bát đĩa gọn gàng mà còn phù hợp để lưu trữ các vật dụng bếp khác như ly, chén, hoặc nồi nhỏ","desc":"Giá bát đĩa đa năng GD02E tích hợp thiết kế đa năng, GD02E không chỉ giúp sắp xếp bát đĩa gọn gàng mà còn phù hợp để lưu trữ các vật dụng bếp khác như ly, chén, hoặc nồi nhỏ","specs":{},"feats":[],"sku":"GD0260E","vid":"","mod":"GD0260E","brand":"Giá bát đĩa, rổ nan dẹt, cánh kéo GD0260E","slug":"gd0260e-gia-bat-dia-ro-nan-det-canh-keo-gd0260e","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-bat-dia-da-nang-gd02e.html","_added_at":"2026-10-17T04:18:34.767Z"},{"n":"Giá bát nâng hạ 800mm Euplus EV180","l":"https://grob-vn.com/san-pham/gia-bat-nang-ha-800mm-euplus-ev-i80/","i":"https://grob-vn.com/wp-content/uploads/2025/10/Gia-bat-nang-ha-Euplus.jpg","p":"8.013.000đ","pn":8013000,"listPn":0,"salePn":8013000,"priceMode":"both","c":"Giá bát nâng hạ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grob-vn.com/wp-content/uploads/2025/10/Gia-bat-nang-ha-Euplus.jpg"],"sum":"Giá bát nâng hạ 800mm Euplus EV.180 \nMÔ TẢ SẢN PHẨM \n+ Chất liệu : Inox SUS304, tiêu chuẩn Nhật Bản JIS G4305\n+ Kích thước : 765*300*650\n+  Màu sắc : Inox\n+ Tải trọng: 12kg (6kg/tầng)\n+ Bảo hành sản phẩm 24 tháng, bảo hành hoen gỉ 15 năm\nXem thêm: Phụ kiện bếp Euplus – Hotline: 0988 078 900 \nGiá bát đĩa nâng hạ Euplus nan vuông – Chất lượng đảm bảo – Không lo về giá!\nGiá bát đĩa nâng hạ Euplus  là dòng sản phẩm được đại đa số người tiêu dùng lựa chọn với thương hiệu đã được khẳng định trên thị trường, chi phí vô cùng hợp lý và dịch vụ bảo hành nhanh chóng, chuyên nghiệp.\nPhụ kiện bếp hiện đại  không chỉ mang lại cho bạn sự tiện lợi mà còn giúp “nâng tầm đẳng cấp” cho căn bếp nhà bạn.  Giá bát đĩa nâng hạ  là một trong Top 11 những phụ kiện tủ bếp thông minh được người tiêu dùng lựa chọn nhiều nhất cho tủ bếp gia đình.\nGiá bát đĩa nâng hạ Euplus nan vuông sẽ mang lại cho bạn những trải nghiệm tuyệt vời nhất trong chính căn bếp nhà mình bởi tính năng tiện dụng, thiết kế chắc chắn nhưng cũng không kém phần đẹp mắt; kèm theo đó còn có những chính sách khuyến mại và bảo hành hấp dẫn.\nThiết kế giá bát đĩa nâng hạ 2 tầng thông thoáng \nSản phẩm được thiết kế với 2 sàn đựng chuyên biệt. Sàn dưới thiết kế nan chữ V ngược úp đĩa gọn gàng, tiện lợi. Sàn trên thiết kế nan thông thoáng giúp việc úp bát dễ dàng hơn, không bị đọng nước hay ẩm ướt.\nChất liệu Inox 304 bền đẹp, trường tồn với thời gian \nGiá bát đĩa nâng hạ  Euplus nan vuông được làm từ chất liệu inox 304 theo tiêu chuẩn Nhật Bản JISG4303, khẳng định chất lượng bền bỉ, trường tồn với thời gian.\nCơ cấu giảm chấn thông minh \nBạn sẽ không còn lo lắng bát đĩa bị va chạm mỗi khi nâng lên hay hạ xuống. Cơ cấu giảm chấn luôn hoạt động một cách hiệu quả giúp bát đĩa luôn ổn định khi nâng hạ, sắp xếp.\n2 nút trợ lực thiết kế linh hoạt \nSản phẩm có tải trọng 12kg rất vững chãi và chắc chắn, bạn có thể điều chỉnh 2 nút ở hai bên của bộ cơ cấu để tăng mức trợ lực từ 5 – 12kg.\nKhay nhựa đựng nước và ngăn để đĩa tiện dụng \nSản phẩm được thiết kế bởi 2 khay đựng nước cho 2 tầng trên và dưới, giúp bát đĩa nhà bạn luôn khô ráo, sạch sẽ. Ngăn để bát đĩa được thiết kế bởi chất liệu Inox cao cấp cực bền bỉ, nỗi lo rỉ sét sẽ không còn tồn tại với các bà nội trợ.\nPhụ kiện nhập khẩu chính hãng \nEuplus  là nhãn hàng phụ kiện bếp nổi tiếng và lâu đời chuyên cung cấp các sản phẩm chất lượng với mức giá hợp lý.\nMột vài lưu ý khi sử dụng giá bát đĩa nâng hạ \nNên vệ sinh định kỳ để giữ được sản phẩm inox luôn trắng sáng và kéo dài thời gian sử dụng cho sản phẩm.\nNên vệ sinh lau chùi bề mặt inox bằng những sản phẩm tẩy rửa chuyên dụng để tránh sự ăn mòn gây tổn hại đến bề mặt inox.\nKhông nên để nhiều bát đĩa bị quá so với trọng lượng tối đa của giá bát.","desc":"Giá bát nâng hạ 800mm Euplus EV.180 \nMÔ TẢ SẢN PHẨM \n+ Chất liệu : Inox SUS304, tiêu chuẩn Nhật Bản JIS G4305\n+ Kích thước : 765*300*650\n+  Màu sắc : Inox\n+ Tải trọng: 12kg (6kg/tầng)\n+ Bảo hành sản phẩm 24 tháng, bảo hành hoen gỉ 15 năm\nXem thêm: Phụ kiện bếp Euplus – Hotline: 0988 078 900 \nGiá bát đĩa nâng hạ Euplus nan vuông – Chất lượng đảm bảo – Không lo về giá!\nGiá bát đĩa nâng hạ Euplus  là dòng sản phẩm được đại đa số người tiêu dùng lựa chọn với thương hiệu đã được khẳng định trên thị trường, chi phí vô cùng hợp lý và dịch vụ bảo hành nhanh chóng, chuyên nghiệp.\nPhụ kiện bếp hiện đại  không chỉ mang lại cho bạn sự tiện lợi mà còn giúp “nâng tầm đẳng cấp” cho căn bếp nhà bạn.  Giá bát đĩa nâng hạ  là một trong Top 11 những phụ kiện tủ bếp thông minh được người tiêu dùng lựa chọn nhiều nhất cho tủ bếp gia đình.\nGiá bát đĩa nâng hạ Euplus nan vuông sẽ mang lại cho bạn những trải nghiệm tuyệt vời nhất trong chính căn bếp nhà mình bởi tính năng tiện dụng, thiết kế chắc chắn nhưng cũng không kém phần đẹp mắt; kèm theo đó còn có những chính sách khuyến mại và bảo hành hấp dẫn.\nThiết kế giá bát đĩa nâng hạ 2 tầng thông thoáng \nSản phẩm được thiết kế với 2 sàn đựng chuyên biệt. Sàn dưới thiết kế nan chữ V ngược úp đĩa gọn gàng, tiện lợi. Sàn trên thiết kế nan thông thoáng giúp việc úp bát dễ dàng hơn, không bị đọng nước hay ẩm ướt.\nChất liệu Inox 304 bền đẹp, trường tồn với thời gian \nGiá bát đĩa nâng hạ  Euplus nan vuông được làm từ chất liệu inox 304 theo tiêu chuẩn Nhật Bản JISG4303, khẳng định chất lượng bền bỉ, trường tồn với thời gian.\nCơ cấu giảm chấn thông minh \nBạn sẽ không còn lo lắng bát đĩa bị va chạm mỗi khi nâng lên hay hạ xuống. Cơ cấu giảm chấn luôn hoạt động một cách hiệu quả giúp bát đĩa luôn ổn định khi nâng hạ, sắp xếp.\n2 nút trợ lực thiết kế linh hoạt \nSản phẩm có tải trọng 12kg rất vững chãi và chắc chắn, bạn có thể điều chỉnh 2 nút ở hai bên của bộ cơ cấu để tăng mức trợ lực từ 5 – 12kg.\nKhay nhựa đựng nước và ngăn để đĩa tiện dụng \nSản phẩm được thiết kế bởi 2 khay đựng nước cho 2 tầng trên và dưới, giúp bát đĩa nhà bạn luôn khô ráo, sạch sẽ. Ngăn để bát đĩa được thiết kế bởi chất liệu Inox cao cấp cực bền bỉ, nỗi lo rỉ sét sẽ không còn tồn tại với các bà nội trợ.\nPhụ kiện nhập khẩu chính hãng \nEuplus  là nhãn hàng phụ kiện bếp nổi tiếng và lâu đời chuyên cung cấp các sản phẩm chất lượng với mức giá hợp lý.\nMột vài lưu ý khi sử dụng giá bát đĩa nâng hạ \nNên vệ sinh định kỳ để giữ được sản phẩm inox luôn trắng sáng và kéo dài thời gian sử dụng cho sản phẩm.\nNên vệ sinh lau chùi bề mặt inox bằng những sản phẩm tẩy rửa chuyên dụng để tránh sự ăn mòn gây tổn hại đến bề mặt inox.\nKhông nên để nhiều bát đĩa bị quá so với trọng lượng tối đa của giá bát.","specs":{"Chất liệu":"Inox SUS304, tiêu chuẩn Nhật Bản JIS G4305","Kích thước":"765*300*650","Màu sắc":"Inox","Tải trọng":"12kg (6kg/tầng)"},"feats":["Giá bát đĩa nâng hạ Euplus nan vuông được làm từ chất liệu inox 304 theo tiêu chuẩn Nhật Bản JISG4303, khẳng định chất lượng bền bỉ, trường tồn với thời gian.","Sản phẩm có tải trọng 12kg rất vững chãi và chắc chắn, bạn có thể điều chỉnh 2 nút ở hai bên của bộ cơ cấu để tăng mức trợ lực từ 5 – 12kg."],"sku":"EV180","vid":"","mod":"EV180","brand":"Euplus","slug":"ev180-gia-bat-nang-ha-800mm-euplus-ev180","_source":"avatar2-add-product","_source_url":"https://grob-vn.com/san-pham/gia-bat-nang-ha-800mm-euplus-ev-i80/","_added_at":"2026-10-17T04:18:14.374Z"},{"n":"Giá Bát Đĩa Đa Năng Euplus Inox 304, Nan Vuông EV80","l":"https://euplus.com.vn/gia-bat-dia-da-nang-euplus-ev80-inox-304-nan-vuong/","i":"https://euplus.com.vn/wp-content/uploads/2021/03/BAT-DA-NANG-1.jpg","p":"2.937.000đ","pn":2937000,"listPn":0,"salePn":2937000,"priceMode":"both","c":"Giá Để Xoong Nồi Chén Dĩa","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://euplus.com.vn/wp-content/uploads/2021/03/BAT-DA-NANG-1.jpg"],"sum":"Nội dung chính\nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở Đặc điểm nổi bật : \nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở\nGiá bát đĩa đa năng Euplus EV Inox 304 xước mờ cánh mở nan vuông  là  Phụ kiện tủ bế p  được nhập khẩu chính hãng từ thương hiệu nổi tiếng Euplus. Thiết kế của sản phẩm tuy đơn giản nhưng rất sang trọng và hiện đại, nổi bật với các thanh inox sáng bóng không tì vết.\nĐặc điểm nổi bật :\nChất liệu làm bằng inox nan theo tiêu chuẩn Nhật Bản JIS G4303 cao cấp chống gỉ bền bỉ theo thời gian.\nSàn để úp bát đĩa tiện dụng, có thể dùng đề đồ khô và các vật dụng khác trong không gian bếp\nCó khay hứng nước để khi úp trực tiếp xoong nồi ướt nước không bị rây ra ngoài, khay hứng nước được tháo lắp dễ dàng.\nTích hợp bộ ray giảm chấn có tác dụng đóng mở nhẹ nhàng, không gây tiếng ồn.","desc":"Nội dung chính\nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở Đặc điểm nổi bật : \nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở\nGiá bát đĩa đa năng Euplus EV Inox 304 xước mờ cánh mở nan vuông  là  Phụ kiện tủ bế p  được nhập khẩu chính hãng từ thương hiệu nổi tiếng Euplus. Thiết kế của sản phẩm tuy đơn giản nhưng rất sang trọng và hiện đại, nổi bật với các thanh inox sáng bóng không tì vết.\nĐặc điểm nổi bật :\nChất liệu làm bằng inox nan theo tiêu chuẩn Nhật Bản JIS G4303 cao cấp chống gỉ bền bỉ theo thời gian.\nSàn để úp bát đĩa tiện dụng, có thể dùng đề đồ khô và các vật dụng khác trong không gian bếp\nCó khay hứng nước để khi úp trực tiếp xoong nồi ướt nước không bị rây ra ngoài, khay hứng nước được tháo lắp dễ dàng.\nTích hợp bộ ray giảm chấn có tác dụng đóng mở nhẹ nhàng, không gây tiếng ồn.","specs":{"Bảo hành":"20 năm rỉ rổ và bảo hành khác 2 năm","Thương hiệu":"EUPLUS","Xuất xứ":"Việt Nam","Kích thước":"800mm"},"feats":["Thông số kỹ thuật","Đánh giá (0)","Giá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở Đặc điểm nổi bật :","Chất liệu làm bằng inox nan theo tiêu chuẩn Nhật Bản JIS G4303 cao cấp chống gỉ bền bỉ theo thời gian.","Sàn để úp bát đĩa tiện dụng, có thể dùng đề đồ khô và các vật dụng khác trong không gian bếp","Có khay hứng nước để khi úp trực tiếp xoong nồi ướt nước không bị rây ra ngoài, khay hứng nước được tháo lắp dễ dàng.","Tích hợp bộ ray giảm chấn có tác dụng đóng mở nhẹ nhàng, không gây tiếng ồn."],"sku":"EV80","vid":"","mod":"EV80","brand":"EUPLUS","slug":"ev80-gia-bat-dia-da-nang-euplus-inox-304-nan-vuong-ev80","_source":"avatar2-add-product","_source_url":"https://euplus.com.vn/gia-bat-dia-da-nang-euplus-ev80-inox-304-nan-vuong/","_added_at":"2026-10-17T04:18:08.785Z"},{"n":"Giá gia vị, chai lọ, rổ nan dẹt, cánh kéo GKE225","l":"https://garis.vn/gia-gia-vi-chai-lo-gk02-25e-new.html?srsltid=AU7gw4We5Dd2JvtvXEV1w7N-jCSaO5si1kA9RBWlBZ2Nx7j80GG5_y7x","i":"https://garis.vn/uploaded/GK02_25E%201.jpg","p":"3.942.000đ","pn":3942000,"listPn":0,"salePn":3942000,"priceMode":"both","c":"Giá gia vị, chai lọ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/GK02_25E%201.jpg"],"sum":"Giá gia vị, chai lọ GK02.30E (new) thiết kế thông minh, tiện ích, chất liệu cao cấp, giúp sắp xếp gọn gàng, tối ưu không gian bếp hiện đại.","desc":"Giá gia vị, chai lọ GK02.30E (new) thiết kế thông minh, tiện ích, chất liệu cao cấp, giúp sắp xếp gọn gàng, tối ưu không gian bếp hiện đại.","specs":{},"feats":[],"sku":"GKE225001","vid":"","mod":"GKE225001","brand":"Garis","slug":"gke225001-gia-gia-vi-chai-lo-ro-nan-det-canh-keo-gke225","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-gia-vi-chai-lo-gk02-25e-new.html?srsltid=AU7gw4We5Dd2JvtvXEV1w7N-jCSaO5si1kA9RBWlBZ2Nx7j80GG5_y7x","_added_at":"2026-10-17T04:18:05.632Z"},{"n":"Giá dao thớt, gia vị, chai lọ, rổ nan dẹt cánh kéo GME230","l":"https://garis.vn/gia-dao-thot-chai-lo-gm02-30e.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20dao%20th%E1%BB%9Bt%2C%20chai%20l%E1%BB%8D%20GM02%2030E%20(3).jpg","p":"3.996.000đ","pn":3996000,"listPn":0,"salePn":3996000,"priceMode":"both","c":"Giá dao thớt, gia vị, chai lọ, rổ nan dẹt, cánh kéo","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20dao%20th%E1%BB%9Bt%2C%20chai%20l%E1%BB%8D%20GM02%2030E%20(3).jpg"],"sum":"Giá dao thớt, chai lọ GM02.30E Nan dẹt, inox 304, bề mặt điện hóa xước mờ, dùng cho cánh kéo, ray giảm chấn hiệu quả, bền bỉ và sang trọng. Mua hàng chính hãng tại Garis Việt Nam!","desc":"Giá dao thớt, chai lọ GM02.30E Nan dẹt, inox 304, bề mặt điện hóa xước mờ, dùng cho cánh kéo, ray giảm chấn hiệu quả, bền bỉ và sang trọng. Mua hàng chính hãng tại Garis Việt Nam!","specs":{},"feats":["Giá dao thớt, chai lọ có hệ thống bắt mặt cánh tủ dạng 3D duy nhất trên thị trường. Điều này mang lại sự ổn định và độ chắc chắn cho giá dao thớt, chai lọ khi sử dụng.","Giá dao thớt, chai lọ đi kèm với rổ phụ gia vị có thể nhấc ra dễ dàng. Điều này giúp tiện lợi trong việc lấy và sắp xếp các chai lọ và phụ gia vị."],"sku":"GM0230E","vid":"","mod":"GM0230E","brand":"Garis","slug":"gm0230e-gia-dao-thot-gia-vi-chai-lo-ro-nan-det-canh-keo-gme230","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-dao-thot-chai-lo-gm02-30e.html","_added_at":"2026-10-17T04:18:03.036Z"},{"n":"Hệ khay chia thìa đũa độc lập GT0370AG","l":"https://garis.vn/he-khay-chia-thia-dua-doc-lap-gt03ag.html","i":"https://garis.vn/uploaded/GT03_6AG%20(1).jpg","p":"4.201.200đ","pn":4201200,"listPn":0,"salePn":4201200,"priceMode":"both","c":"Hệ khay chia thìa đũa độc lập GTAG3","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/GT03_6AG%20(1).jpg"],"sum":"Thanh chia có thể tháo rời, chỉnh khoảng cách linh hoạt Khung bằng nhôm hàng không AA (Aviation Aluminium) Đáy có tấm chống trơn trượt Tải trọng 25kg Bảo hành 24 tháng, bảo hành gì 20 năm","desc":"Thanh chia có thể tháo rời, chỉnh khoảng cách linh hoạt Khung bằng nhôm hàng không AA (Aviation Aluminium) Đáy có tấm chống trơn trượt Tải trọng 25kg Bảo hành 24 tháng, bảo hành gì 20 năm","specs":{},"feats":[],"sku":"GT0370AG","vid":"","mod":"GT0370AG","brand":"Garis","slug":"gt0370ag-he-khay-chia-thia-dua-doc-lap-gt0370ag","_source":"avatar2-add-product","_source_url":"https://garis.vn/he-khay-chia-thia-dua-doc-lap-gt03ag.html","_added_at":"2026-10-17T04:17:59.609Z"},{"n":"Giá xoong nồi + bát đĩa, rổ nan oval, cánh mở hoặc kéo GD0470N","l":"https://garis.vn/gia-xoong-noi-bat-dia-md04n.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%2C%20b%C3%A1t%20%C4%91%C4%A9a%20MD04N%20(1).jpg","p":"3.985.200đ","pn":3985200,"listPn":0,"salePn":3985200,"priceMode":"both","c":"Giá xoong nồi + bát đĩa, rổ nan oval, cánh mở hoặc kéo GDN4","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%2C%20b%C3%A1t%20%C4%91%C4%A9a%20MD04N%20(1).jpg"],"sum":"Thiết kế thông minh với nhiều ngăn chứa rộng rãi, phù hợp với nhiều loại xoong nồi, bát đĩa khác nhau. MD04N không chỉ mang đến sự tiện lợi tối ưu mà còn góp phần tăng tính thẩm mỹ cho căn bếp hiện đại.","desc":"Thiết kế thông minh với nhiều ngăn chứa rộng rãi, phù hợp với nhiều loại xoong nồi, bát đĩa khác nhau. MD04N không chỉ mang đến sự tiện lợi tối ưu mà còn góp phần tăng tính thẩm mỹ cho căn bếp hiện đại.","specs":{},"feats":[],"sku":"GD0470N","vid":"","mod":"GD0470N","brand":"Garis","slug":"gd0470n-gia-xoong-noi-bat-dia-ro-nan-oval-canh-mo-hoac-keo-gd0470n","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-xoong-noi-bat-dia-md04n.html","_added_at":"2026-10-17T04:17:56.919Z"},{"n":"Giá bát đĩa, thìa đũa vách hộp, rổ nan oval, cánh kéo MDV0260","l":"https://garis.vn/gia-bat-dia-thia-dua-vach-hop-md02v.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%2C%20th%C3%ACa%20%C4%91%C5%A9a%20v%C3%A1ch%20h%E1%BB%99p%20MD02V%20(3).jpg","p":"6.685.200đ","pn":6685200,"listPn":0,"salePn":6685200,"priceMode":"both","c":"Giá bát đĩa, thìa đũa vách hộp MDV2 màu Titan chính hãng","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%2C%20th%C3%ACa%20%C4%91%C5%A9a%20v%C3%A1ch%20h%E1%BB%99p%20MD02V%20(3).jpg"],"sum":"Thiết kế vách hộp tiện lợi, giúp phân chia không gian lưu trữ hiệu quả, phù hợp với mọi không gian bếp. MD02V mang đến sự tiện nghi và tính thẩm mỹ cao cho căn bếp của bạn.","desc":"Thiết kế vách hộp tiện lợi, giúp phân chia không gian lưu trữ hiệu quả, phù hợp với mọi không gian bếp. MD02V mang đến sự tiện nghi và tính thẩm mỹ cao cho căn bếp của bạn.","specs":{},"feats":[],"sku":"MDV0260","vid":"","mod":"MDV0260","brand":"Garis","slug":"mdv0260-gia-bat-dia-thia-dua-vach-hop-ro-nan-oval-canh-keo-mdv0260","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-bat-dia-thia-dua-vach-hop-md02v.html","_added_at":"2026-10-17T04:17:36.542Z"},{"n":"Giá xoong nồi vách hộp, rổ nan oval, cánh kéo MPV0260","l":"https://garis.vn/gia-xoong-noi-vach-hop-mp02v.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%20v%C3%A1ch%20h%E1%BB%99p%20MP02V%20(1).jpg","p":"6.145.200đ","pn":6145200,"listPn":0,"salePn":6145200,"priceMode":"both","c":"Giá xoong nồi vách hộp MPV2 cánh kéo màu Titan MV Series","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%20v%C3%A1ch%20h%E1%BB%99p%20MP02V%20(1).jpg"],"sum":"Với thiết kế vách hộp thông minh, giúp phân chia không gian lưu trữ hiệu quả, MP02V giúp tiết kiệm diện tích bếp, đồng thời giữ cho các dụng cụ bếp luôn trong tầm tay khi cần sử dụng","desc":"Với thiết kế vách hộp thông minh, giúp phân chia không gian lưu trữ hiệu quả, MP02V giúp tiết kiệm diện tích bếp, đồng thời giữ cho các dụng cụ bếp luôn trong tầm tay khi cần sử dụng","specs":{},"feats":[],"sku":"MPV0260","vid":"","mod":"MPV0260","brand":"Garis","slug":"mpv0260-gia-xoong-noi-vach-hop-ro-nan-oval-canh-keo-mpv0260","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-xoong-noi-vach-hop-mp02v.html","_added_at":"2026-10-17T04:17:33.673Z"},{"n":"Bếp Từ Canzy CZTL869IMAX","l":"https://khobep.vn/bep-tu-canzy-cz-tl869imax","i":"https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","p":"Giá niêm yết: 14.980.000đ — Giá KM: 6.200.000đ","pn":6200000,"listPn":14980000,"salePn":6200000,"priceMode":"both","c":"Bếp Từ Canzy CZ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742205457-be482ddf736ace36ea7308fe3a2b6806.jpg","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742322070-a36944508c279d6b99c2ae58d77621bd.jpg","https://bizweb.dktcdn.net/100/344/152/products/1-4dfb6f78-f7ff-4322-b4fb-70815e12b95f.png","https://bizweb.dktcdn.net/100/344/152/products/2-59f34d91-4f3f-4477-a43b-2cac5dae561a.png"],"sum":"BẾP TỪ ĐÔI CANZY CZ TL869I MAX Canzy CZ TL869I MAX là dòng bếp từ đôi cao cấp hội tụ những tính năng hiện đại nhất, mang lại trải nghiệm nấu nướng an toàn, nhanh chóng và cực kỳ tiết kiệm điện năng cho gia đình bạn. ĐẶC ĐIỂM NỔI BẬT VỀ THIẾT KẾ Mặt kính Kanger vát cạnh tinh tế: Được bo viền nhôm 4 cạnh chắc chắn, vừa t","desc":"BẾP TỪ ĐÔI CANZY CZ TL869I MAX Canzy CZ TL869I MAX là dòng bếp từ đôi cao cấp hội tụ những tính năng hiện đại nhất, mang lại trải nghiệm nấu nướng an toàn, nhanh chóng và cực kỳ tiết kiệm điện năng cho gia đình bạn. ĐẶC ĐIỂM NỔI BẬT VỀ THIẾT KẾ Mặt kính Kanger vát cạnh tinh tế: Được bo viền nhôm 4 cạnh chắc chắn, vừa t","specs":{},"feats":[],"sku":"TL869IMAX","vid":"","mod":"TL869IMAX","brand":"Canzy","slug":"tl869imax-bep-tu-canzy-cztl869imax","_source":"avatar2-add-product","_source_url":"https://khobep.vn/bep-tu-canzy-cz-tl869imax","_added_at":"2026-10-19T06:23:59.773Z"},{"n":"Máy rửa bát độc lập Bosch SMS6ZCI16E serie 6","l":"https://bosch-house.com.vn/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6/?gad_source=1&gad_campaignid=22675708288&gbraid=0AAAAACJJNAhi1J59JZUupQPYnQt3j8jgI&gclid=CjwKCAjw25fWBhAVEiwAMopNjjt1tlze2nw3H4h06t2S5Jn34Ct9-EK5k8FQSeJtEYb9ApMh4A2IqhoC0h8QAvD_BwE","i":"https://b1.congngheviet.com.vn/file/s3-vn01/bosch-house-com-vn/wp-content/uploads/2024/01/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6.jpg","p":"Giá niêm yết: 28.790.000đ — Giá KM: 19.200.000đ","pn":19200000,"listPn":28790000,"salePn":19200000,"priceMode":"both","c":"Máy rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://b1.congngheviet.com.vn/file/s3-vn01/bosch-house-com-vn/wp-content/uploads/2024/01/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6.jpg"],"sum":"Máy rửa bát Bosch SMS6ZCI16E có xuất xứ từ Châu Âu được trang bị nhiều công nghệ hiện đại như Sấy Zeolith – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo…, mang đến cho người dùng những trải nghiệm hoàn toàn mới.\nĐặc điểm nổi bật của máy rửa bát Bosch SMS6ZCI16E \nThiết kế độc lập linh hoạt vị trí lắp đặt (có thể đặt âm). Máy được làm từ chất liệu thép không gỉ, bề mặt màu inox có lớp phủ chống bám vân tay. Tổng thể của chiếc máy giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn.\nBảng điều khiển đặt ở phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng.\nHệ thống phân phối viên rửa dosing assistant thông minh\nTự vệ sinh: tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo.\nẢnh thực tế của máy rửa bát độc lập Bosch SMS6ZCI16E serie 6 \nHệ thống khay rửa  \nHệ thống giàn rửa gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn.\nNgăn kéo VarioDrawer để đựng các đồ dùng nhỏ như đũa, thìa, dĩa…  Đồng thời giúp giải phóng và tăng diện tích chứa cho ngăn dưới cùng.\nHệ thống Rackmatic điều chỉnh chiều cao giàn rửa theo nhu cầu. Bạn có thể dễ dàng thay đổi vị trí độ cao giàn rửa thông qua khớp nâng hạ, ngay cả khi giàn chứa đang đầy.\nHệ thống vòi phun Extra Clean Zone: giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa.\nChương trình rửa  \n8 chương trình rửa: \nRửa Eco 50°C\nRửa tự động 45-65°C\nRửa thông minh (Intelligent)\nRửa chuyên sâu 70°C\nRửa nhanh 60°C (Express)\nRửa ly 40°C (Glass)\nRửa yên tĩnh 50°C\nRửa tráng (Favorite)\nBảng điều khiển của máy rửa bát độc lập Bosch SMS6ZCI16E  \nChương trình rửa đặc biệt \nTăng tốc độ rửa (SpeedPerfect Plus)\nRửa chuyên sâu (IntensiveZone)\nSấy tăng cường (Extra Dry)\nCông nghệ và cảm biến  \nExtra Dry (sấy tăng cường ): tăng nhiệt độ nước ở lần tráng cuối cùng và kéo dài thời gian sấy khô hơn. Đồng thời, các hạt nước đọng trên bát đĩa sẽ bốc hơi, ngưng tụ và rơi xuống đáy máy\nIntensiveZone (vùng rửa chuyên sâu) : được kích hoạt để tăng áp suất phun kết hợp nhiệt độ cao để rửa sạch hoàn toàn các vết bẩn cứng đầu, bám lâu ngày trên những vật dụng ở giàn dưới cùng.\nZeolith (công nghệ sấy Zeolith) : hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm giúp  bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn\nCông nghệ rửa thông minh , tối ưu quá trình rửa: máy sẽ tự động điều chỉnh các cài đặt và cung cấp một số lựa chọn thay thế cho người dùng\nHome Connect : giúp bạn dễ dàng điều khiển máy rửa bát mà không cần lại gần máy: lượng tiêu thụ điện nước và chất tẩy rửa, hoạt động của máy rửa bát\nCảm biến nước và cảm biến tải giúp tiết kiệm điện năng mà vẫn đảm bảo rửa sạch sẽ bát đũa\nĐộng cơ không chổi than hoạt động bền bỉ, tiếng ồn nhỏ không làm ảnh hưởng đến sinh hoạt của các thành viên khác trong gia đình\nHệ thống làm sạch sâu của máy rửa bát độc lập Bosch SMS6ZCI16E  \nHoạt động và tiêu thụ năng lượng  \nNhãn năng lượng: B\nĐiện / nước: 65 kWh / 9 liters\nThời gian Eco: 3h35′\nĐộ ồn: 40 dB\nNhãn độ ồn: B\nĐộ ồn yên lượng: 39 dB\nTính năng an toàn  \nKhóa trẻ em (ChildLock) : là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển.\nHệ thống AquaStop : là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài.\nHệ thống chống sét lan truyền : là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan.\nThông số kỹ kỹ thuật","desc":"Máy rửa bát Bosch SMS6ZCI16E có xuất xứ từ Châu Âu được trang bị nhiều công nghệ hiện đại như Sấy Zeolith – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo…, mang đến cho người dùng những trải nghiệm hoàn toàn mới.\nĐặc điểm nổi bật của máy rửa bát Bosch SMS6ZCI16E \nThiết kế độc lập linh hoạt vị trí lắp đặt (có thể đặt âm). Máy được làm từ chất liệu thép không gỉ, bề mặt màu inox có lớp phủ chống bám vân tay. Tổng thể của chiếc máy giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn.\nBảng điều khiển đặt ở phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng.\nHệ thống phân phối viên rửa dosing assistant thông minh\nTự vệ sinh: tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo.\nẢnh thực tế của máy rửa bát độc lập Bosch SMS6ZCI16E serie 6 \nHệ thống khay rửa  \nHệ thống giàn rửa gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn.\nNgăn kéo VarioDrawer để đựng các đồ dùng nhỏ như đũa, thìa, dĩa…  Đồng thời giúp giải phóng và tăng diện tích chứa cho ngăn dưới cùng.\nHệ thống Rackmatic điều chỉnh chiều cao giàn rửa theo nhu cầu. Bạn có thể dễ dàng thay đổi vị trí độ cao giàn rửa thông qua khớp nâng hạ, ngay cả khi giàn chứa đang đầy.\nHệ thống vòi phun Extra Clean Zone: giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa.\nChương trình rửa  \n8 chương trình rửa: \nRửa Eco 50°C\nRửa tự động 45-65°C\nRửa thông minh (Intelligent)\nRửa chuyên sâu 70°C\nRửa nhanh 60°C (Express)\nRửa ly 40°C (Glass)\nRửa yên tĩnh 50°C\nRửa tráng (Favorite)\nBảng điều khiển của máy rửa bát độc lập Bosch SMS6ZCI16E  \nChương trình rửa đặc biệt \nTăng tốc độ rửa (SpeedPerfect Plus)\nRửa chuyên sâu (IntensiveZone)\nSấy tăng cường (Extra Dry)\nCông nghệ và cảm biến  \nExtra Dry (sấy tăng cường ): tăng nhiệt độ nước ở lần tráng cuối cùng và kéo dài thời gian sấy khô hơn. Đồng thời, các hạt nước đọng trên bát đĩa sẽ bốc hơi, ngưng tụ và rơi xuống đáy máy\nIntensiveZone (vùng rửa chuyên sâu) : được kích hoạt để tăng áp suất phun kết hợp nhiệt độ cao để rửa sạch hoàn toàn các vết bẩn cứng đầu, bám lâu ngày trên những vật dụng ở giàn dưới cùng.\nZeolith (công nghệ sấy Zeolith) : hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm giúp  bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn\nCông nghệ rửa thông minh , tối ưu quá trình rửa: máy sẽ tự động điều chỉnh các cài đặt và cung cấp một số lựa chọn thay thế cho người dùng\nHome Connect : giúp bạn dễ dàng điều khiển máy rửa bát mà không cần lại gần máy: lượng tiêu thụ điện nước và chất tẩy rửa, hoạt động của máy rửa bát\nCảm biến nước và cảm biến tải giúp tiết kiệm điện năng mà vẫn đảm bảo rửa sạch sẽ bát đũa\nĐộng cơ không chổi than hoạt động bền bỉ, tiếng ồn nhỏ không làm ảnh hưởng đến sinh hoạt của các thành viên khác trong gia đình\nHệ thống làm sạch sâu của máy rửa bát độc lập Bosch SMS6ZCI16E  \nHoạt động và tiêu thụ năng lượng  \nNhãn năng lượng: B\nĐiện / nước: 65 kWh / 9 liters\nThời gian Eco: 3h35′\nĐộ ồn: 40 dB\nNhãn độ ồn: B\nĐộ ồn yên lượng: 39 dB\nTính năng an toàn  \nKhóa trẻ em (ChildLock) : là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển.\nHệ thống AquaStop : là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài.\nHệ thống chống sét lan truyền : là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan.\nThông số kỹ kỹ thuật","specs":{"Rất phù hợp với các loại món ăn":"Bình sữa trẻ em, Chảo nướng, Bát đĩa nửa tải, Nồi và chảo lớn, Hộp nhựa, Ly uống rượu (23cm)","Chiếu sáng nội thất":"Có","Chương trình giặt":"Chu kỳ tự động, tiết kiệm, chuyên sâu, ngắn, im lặng","Chức năng nửa tải":"–","Cảm biến tải":"–","Chức năng chu kỳ rút ngắn":"Có","Chiếu sàn":"KHÔNG","Giá đỡ dưới có chức năng nâng":"–","Phát hiện chất tẩy rửa":"Co","Nạp chất tẩy rửa máy rửa chén tự động":"–","Chỉ báo nạp muối":"Có","Chỉ báo nạp nước trợ xả":"Có","Tín hiệu kết thúc chu kỳ":"Có","Loại tín hiệu kết thúc chu kỳ":"Quang học","Khóa an toàn trẻ em":"Có","Chất lượng giặt":"Cao cấp","Số nhiệt độ làm sạch":"6","Nhiệt độ làm sạch tối đa":"70°C","Phương pháp sấy":"Zeolit ​​(bát khô thêm)","Vùng chuyên sâu":"Nhanh","Điều khiển qua ứng dụng":"Có","Điều khiển máy sấy qua ứng dụng":"Vận hành từ xa, Đọc thông tin qua ứng dụng","Bắt đầu trì hoãn":"Có","Bắt đầu phân chia độ trễ":"1 – 24 giờ","Tùy chọn tắt tự động":"Có","Ngôn ngữ bảng điều khiển":"Tiếng Anh, Ký hiệu","Nhãn năng lượng":"B","Chi phí năng lượng hàng năm":"72,8 euro","Tiêu thụ năng lượng hàng năm":"182 kWh","Tiêu thụ năng lượng trên mỗi chu kỳ":"0,65 kWh","Chức năng tiết kiệm năng lượng":"Tự động tắt, Chu trình tiết kiệm năng lượng, Cấp nước nóng, Lượng nước sử dụng được xác định theo mức độ bẩn","Thời lượng chu kỳ sinh thái":"215 phút","Chi phí nước hàng năm":"3,43 euro","Lượng nước sử dụng hàng năm":"2520 lít","Lượng nước sử dụng mỗi chu kỳ":"9 lít","Thân thiện với môi trường":"Đúng","Xây dựng chất lượng":"Cao cấp","Số lượng vòi phun tay phun":"2","Loại động cơ":"Biến tần","Chất liệu nội thất":"Thép không gỉ","Đầu nối nước":"Nước lạnh và nước ấm","Bảo vệ rò rỉ":"Có","Loại bảo vệ rò rỉ":"Cảm biến rò rỉ đáy, Bảo vệ chống tràn, Ống an toàn","Ống đầu vào có thể tháo rời":"–","Ống thoát nước có thể tháo rời":"–","Chiều dài ống đầu vào":"1,65 m","Loại nguồn điện":"Mạng lưới điện","Nguồn điện tối thiểu":"2400W"},"feats":["Bảng điều khiển đặt ở phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng.","Hệ thống phân phối viên rửa dosing assistant thông minh","Tự vệ sinh: tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo.","Ngăn kéo VarioDrawer để đựng các đồ dùng nhỏ như đũa, thìa, dĩa… Đồng thời giúp giải phóng và tăng diện tích chứa cho ngăn dưới cùng.","Hệ thống Rackmatic điều chỉnh chiều cao giàn rửa theo nhu cầu. Bạn có thể dễ dàng thay đổi vị trí độ cao giàn rửa thông qua khớp nâng hạ, ngay cả khi giàn chứa đang đầy."],"sku":"SMS6ZCI16E","vid":"","mod":"SMS6ZCI16E","brand":"Bosch","slug":"sms6zci16e-may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6","_source":"avatar2-add-product","_source_url":"https://bosch-house.com.vn/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6/?gad_source=1&gad_campaignid=22675708288&gbraid=0AAAAACJJNAhi1J59JZUupQPYnQt3j8jgI&gclid=CjwKCAjw25fWBhAVEiwAMopNjjt1tlze2nw3H4h06t2S5Jn34Ct9-EK5k8FQSeJtEYb9ApMh4A2IqhoC0h8QAvD_BwE","_added_at":"2026-10-19T06:24:05.655Z"},{"n":"Bếp Từ Canzy CZ","l":"https://khobep.vn/bep-tu-canzy-cz-tl869imax","i":"https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","p":"Giá niêm yết: 14.980.000đ — Giá KM: 6.200.000đ","pn":6200000,"listPn":14980000,"salePn":6200000,"priceMode":"both","c":"Bếp Từ Canzy CZ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742205457-be482ddf736ace36ea7308fe3a2b6806.jpg","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742322070-a36944508c279d6b99c2ae58d77621bd.jpg","https://bizweb.dktcdn.net/100/344/152/products/1-4dfb6f78-f7ff-4322-b4fb-70815e12b95f.png","https://bizweb.dktcdn.net/100/344/152/products/2-59f34d91-4f3f-4477-a43b-2cac5dae561a.png"],"sum":"BẾP TỪ ĐÔI CANZY CZ TL869I MAX Canzy CZ TL869I MAX là dòng bếp từ đôi cao cấp hội tụ những tính năng hiện đại nhất, mang lại trải nghiệm nấu nướng an toàn, nhanh chóng và cực kỳ tiết kiệm điện năng cho gia đình bạn. ĐẶC ĐIỂM NỔI BẬT VỀ THIẾT KẾ Mặt kính Kanger vát cạnh tinh tế: Được bo viền nhôm 4 cạnh chắc chắn, vừa t","desc":"BẾP TỪ ĐÔI CANZY CZ TL869I MAX Canzy CZ TL869I MAX là dòng bếp từ đôi cao cấp hội tụ những tính năng hiện đại nhất, mang lại trải nghiệm nấu nướng an toàn, nhanh chóng và cực kỳ tiết kiệm điện năng cho gia đình bạn. ĐẶC ĐIỂM NỔI BẬT VỀ THIẾT KẾ Mặt kính Kanger vát cạnh tinh tế: Được bo viền nhôm 4 cạnh chắc chắn, vừa t","specs":{},"feats":[],"sku":"TL869IMAX","vid":"","mod":"TL869IMAX","brand":"Canzy","slug":"tl869imax-bep-tu-canzy-cz","_source":"avatar2-add-product","_source_url":"https://khobep.vn/bep-tu-canzy-cz-tl869imax","_added_at":"2026-10-10T09:53:51.600Z"},{"n":"Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 Chính Hãng","l":"https://vattutonghopgiasi.com/voi-boss-co-dinh-co-tron-xoay-360-do-bv101/","i":"https://vattutonghopgiasi.com/wp-content/uploads/2026/07/voi-boss-co-dinh-co-tron-xoay-360-do-bv101-2.jpg","p":"1.740.000đ","pn":1740000,"listPn":0,"salePn":1740000,"priceMode":"both","c":"Chậu rửa, Vòi rửa","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://vattutonghopgiasi.com/wp-content/uploads/2026/07/voi-boss-co-dinh-co-tron-xoay-360-do-bv101-2.jpg"],"sum":"Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 là một thiết bị nhà bếp tối giản nhưng sở hữu hiệu năng vận hành ấn tượng và bền bỉ. Được chế tác từ chất liệu inox 304 mờ cao cấp kết hợp kiểu dáng cổ tròn mềm mại, dòng vòi cố định này mang lại sự vững chãi cùng tính linh hoạt tối đa cho bồn rửa bát. Đây chắc chắn là giải pháp tinh tế, dễ sử dụng giúp công việc nội trợ hằng ngày của gia đình bạn trở nên nhẹ nhàng hơn bao giờ hết.\nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nThông Số Kỹ Thuật Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nChất liệu cấu tạo: Inox 304 mờ cao cấp\nChức năng chính: Thân vòi cố định, cổ tròn xoay hướng 360 độ mượt mà\nChế độ nước: 2 đường nước Nóng và Lạnh liên hoàn\nChiều cao tổng thể từ chân vòi: 355 mm\nChiều cao từ mặt đá đến đầu xả nước: 250 mm\nKhoảng cách vươn vòi (Từ tâm thân vòi đến đầu vòi): 200 mm\nChiều cao phần bầu vòi cố định: 90 mm\nKích thước: Chân đế Ø50 mm / Thân dưới Ø45 mm / Thân trên Ø25 mm\nKích thước vòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nĐặc Điểm Nổi Bật Của Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \n1. Chất liệu Inox 304 mờ cao cấp \nSản phẩm được làm hoàn toàn từ chất liệu inox 304 mờ thượng hạng, đem lại độ bền vượt trội, chịu nhiệt tốt từ đường nước nóng và không lo hoen rỉ.\nBề mặt inox mờ có khả năng chống bám bẩn, hạn chế tối đa các vệt ố của nước cứng hay cặn dầu mỡ, giúp việc vệ sinh, lau chùi vòi nước bồn rửa bát hằng ngày trở nên cực kỳ đơn giản.\n2. Thiết kế cố định bền vững kết hợp tính năng xoay 360 độ linh hoạt \nCấu trúc cố định cứng cáp: Khác biệt với dòng dây rút, mẫu vòi rửa chén Boss mã BV101 sở hữu kết cấu thân cố định vững vàng, cho cảm giác sử dụng đầm tay, bền bỉ lâu dài và không lo các lỗi hỏng vặt.\nXoay hướng đa chiều: Cổ vòi tròn cong mềm mại có khả năng xoay 360 độ cực kỳ trơn tru, giúp bạn dễ dàng dẫn nước đến mọi góc của chậu rửa hoặc xoay gọn vòi sang một bên khi cần đặt các loại xoong nồi lớn vào bồn.\n3. Tích hợp 2 đường nước nóng lạnh tiện dụng \nDòng vòi rửa bát này tích hợp sẵn hai đường nước nóng và lạnh đáp ứng mọi nhu cầu sinh hoạt:\nNước nóng: Giúp rửa trôi dầu mỡ bám trên bát đĩa nhanh chóng, đồng thời hỗ trợ khử khuẩn đồ dùng nhà bếp một cách an toàn.\nNước lạnh: Tiện lợi cho công việc sơ chế thực phẩm, rửa dọn thông thường hằng ngày.\nHướng Dẫn Sử Dụng Và Lưu Ý Lắp Đặt Để Tăng Tuổi Thọ Vòi \nXả sạch đường ống trước khi lắp: Mở van cho nước chảy tự do từ 1 – 2 phút trước khi lắp vòi để đẩy sạch các loại cát sỏi, cặn bẩn xây dựng ra ngoài, tránh làm nghẹt lưới lọc đầu vòi.\nVệ sinh vòi đúng cách: Chỉ lau chùi thân vòi bằng khăn mềm ẩm hoặc nước rửa chén pha loãng. Tuyệt đối không dùng bùi nhùi sắt hoặc chất tẩy rửa có tính axit mạnh chà xát lên vòi để tránh gây trầy xước bề mặt inox mờ.\nThao tác gạt nước nhẹ nhàng: Gạt cần điều chỉnh lượng nước và nhiệt độ nóng lạnh với lực vừa phải, giúp lõi chia nước bên trong vòi vận hành êm ái, bền bỉ qua năm tháng.\nĐặt Mua Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 Chính Hãng Tại Đâu? \nVòi Boss Cố Định Cổ Tronfn Xoay 360 Độ BV101 hiện đang được phân phối chính hãng tại hệ thống của Vật tư tổng hợp giá sỉ , cam kết bảo đảm đầy đủ mọi quyền lợi tiêu dùng từ nhà sản xuất cùng chính sách độc quyền Bảo hành gỉ vĩnh viễn.\nLiên hệ ngay Hotline hoặc chat trực tiếp để được tư vấn kích thước chậu rửa phù hợp, nhận thông tin ưu đãi tốt nhất và hỗ trợ kỹ thuật lắp đặt nhanh chóng ngay hôm nay!","desc":"Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 là một thiết bị nhà bếp tối giản nhưng sở hữu hiệu năng vận hành ấn tượng và bền bỉ. Được chế tác từ chất liệu inox 304 mờ cao cấp kết hợp kiểu dáng cổ tròn mềm mại, dòng vòi cố định này mang lại sự vững chãi cùng tính linh hoạt tối đa cho bồn rửa bát. Đây chắc chắn là giải pháp tinh tế, dễ sử dụng giúp công việc nội trợ hằng ngày của gia đình bạn trở nên nhẹ nhàng hơn bao giờ hết.\nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nThông Số Kỹ Thuật Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nChất liệu cấu tạo: Inox 304 mờ cao cấp\nChức năng chính: Thân vòi cố định, cổ tròn xoay hướng 360 độ mượt mà\nChế độ nước: 2 đường nước Nóng và Lạnh liên hoàn\nChiều cao tổng thể từ chân vòi: 355 mm\nChiều cao từ mặt đá đến đầu xả nước: 250 mm\nKhoảng cách vươn vòi (Từ tâm thân vòi đến đầu vòi): 200 mm\nChiều cao phần bầu vòi cố định: 90 mm\nKích thước: Chân đế Ø50 mm / Thân dưới Ø45 mm / Thân trên Ø25 mm\nKích thước vòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nĐặc Điểm Nổi Bật Của Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \n1. Chất liệu Inox 304 mờ cao cấp \nSản phẩm được làm hoàn toàn từ chất liệu inox 304 mờ thượng hạng, đem lại độ bền vượt trội, chịu nhiệt tốt từ đường nước nóng và không lo hoen rỉ.\nBề mặt inox mờ có khả năng chống bám bẩn, hạn chế tối đa các vệt ố của nước cứng hay cặn dầu mỡ, giúp việc vệ sinh, lau chùi vòi nước bồn rửa bát hằng ngày trở nên cực kỳ đơn giản.\n2. Thiết kế cố định bền vững kết hợp tính năng xoay 360 độ linh hoạt \nCấu trúc cố định cứng cáp: Khác biệt với dòng dây rút, mẫu vòi rửa chén Boss mã BV101 sở hữu kết cấu thân cố định vững vàng, cho cảm giác sử dụng đầm tay, bền bỉ lâu dài và không lo các lỗi hỏng vặt.\nXoay hướng đa chiều: Cổ vòi tròn cong mềm mại có khả năng xoay 360 độ cực kỳ trơn tru, giúp bạn dễ dàng dẫn nước đến mọi góc của chậu rửa hoặc xoay gọn vòi sang một bên khi cần đặt các loại xoong nồi lớn vào bồn.\n3. Tích hợp 2 đường nước nóng lạnh tiện dụng \nDòng vòi rửa bát này tích hợp sẵn hai đường nước nóng và lạnh đáp ứng mọi nhu cầu sinh hoạt:\nNước nóng: Giúp rửa trôi dầu mỡ bám trên bát đĩa nhanh chóng, đồng thời hỗ trợ khử khuẩn đồ dùng nhà bếp một cách an toàn.\nNước lạnh: Tiện lợi cho công việc sơ chế thực phẩm, rửa dọn thông thường hằng ngày.\nHướng Dẫn Sử Dụng Và Lưu Ý Lắp Đặt Để Tăng Tuổi Thọ Vòi \nXả sạch đường ống trước khi lắp: Mở van cho nước chảy tự do từ 1 – 2 phút trước khi lắp vòi để đẩy sạch các loại cát sỏi, cặn bẩn xây dựng ra ngoài, tránh làm nghẹt lưới lọc đầu vòi.\nVệ sinh vòi đúng cách: Chỉ lau chùi thân vòi bằng khăn mềm ẩm hoặc nước rửa chén pha loãng. Tuyệt đối không dùng bùi nhùi sắt hoặc chất tẩy rửa có tính axit mạnh chà xát lên vòi để tránh gây trầy xước bề mặt inox mờ.\nThao tác gạt nước nhẹ nhàng: Gạt cần điều chỉnh lượng nước và nhiệt độ nóng lạnh với lực vừa phải, giúp lõi chia nước bên trong vòi vận hành êm ái, bền bỉ qua năm tháng.\nĐặt Mua Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 Chính Hãng Tại Đâu? \nVòi Boss Cố Định Cổ Tronfn Xoay 360 Độ BV101 hiện đang được phân phối chính hãng tại hệ thống của Vật tư tổng hợp giá sỉ , cam kết bảo đảm đầy đủ mọi quyền lợi tiêu dùng từ nhà sản xuất cùng chính sách độc quyền Bảo hành gỉ vĩnh viễn.\nLiên hệ ngay Hotline hoặc chat trực tiếp để được tư vấn kích thước chậu rửa phù hợp, nhận thông tin ưu đãi tốt nhất và hỗ trợ kỹ thuật lắp đặt nhanh chóng ngay hôm nay!","specs":{},"feats":["Sản phẩm được làm hoàn toàn từ chất liệu inox 304 mờ thượng hạng, đem lại độ bền vượt trội, chịu nhiệt tốt từ đường nước nóng và không lo hoen rỉ.","Bề mặt inox mờ có khả năng chống bám bẩn, hạn chế tối đa các vệt ố của nước cứng hay cặn dầu mỡ, giúp việc vệ sinh, lau chùi vòi nước bồn rửa bát hằng ngày trở nên cực kỳ đơn giản.","Cấu trúc cố định cứng cáp: Khác biệt với dòng dây rút, mẫu vòi rửa chén Boss mã BV101 sở hữu kết cấu thân cố định vững vàng, cho cảm giác sử dụng đầm tay, bền bỉ lâu dài và không lo các lỗi hỏng vặt.","Xoay hướng đa chiều: Cổ vòi tròn cong mềm mại có khả năng xoay 360 độ cực kỳ trơn tru, giúp bạn dễ dàng dẫn nước đến mọi góc của chậu rửa hoặc xoay gọn vòi sang một bên khi cần đặt các loại xoong nồi lớn vào bồn.","Dòng vòi rửa bát này tích hợp sẵn hai đường nước nóng và lạnh đáp ứng mọi nhu cầu sinh hoạt: Nước nóng: Giúp rửa trôi dầu mỡ bám trên bát đĩa nhanh chóng, đồng thời hỗ trợ khử khuẩn đồ dùng nhà bếp một cách an toàn.","Nước lạnh: Tiện lợi cho công việc sơ chế thực phẩm, rửa dọn thông thường hằng ngày.","Xả sạch đường ống trước khi lắp: Mở van cho nước chảy tự do từ 1 – 2 phút trước khi lắp vòi để đẩy sạch các loại cát sỏi, cặn bẩn xây dựng ra ngoài, tránh làm nghẹt lưới lọc đầu vòi.","Vệ sinh vòi đúng cách: Chỉ lau chùi thân vòi bằng khăn mềm ẩm hoặc nước rửa chén pha loãng. Tuyệt đối không dùng bùi nhùi sắt hoặc chất tẩy rửa có tính axit mạnh chà xát lên vòi để tránh gây trầy xước bề mặt inox mờ."],"sku":"BV101","vid":"","mod":"BV101","brand":"Boss","slug":"bv101-voi-boss-co-dinh-co-tron-xoay-360-do-bv101-chinh-hang","_source":"avatar2-add-product","_source_url":"https://vattutonghopgiasi.com/voi-boss-co-dinh-co-tron-xoay-360-do-bv101/","_added_at":"2026-10-17T04:16:52.837Z"},{"n":"Kệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V GM- Garis V","l":"https://garis-vn.com/ke-dao-thot-gia-vi-chai-lo-canh-mo-keo-ke-rong-295mm-mm02-35v/","i":"https://garis-vn.com/wp-content/uploads/2024/03/1-MM02V-2.png","p":"7.128.000đ","pn":7128000,"listPn":0,"salePn":7128000,"priceMode":"both","c":"Kệ đựng gia vị dao thớt","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis-vn.com/wp-content/uploads/2024/03/1-MM02V-2.png"],"sum":"Nan quả trám, inox 304, bề mặt điện hóa bóng gương, dùng cho cánh mở và kéo (duy nhất tại Việt Nam)\nGợi ý kết hợp phụ kiện khi thiết kế căn bếp : Căn bếp sẽ đẹp hơn khi kết hợp giá dao thớt, gia vị, chai lọ MM02V với các sản phẩm khác trong MV Series.\nKèm theo: Ray âm giảm chấn MEGKEL (bắt vách tủ), 1 bộ bắt mặt tùy chọn dùng cho cánh kéo, 1 khay hứng nước, phiếu bảo hành, giấy chứng nhận inox 304\nKệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V Quý Khách có thể tham khảo Hướng dẫn lắp đặt phía dưới:","desc":"Nan quả trám, inox 304, bề mặt điện hóa bóng gương, dùng cho cánh mở và kéo (duy nhất tại Việt Nam)\nGợi ý kết hợp phụ kiện khi thiết kế căn bếp : Căn bếp sẽ đẹp hơn khi kết hợp giá dao thớt, gia vị, chai lọ MM02V với các sản phẩm khác trong MV Series.\nKèm theo: Ray âm giảm chấn MEGKEL (bắt vách tủ), 1 bộ bắt mặt tùy chọn dùng cho cánh kéo, 1 khay hứng nước, phiếu bảo hành, giấy chứng nhận inox 304\nKệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V Quý Khách có thể tham khảo Hướng dẫn lắp đặt phía dưới:","specs":{"Chất liệu":"Inox 304, tiêu chuẩn Nhật Bản JIS G4305","Bề mặt":"Bề mặt rổ bóng sáng với công nghệ điện hóa bóng gương Mirror BA","Tải trọng":"25kg","Bảo hành":"25 năm (bảo hành rỉ rổ)"},"feats":["Nan quả trám, inox 304, bề mặt điện hóa bóng gương, dùng cho cánh mở và kéo (duy nhất tại Việt Nam)","Kệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V"],"sku":"MM0235V","vid":"","mod":"MM0235V","brand":"Garis","slug":"mm0235v-ke-dao-thot-gia-vi-chai-lo-canh-mo-keo-mm02-35v-gm-garis-v","_source":"avatar2-add-product","_source_url":"https://garis-vn.com/ke-dao-thot-gia-vi-chai-lo-canh-mo-keo-ke-rong-295mm-mm02-35v/","_added_at":"2026-10-17T04:16:31.165Z"},{"n":"Giá xoong nồi, rổ nan dẹt, cánh kéo Garis GP0270E","l":"https://garis.vn/gia-xoong-noi-gp02e-new.html","i":"https://garis.vn/uploaded/Gia%CC%81%20xoong%20no%CC%82%CC%80i%20GP02E1-1.jpg","p":"3.716.280đ","pn":3716280,"listPn":0,"salePn":3716280,"priceMode":"both","c":"Giá xoong nồi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gia%CC%81%20xoong%20no%CC%82%CC%80i%20GP02E1-1.jpg"],"sum":"Giá xoong nồi GP02E được thiết kế thông minh với kiểu dáng hiện đại, giúp tổ chức không gian bếp một cách gọn gàng và tiện lợi","desc":"Giá xoong nồi GP02E được thiết kế thông minh với kiểu dáng hiện đại, giúp tổ chức không gian bếp một cách gọn gàng và tiện lợi","specs":{},"feats":[],"sku":"GP0270E","vid":"","mod":"GP0270E","brand":"Garis","slug":"gp0270e-gia-xoong-noi-ro-nan-det-canh-keo-garis-gp0270e","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-xoong-noi-gp02e-new.html","_added_at":"2026-10-17T04:16:10.471Z"},{"n":"Thùng rác đôi GW0630G","l":"https://garis.vn/thung-rac-doi-gw06-30g.html","i":"https://garis.vn/uploaded/GS06_30G%20N%204.jpg","p":"4.248.720đ","pn":4248720,"listPn":0,"salePn":4248720,"priceMode":"both","c":"Thùng rác","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/GS06_30G%20N%204.jpg"],"sum":"Thùng rác đôi GW06.30G Ray bi giảm chấn toàn phần, khung bắt đáy, Khung bằng thép sơn tĩnh điện, dày dặn, chắc chắn bằng thép!","desc":"Thùng rác đôi GW06.30G Ray bi giảm chấn toàn phần, khung bắt đáy, Khung bằng thép sơn tĩnh điện, dày dặn, chắc chắn bằng thép!","specs":{},"feats":[],"sku":"GW0630G","vid":"","mod":"GW0630G","brand":"Garis","slug":"gw0630g-thung-rac-doi-gw0630g","_source":"avatar2-add-product","_source_url":"https://garis.vn/thung-rac-doi-gw06-30g.html","_added_at":"2026-10-17T04:15:50.077Z"},{"n":"THÙNG GẠO MẶT KÍNH NÚT NHẤN XR.G302B - Grandx","l":"https://grandx.com.vn/product/thung-gao-mat-kinh-nut-nhan-xr-g302b","i":"https://grandx.com.vn/wp-content/uploads/2024/12/XR.G302B-1024x683.jpg","p":"2.920.000đ","pn":2920000,"listPn":0,"salePn":2920000,"priceMode":"both","c":"Thùng gạo","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/XR.G302B-1024x683.jpg"],"sum":"ĐẶC TÍNH SẢN PHẨM \nThùng gạo mặt kính cường lực cao cấp \nChất liệu vỏ thùng đựng gạo INOX cao cấp \nĐạt các tiêu chuẩn vệ sinh an toàn cho sức khỏe được kiểm tra chứng nhận bởi FDA \nMặt trước kính cường lực \nNhấn nút để lấy gạo dễ dàng \nDung tích chứa tối đa: 25kg \nLắp đặt âm tủ \nKích thước sản phẩm R300*S405*C650 mm \nKích thước khoét âm tủ R264*S410*C630 mm \n","desc":"ĐẶC TÍNH SẢN PHẨM \nThùng gạo mặt kính cường lực cao cấp \nChất liệu vỏ thùng đựng gạo INOX cao cấp \nĐạt các tiêu chuẩn vệ sinh an toàn cho sức khỏe được kiểm tra chứng nhận bởi FDA \nMặt trước kính cường lực \nNhấn nút để lấy gạo dễ dàng \nDung tích chứa tối đa: 25kg \nLắp đặt âm tủ \nKích thước sản phẩm R300*S405*C650 mm \nKích thước khoét âm tủ R264*S410*C630 mm \n","specs":{"Mã sản phẩm":"XR.G302B","Chất liệu":"SUS304 + Kính","Đặc tính sản phẩm":"Màu đen","Kích thước sản phẩm (mm)":"R300*S396*C650","Chiều rộng tủ (mm)":"300","Đơn vị":"Bộ"},"feats":["ĐẶC TÍNH SẢN PHẨM","Thùng gạo mặt kính cường lực cao cấp","Chất liệu vỏ thùng đựng gạo INOX cao cấp","Đạt các tiêu chuẩn vệ sinh an toàn cho sức khỏe được kiểm tra chứng nhận bởi FDA","Mặt trước kính cường lực","Nhấn nút để lấy gạo dễ dàng","Dung tích chứa tối đa: 25kg","Lắp đặt âm tủ","Kích thước sản phẩm R300*S405*C650 mm","Kích thước khoét âm tủ R264*S410*C630 mm"],"sku":"XR.G302B","vid":"","mod":"XR.G302B","brand":"GrandX","slug":"xr-g302b-thung-gao-mat-kinh-nut-nhan-xr-g302b-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/thung-gao-mat-kinh-nut-nhan-xr-g302b","_added_at":"2026-10-17T04:15:29.337Z"},{"n":"Tủ đồ khô cánh mở GrandX XPR.450S","l":"https://grandx.com.vn/product/tu-do-kho-canh-mo-xpr-450s1","i":"https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg","p":"13.120.000đ","pn":13120000,"listPn":0,"salePn":13120000,"priceMode":"both","c":"Tủ đồ khô","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg"],"sum":"Tủ đồ khô cánh mở XPR.450S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.450S1 \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.450S1 được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.450S1 còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.450S1 nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 415mm , dành riêng cho các khoang tủ rộng 450mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.450S1 được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.450S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.450S1 chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\n","desc":"Tủ đồ khô cánh mở XPR.450S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.450S1 \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.450S1 được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.450S1 còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.450S1 nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 415mm , dành riêng cho các khoang tủ rộng 450mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.450S1 được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.450S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.450S1 chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\n","specs":{"Mã sản phẩm":"XPR.450S1","Chất liệu":"INOX SUS 304","Kích thước sản phẩm (mm)":"R385*S500*C(1650-1950)","Kích thước lọt lòng tủ (mm)":"≥ 415","Chiều rộng tủ (mm)":"450","Số tầng rổ":"6 tầng","Tải trọng mỗi tầng":"Tối đa 5kg"},"feats":["Khả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.","Bề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.","Khung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp."],"sku":"XPR.450S1","vid":"","mod":"XPR.450S1","brand":"GrandX","slug":"xpr-450s1-tu-do-kho-canh-mo-grandx-xpr-450s","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/tu-do-kho-canh-mo-xpr-450s1","_added_at":"2026-10-17T04:14:48.509Z"},{"n":"Bếp Từ Canzy CZTL869IMAX","l":"","i":"https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","p":"6.200.000đ","pn":6200000,"listPn":14980000,"salePn":6200000,"priceMode":"both","c":"Bếp Từ Canzy CZ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742205457-be482ddf736ace36ea7308fe3a2b6806.jpg","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742322070-a36944508c279d6b99c2ae58d77621bd.jpg","https://bizweb.dktcdn.net/100/344/152/products/1-4dfb6f78-f7ff-4322-b4fb-70815e12b95f.png","https://bizweb.dktcdn.net/100/344/152/products/2-59f34d91-4f3f-4477-a43b-2cac5dae561a.png"],"sum":"","desc":"","specs":{},"feats":[],"sku":"TL869IMAX","vid":"","mod":"TL869IMAX","brand":"Canzy","slug":"tl869imax-bep-tu-canzy-cztl869imax","_source":"avatar2-bulk-import","_added_at":"2026-10-06T10:59:12.132Z"},{"n":"Chậu Đúc 1 Hố Âm Bàn BA7545 - Boss Việt Nam","l":"","i":"https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-duc-1-ho-am-ban.jpg","p":"5.720.000đ","pn":5720000,"listPn":0,"salePn":5720000,"priceMode":"both","c":"Chậu rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-duc-1-ho-am-ban.jpg"],"sum":"Chậu Đúc 1 Hố Âm Bàn là một trong những sản phẩm đang được ưa chuộng trên thị trường hiện nay, nhờ vào thiết kế tinh tế, chất liệu bền bỉ và tính năng vượt trội. Được chế tạo từ inox 304 chất lượng cao, sản phẩm này không chỉ mang đến sự hiện đại, sang trọng cho không gian bếp, mà còn đảm bảo độ bền theo thời gian. Nếu bạn đang tìm kiếm một sản phẩm bếp tiện lợi và thẩm mỹ, Chậu Đúc 1 Hố Âm Bàn chính là lựa chọn lý tưởng. \n1. Chất Liệu Inox 304 Cao Cấp \nChậu Đúc 1 Hố Âm Bàn của Boss được làm từ inox 304, một loại inox phổ biến trong ngành sản xuất đồ dùng bếp cao cấp. Với tính năng chống ăn mòn, chống oxi hóa và bền bỉ trong môi trường ẩm ướt, inox 304 giúp sản phẩm không chỉ giữ được vẻ đẹp sáng bóng mà còn có tuổi thọ lâu dài. Bề mặt inox mịn màng, dễ dàng vệ sinh, giúp chậu luôn sạch sẽ và không bị bám bẩn. \n2. Thiết Kế Đúc Âm Bàn Tinh Tế \nMột trong những ưu điểm nổi bật của Chậu Đúc 1 Hố Âm Bàn chính là thiết kế khoét âm bàn, tạo ra một không gian bếp gọn gàng và hiện đại. Việc lắp đặt chậu âm bàn không chỉ tiết kiệm diện tích mà còn dễ dàng trong việc vệ sinh, không bị bụi bẩn bám vào các đường viền như các loại chậu truyền thống. Thiết kế này mang đến sự sang trọng, nâng tầm không gian bếp của bạn. \n3. Các Kích Thước Phù Hợp Với Mọi Không Gian \nChậu Đúc 1 Hố Âm Bàn có nhiều kích thước khác nhau, giúp bạn dễ dàng lựa chọn sao cho phù hợp với không gian bếp của mình. Ba loại kích thước phổ biến của chậu đúc âm bàn bao gồm: \nChậu đúc 1 hố âm bàn \nBA6845 : Kích thước khoét đá 64 x 41 cm, phù hợp với không gian bếp có diện tích vừa phải. \nBA7545 : Kích thước khoét đá 71 x 41 cm, là lựa chọn lý tưởng cho những căn bếp rộng rãi, mang đến sự thoải mái trong việc sử dụng. \nBA7845 : Kích thước khoét đá 74 x 41 cm, với không gian rộng rãi hơn, mang đến sự tiện lợi cho việc nấu nướng và vệ sinh. \nMỗi kích thước đều được thiết kế để đảm bảo tính thẩm mỹ và công năng, giúp bạn lựa chọn được sản phẩm phù hợp nhất với nhu cầu sử dụng. \n4. Độ Dày Vượt Trội \nChậu Đúc 1 Hố Âm Bàn có độ dày viền 3.0mm và dày thùng 1.0mm, mang lại độ bền cao và khả năng chống va đập hiệu quả. Với thiết kế này, chậu có thể chịu được lực tác động mạnh mà không bị biến dạng, giúp sản phẩm duy trì hình dáng hoàn hảo suốt thời gian sử dụng. Độ dày của inox cũng giúp chậu không bị móp méo, đồng thời giữ được tính thẩm mỹ và độ bền lâu dài. \n5. Dễ Dàng Vệ Sinh Và Bảo Quản \nChậu Đúc 1 Hố Âm Bàn không chỉ nổi bật với thiết kế tinh tế mà còn rất dễ dàng vệ sinh. Với bề mặt inox mịn màng và không có các khe hở, việc lau chùi, rửa chén bát hay làm sạch sau khi nấu nướng trở nên đơn giản hơn bao giờ hết. Không chỉ giúp tiết kiệm thời gian, chậu còn giúp không gian bếp của bạn luôn sạch sẽ và gọn gàng. \n6. Tính Năng Tiện Dụng Và Hiện Đại \nChậu Đúc 1 Hố Âm Bàn mang lại sự tiện nghi tối đa cho người sử dụng. Bạn có thể dễ dàng rửa thực phẩm, chén bát hoặc các vật dụng nhà bếp khác mà không lo bị tràn ra ngoài. Bề mặt chậu phẳng, tạo sự thuận tiện khi đặt đồ vật lên, tránh việc nước tràn hoặc bẩn ra ngoài. Đặc biệt, thiết kế âm bàn còn giúp tiết kiệm diện tích, làm cho không gian bếp của bạn trở nên rộng rãi và gọn gàng hơn. \n7. Đặc Điểm Kỹ Thuật Sản Phẩm \nChất liệu : Inox 304 \nĐộ dày viền : 3.0mm \nĐộ dày thùng : 1.0mm \nKích thước khoét đá : BA6845 : 64 x 41 cm \nBA7545 : 71 x 41 cm \nBA7845 : 74 x 41 cm \n8. Lý Do Nên Chọn Chậu Đúc 1 Hố Âm Bàn \nChất lượng vượt trội : Sản phẩm được làm từ inox 304, bền bỉ và không bị ăn mòn, giúp chậu duy trì vẻ sáng bóng lâu dài. \nThiết kế sang trọng : Với kiểu dáng khoét âm bàn, chậu giúp không gian bếp trở nên hiện đại và gọn gàng hơn. \nDễ dàng vệ sinh : Bề mặt inox mịn màng và không có các khe hở giúp việc vệ sinh trở nên dễ dàng. \nChống va đập tốt : Độ dày viền và thùng inox giúp chậu chống chịu lực tốt và có độ bền lâu dài. \nPhù hợp với mọi không gian : Các kích thước khác nhau giúp bạn dễ dàng lựa chọn sản phẩm phù hợp với không gian bếp của mình. \nChậu Đúc 1 Hố Âm Bàn là sự kết hợp hoàn hảo giữa tính năng, chất lượng và thẩm mỹ. Sản phẩm này không chỉ đáp ứng nhu cầu sử dụng của bạn trong bếp mà còn tạo điểm nhấn cho không gian bếp hiện đại, sang trọng. Với chất liệu inox 304, thiết kế thông minh và dễ dàng vệ sinh, đây là lựa chọn lý tưởng cho mọi gia đình. \nHãy lựa chọn Chậu Đúc 1 Hố Âm Bàn để mang đến sự tiện lợi và vẻ đẹp cho không gian bếp của bạn","desc":"Chậu Đúc 1 Hố Âm Bàn là một trong những sản phẩm đang được ưa chuộng trên thị trường hiện nay, nhờ vào thiết kế tinh tế, chất liệu bền bỉ và tính năng vượt trội. Được chế tạo từ inox 304 chất lượng cao, sản phẩm này không chỉ mang đến sự hiện đại, sang trọng cho không gian bếp, mà còn đảm bảo độ bền theo thời gian. Nếu bạn đang tìm kiếm một sản phẩm bếp tiện lợi và thẩm mỹ, Chậu Đúc 1 Hố Âm Bàn chính là lựa chọn lý tưởng. \n1. Chất Liệu Inox 304 Cao Cấp \nChậu Đúc 1 Hố Âm Bàn của Boss được làm từ inox 304, một loại inox phổ biến trong ngành sản xuất đồ dùng bếp cao cấp. Với tính năng chống ăn mòn, chống oxi hóa và bền bỉ trong môi trường ẩm ướt, inox 304 giúp sản phẩm không chỉ giữ được vẻ đẹp sáng bóng mà còn có tuổi thọ lâu dài. Bề mặt inox mịn màng, dễ dàng vệ sinh, giúp chậu luôn sạch sẽ và không bị bám bẩn. \n2. Thiết Kế Đúc Âm Bàn Tinh Tế \nMột trong những ưu điểm nổi bật của Chậu Đúc 1 Hố Âm Bàn chính là thiết kế khoét âm bàn, tạo ra một không gian bếp gọn gàng và hiện đại. Việc lắp đặt chậu âm bàn không chỉ tiết kiệm diện tích mà còn dễ dàng trong việc vệ sinh, không bị bụi bẩn bám vào các đường viền như các loại chậu truyền thống. Thiết kế này mang đến sự sang trọng, nâng tầm không gian bếp của bạn. \n3. Các Kích Thước Phù Hợp Với Mọi Không Gian \nChậu Đúc 1 Hố Âm Bàn có nhiều kích thước khác nhau, giúp bạn dễ dàng lựa chọn sao cho phù hợp với không gian bếp của mình. Ba loại kích thước phổ biến của chậu đúc âm bàn bao gồm: \nChậu đúc 1 hố âm bàn \nBA6845 : Kích thước khoét đá 64 x 41 cm, phù hợp với không gian bếp có diện tích vừa phải. \nBA7545 : Kích thước khoét đá 71 x 41 cm, là lựa chọn lý tưởng cho những căn bếp rộng rãi, mang đến sự thoải mái trong việc sử dụng. \nBA7845 : Kích thước khoét đá 74 x 41 cm, với không gian rộng rãi hơn, mang đến sự tiện lợi cho việc nấu nướng và vệ sinh. \nMỗi kích thước đều được thiết kế để đảm bảo tính thẩm mỹ và công năng, giúp bạn lựa chọn được sản phẩm phù hợp nhất với nhu cầu sử dụng. \n4. Độ Dày Vượt Trội \nChậu Đúc 1 Hố Âm Bàn có độ dày viền 3.0mm và dày thùng 1.0mm, mang lại độ bền cao và khả năng chống va đập hiệu quả. Với thiết kế này, chậu có thể chịu được lực tác động mạnh mà không bị biến dạng, giúp sản phẩm duy trì hình dáng hoàn hảo suốt thời gian sử dụng. Độ dày của inox cũng giúp chậu không bị móp méo, đồng thời giữ được tính thẩm mỹ và độ bền lâu dài. \n5. Dễ Dàng Vệ Sinh Và Bảo Quản \nChậu Đúc 1 Hố Âm Bàn không chỉ nổi bật với thiết kế tinh tế mà còn rất dễ dàng vệ sinh. Với bề mặt inox mịn màng và không có các khe hở, việc lau chùi, rửa chén bát hay làm sạch sau khi nấu nướng trở nên đơn giản hơn bao giờ hết. Không chỉ giúp tiết kiệm thời gian, chậu còn giúp không gian bếp của bạn luôn sạch sẽ và gọn gàng. \n6. Tính Năng Tiện Dụng Và Hiện Đại \nChậu Đúc 1 Hố Âm Bàn mang lại sự tiện nghi tối đa cho người sử dụng. Bạn có thể dễ dàng rửa thực phẩm, chén bát hoặc các vật dụng nhà bếp khác mà không lo bị tràn ra ngoài. Bề mặt chậu phẳng, tạo sự thuận tiện khi đặt đồ vật lên, tránh việc nước tràn hoặc bẩn ra ngoài. Đặc biệt, thiết kế âm bàn còn giúp tiết kiệm diện tích, làm cho không gian bếp của bạn trở nên rộng rãi và gọn gàng hơn. \n7. Đặc Điểm Kỹ Thuật Sản Phẩm \nChất liệu : Inox 304 \nĐộ dày viền : 3.0mm \nĐộ dày thùng : 1.0mm \nKích thước khoét đá : BA6845 : 64 x 41 cm \nBA7545 : 71 x 41 cm \nBA7845 : 74 x 41 cm \n8. Lý Do Nên Chọn Chậu Đúc 1 Hố Âm Bàn \nChất lượng vượt trội : Sản phẩm được làm từ inox 304, bền bỉ và không bị ăn mòn, giúp chậu duy trì vẻ sáng bóng lâu dài. \nThiết kế sang trọng : Với kiểu dáng khoét âm bàn, chậu giúp không gian bếp trở nên hiện đại và gọn gàng hơn. \nDễ dàng vệ sinh : Bề mặt inox mịn màng và không có các khe hở giúp việc vệ sinh trở nên dễ dàng. \nChống va đập tốt : Độ dày viền và thùng inox giúp chậu chống chịu lực tốt và có độ bền lâu dài. \nPhù hợp với mọi không gian : Các kích thước khác nhau giúp bạn dễ dàng lựa chọn sản phẩm phù hợp với không gian bếp của mình. \nChậu Đúc 1 Hố Âm Bàn là sự kết hợp hoàn hảo giữa tính năng, chất lượng và thẩm mỹ. Sản phẩm này không chỉ đáp ứng nhu cầu sử dụng của bạn trong bếp mà còn tạo điểm nhấn cho không gian bếp hiện đại, sang trọng. Với chất liệu inox 304, thiết kế thông minh và dễ dàng vệ sinh, đây là lựa chọn lý tưởng cho mọi gia đình. \nHãy lựa chọn Chậu Đúc 1 Hố Âm Bàn để mang đến sự tiện lợi và vẻ đẹp cho không gian bếp của bạn","specs":{"BA7545":"Kích thước khoét đá 71 x 41 cm, là lựa chọn lý tưởng cho những căn bếp rộng rãi, mang đến sự thoải mái trong việc sử dụng.","BA7845":"Kích thước khoét đá 74 x 41 cm, với không gian rộng rãi hơn, mang đến sự tiện lợi cho việc nấu nướng và vệ sinh.","Chất liệu":"Inox 304","Độ dày viền":"3.0mm","Độ dày thùng":"1.0mm","BA6845":"64 x 41 cm"},"feats":["1. Chất Liệu Inox 304 Cao Cấp","2. Thiết Kế Đúc Âm Bàn Tinh Tế","3. Các Kích Thước Phù Hợp Với Mọi Không Gian","Chậu đúc 1 hố âm bàn","4. Độ Dày Vượt Trội","5. Dễ Dàng Vệ Sinh Và Bảo Quản","6. Tính Năng Tiện Dụng Và Hiện Đại","7. Đặc Điểm Kỹ Thuật Sản Phẩm","Chất liệu : Inox 304","Độ dày viền : 3.0mm"],"sku":"BA7545","vid":"","mod":"BA7545","brand":"Boss","slug":"ba7545-chau-duc-1-ho-am-ban-ba7545-boss-viet-nam","_source":"avatar2-bulk-import","_added_at":"2026-10-05T15:00:53.672Z"},{"n":"Vòi Cố Định Cổ Tròn Xoay 360 Độ BV101 - Thiết bị nhà bếp Boss","l":"https://bossvn.vn/voi-co-dinh-co-tron-xoay-360-do-bv101/","i":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAQaBPUDASIAAhEBAxEB/8QAHgABAAEFAQEBAQAAAAAAAAAAAAYCBAUHCAkDAQr/xABqEAABAgMCBA0LDgwCCAQFBQEAAwQCBQYBBxITFBYIERUiIzIzNFFTVnKTGCExNUJSc5GistIZJDY3QUNVYWJkcXSS0wkXJVRjdYGCg5SVwjizJkR2obG0wdEnw+HwRYSjteIoV2Wk8nf/xAAcAQEBAAIDAQEAAAAAAAAAAAAAAgMEAQUHBgj/xABEEQEAAQICBwYEBAMFBwQDAAAAAQIEAxEFEhQhMVKRFRZBU6HRUWFxgQYTMuEiscEHIzND8DQ1NkJigvFjcpLiRMLS/9oADAMBAAIRAxEAPwD0Knm4Eoo/tWl4NLzSNzTcCSUh2vT8Gl5pkrEhAKDGKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAKwUACsFAArBQAOXPwk/wDhDq3ns/8AmEzxNPbL8JP/AIQ6t57P/mEzxNPtdDf7N95dDf8A+JH0fEFZQfROrAAcuHsj+Cn/AMLqv6/c+YidlHGX4Kf/AAvK/r9z5iB2aeZ3n+01/V9Xb/4VKsFANNsKwUACsFAArBQAKwUACEPUDJyN6myRxaveQnyXMeuxMlQlWrbf9J4hq23/AEniIZkSZRkKY1RM9WkeBQ/dXWxB8iTGRJnGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMaom+rSPAoNWkeBQhGRJjIkxqib6up/ENWkeBQhGRJjIkxqib6tI8Cg1aR4FCEZEmMiTGqJvq6n8Q1aR4FCEZEmMiTGqJvq0jwKDVpHgUIRkSYyJMaom+rqfxDVpHgUIRkSYyJMao07+EcmaS2hMqtP8ASM/+YTPFHGn9CGRJjIkzurK/2OiaNTP75f0aOPa/n1a2tk/nvxoxp/QhkSYyJM7Dtr/0/X9mr2f/ANfp+7+e/GjGn9CGRJjIkx21/wCn6/sdn/8AX6fu5w/BWzNNHQyq6fw258xE7G1aR4FCEZEmMiTPm8ar87EqxOGbtMOj8umKc031aR4FBq0jwKEIyJMZEmYdVkTfV1P4hq0jwKEIyJMZEmNUTfVpHgUGrSPAoQjIkxkSY1RN9XU/iGrSPAoQjIkxkSY1RN9WkeBQEMyFMHOqM0sWaywerYgxmocze7Kkqn5XonH6RcZamUZcmWGZ88+beV6JTmfPPm3leiZBkcuTGXJmMzOnnGtvK9EZnTzjW3leiRrDJ5cmMuTMZmdPONbeV6IzOnnGtvK9EawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkxlyZjMzp5xrbyvRGZ0841t5XolawyOWJlWXJmMzOnnGtvK9EZnTzjW3leiTE5DJ5cmMuTMZmdPONbeV6IzOnnGtvK9ErWGRyxMqy5MxmZ0841t5XojM6eca28r0SYnIZPLkwY7M+eca28r0QZRkJ5uBKKP7VpeDS80ik83AllH9q0vAJeaRUJAADGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANZzzcCWUf2rS8Al5pE55uBLKP7VpeAS80uoSAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADWc83AllH9q0vAJeaROebgSyj+1aXgEvNLqEgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1nPNwJZR/atLwCXmkTnm4Eso/tWl4BLzS6hIAAQAAAAAAAAAAAAACgGjbztF3d9c/VqlN1A7eJTOBOFaKBNpFHDgxbXXEV9UPui+EZj/T1DsKdH3eJTFeHhTMTviYh19ekLXDqmivEiJj5unAczeqFXQ/CMx/p6g9UKuh+EZj/T1CuzL7yauiO07LzY6umQc1IfhArnlVdJSbPEbOMUYKf9LDc9395lMXoSTVel502nTDsRqNu4t72KHs2W/Sa2Pa3FvGti4cxHxmNzaw7nBxqtWiuJn6pWVgilaXh05dtLbXtSTdtLUYtratbpRRfRZ2bTVmYiM5buHh141cYeHTM1TwiOKVg56W0bN16K2xzN0tZxibaP/rYW3V13VfCa/wDLmH8/C5ofQ92dOT+myxJ/7KvZ0cDnHq67qvhNf+XJPR+ituvrWYwMpfUyELxazWpObLU7Yv229YbRgZxE1xnLFjfh7TFvhzi41niU0x4zROX8m6gUFm9fNpUyUcuVU2rVCDDjUU1sEEJnfPrwHO060dt0EleqNrKhUfqp6yONm0Ujh/di0tKL9hjPVDLnfhKYfyEZ2EaOvav8mro0Kr+2p44kdXTgOZvVDrnvhKZf09QeqHXPfCUy/p6hXZl95NXRj7TsvNjq6ZBqK57RMUPfdMXzOlXThZw0gxy2UN4ktb+8bRevWzBio5cqptmqdmHGoprIYYTSxcHEwK9TFp1Z+Et7DxcPGp18Oc4XgOdZ3o8LnJK9UbZzRP1U7cCNRi1UVh/di0tKL9hjfVDLnfhKYfyEZu9m3vk1dJ/q1Jv7WP8AMjq6cBzN6odc98JTL+nqD1Q6574SmX9PUHZl95NXRHadl5sdXTINRXP6Jmh775k/l9KvHKzhojj1spbxJa3a90SisL0ZBRC6TeZKqWOVPe26EStsHOwexp4PW4TTqwMenE/Kqw51vh4tynHwq8P82muJp+KalZg6dqFlU0qTfMVcalHZwYMcHyYobevZb9JmTDMTEzTVxZonNWAA5AAAAAAAAAAAAAAAAAAAAKAKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGs55uBLKP7VpeAS80ic83AllH9q0vAJeaXUJAACAAAAAAAAAAAAAAeT/wCED/xJTL9WIf8AGIhV1ehevAvlptSfUlLmq7GFeJrGoq9TS10PyYucTT8IL/iSmX6vb/8AGI6o/Bue0DMv1wr/AJaZ6nj3uLYaJwcXCyzypjfwebW9tTd6UxMKuco3zu48XKXUAX0fAzH+pof9x1AF9HwMx/qaH/cm1VfhDr0JBU84lreW0za2ZvXCENqjRbDwYFIoYffzFeqV3qfBlN/yC/35NOJp+qNaKaMvp+6JwdEROU1V/wCvsg9daDK9CgKbfVFNpE0tlrCDHuY27xOKOCGHusGGItdCFebMrt78ZHCyUj1PmjiFi8b9zGnHFpYX7OzYSC8HR1XnXkUnM6aft5C1Zv0YkVo2bRSFWKG3bQ65W3/gfbQLXMfjKvYbzp0qmlK5BHC6jTxmyqqWbSyGHs6Wn2bTfqruKbDFq0pEcPD4NaPysW8wuz5nfPjHV6lTR8lJJU6fK7k3gw4/3TySvUvDmd81evpw8VhXiUixTaGyzrsoPc0vpt/4HqzeN7A599ViPHyne27PnQefafn3S9U/wU+D9r/2T2uDMXl7NP8AHTqxE/CJzzy+uUN1SXQWXrTVGCYJypFCxynhwWRvk4YvsxRacJV1DF8fwY0/qUHpHp0y3BLmH1MtOhrbD/RnHT2dBP8Aapp3OZ1MP/4z/wD08zOogvZ1v5Ja7H//ACSfpGrbwrpapuomLKX1WwSl8bizTaxJqQxQ2xcFsVllkJ7CnC/4SffdD/Q782E0r+yw7S2qxqZmZj3fWfhL8eaU01pjCsLmmiKK9bhExMZUzMcZn4J5oGb5HtdUlMqdnMeNeyOOFJJZTbKwWaXXt+i01p+ElvdeMLZPQLBVRq2coZa/xfv0O1gT+j3T9/BweyGpfBW+eWH4Se6qYxzWRV01TUVYwo6nOv0PdQRft137T7v8KYmHi3OFON88vr4PEP7VLSLDSd7hWdOUbpmPDfETOXVy/dFoeq6vtbv1qUlyTxFpgprKKuIUYcK3aw642J6n9fHyfY/1VH0iFXI6J2r9D2hM2tMwy9Zq/jhUWgmSESsOFD3UODHAba9UjvV+Daa/kFvvz0+8q0zGLOz00anhm8KtaNGThRGNVVreOW+PtuRzqBL4/gJj/VEf+46gS+P4CY/1RH/uZ31Su9T4Mpv+QX+/L6V/hKryEXuMmUjp5y14tu3WSi+1jY/+Boa2neWj/X3bX5eiPjV0j2br0E2hwre5GpJ87qxg2bNnbWFBC1FwmtrsKHvSMfhHr3JgwSk9AsVVGrd6na9f4v36HawJ833bTojQ7aJGn9EDTqjpgnqZN2nWeyxVTCig+VDF3UHxnNP4SW6uYOnEirpqmoqxRRyFzpe8+7Bb9Fv/ABPnLKuvG0zFV/Tq1+mfg+husOMLRVVNnVrU5eni5Vui0PVc33QvlqUlyb1JjbDYqoq4hRhhit2sOuNj+p/Xx8n2P9VR9Ihdx2iXra4VvM0aZgly7V9bCoshMkIlYcKzaxQ4KkBtn1SO9X4Npr+QW+/PsLvE0v8AnTssUang+UtKNHVYNP5+trePw+25GOoAvo+BmP8AU0P+46gC+j4GY/1ND/uSH1Su9T4Mpv8AkF/vy8ln4TK8ZF7+UpHTrltxbduslH9rGx/8DT1/xB4UUdP3bH5WiOev/X2bk0EGhvru5Csp/MarYN2zV4yhRRtSdpq4cWFDF3P0G8a8oKaPqhVfNmjh+wXUx35OcQpOoVMQojg6+OCzA12n2bfoLfQ76JWQaIWSKqsoNTJw035LFFMKKH5UMXdQG6T4K9urmq7qxLinKvdnGWUPuLW1wabaMPCmZp8EDutpd5S8kUsfpt0nThSGPJm21ShhThThh+nBT/6E/AOtrrmurWq4uyoojDp1aQAELAAAAAAAAAAAAAAAAAAAAKAIJepelKLpKVjnk4hjiThiwEkU7YbIlYvk6fW+M0n1flKcmpv9pD7w0Tos73/xk1+owZq/kaTaSafy1O7t/wChpE+auNJ104k04fCH6G/D39n1jj6Pw8fSUVfmV78onLKJ4R0dx9X7SnJmcfaQ+8Nw3O3ttr5JErOmMrey5jZHgpRPcHZrNLsw4MVp5r3eUe/r2p5ZJWieE+fW6UdvF/K/dPUyjKTYULSkuk0vswWjJPFp/Ks4TbsLi4uJmcSd0fJ8p+NtBaG0BTh4FnTP51U576s8oj3ndH3Wt4teSy7SjppUk3UxcvYIY6Pvo/kw/Hact+qg0HyQqTxNvvTXf4Rq+7VeeNLtpar62ZWwupni+6U97T/Z2fsnEh67oj8PW+PbRjXUb54eG7wfmvSWl8fDx5otqsojdO7Pf4vSL1UCh+SFSeJt96PVQKH5IVJ4m33p5ug7vuzo/lnq6rtm+5/SHpF6qBQ/JCpPE2+9HqoFD8kKk8Tb7083QO7Oj+Wep2zfc/pD0i9VAofkhUnibfej1UCh+SFSeJt96eboHdnR/LPU7Zvuf0h6ReqgUPyQqTxNvvR6qBQ/JCpPE2+9PN0Duzo/lnqds33P6Q9IvVQKH5IVJ4m33o9VAofkhUnibfenm6B3Z0fyz1O2b7n9IekXqoFD8kKk8Tb70eqgUPyQqTxNvvTzdA7s6P5Z6nbN9z+kPSL1UCh+SFSeJt96PVQKH5IVJ4m33p5ugd2dH8s9Ttm+5/SHpF6qBQ/JCpPE2+9HqoFD8kKk8Tb7083QO7Oj+Wep2zfc/pD0i9VAofkhUnibfej1UCh+SFSeJt96eboHdnR/LPU7Zvuf0h6ReqgUPyQqTxNvvR6qBQ/JCpPE2+9PN0Duzo/lnqds33P6Q9IvVQKH5IVJ4m33o9VAofkhUnibfenm6B3Z0fyz1O2b7n9IekXqoFD8kKk8Tb70eqgUPyQqTxNvvTzdA7s6P5Z6nbN9z+kPSL1UCh+SFSeJt96PVQKH5IVJ4m33p5ugd2dH8s9Ttm+5/SHpF6qBQ/JCpPE2+9HqoFD8kKk8Tb7083QO7Oj+Wep2zfc/pD0i9VAofkhUnibfej1UCh+SFSeJt96eboHdnR/LPU7Zvuf0h6ReqgUPyQqTxNvvR6qBQ/JCpPE2+9PN0Duzo/lnqds33P6Q9IvVQKH5IVJ4m33o9VAofkhUnibfenm6B3Z0fyz1O2b7n9IekXqoFD8kKk8Tb70eqgUPyQqTxNvvTzdA7s6P5Z6nbN9z+kPSL1UCh+SFSeJt96PVQKH5IVJ4m33p5ugd2dH8s9Ttm+5/SHpF6qBQ/JCpPE2+9HqoFD8kKk8Tb7083QO7Oj+Wep2zfc/pD0i9VAofkhUnibfej1UCh+SFSeJt96eboHdnR/LPU7Zvuf0h6ReqgUPyQqTxNvvR6qBQ/JCpPE2+9PN0Duzo/lnqds33P6Q9IvVQKH5IVJ4m33o9VAofkhUnibfenm6B3Z0fyz1O2b7n9IekXqoFD8kKk8Tb70eqgUPyQqTxNvvTzdA7s6P5Z6nbN9z+kPSL1UCh+SFSeJt96PVQKH5IVJ4m33p5ugd2dH8s9Ttm+5/SHpF6qBQ/JCpPE2+9HqoFD8kKk8Tb7083QO7Oj+Wep2zfc/pD0i9VAofkhUnibfej1UCh+SFSeJt96eboHdnR/LPU7Zvuf0h6ReqgUPyQqTxNvvR6qBQ/JCpPE2+9PN0Duzo/lnqds33P6Q9IvVQKH5IVJ4m33o9VAofkhUnibfenm6B3Z0fyz1O2b7n9IekXqoFD8kKk8Tb70eqgUPyQqTxNvvTzdA7s6P5Z6nbN9z+kPSL1UCh+SFSeJt96PVQKH5IVJ4m33p5ugd2dH8s9Ttm+5/SHpF6qBQ/JCpPE2+9HqoFD8kKk8Tb7083QO7Oj+Wep2zfc/pD0i9VAofkhUnibfej1UCh+SFSeJt96eboHdnR/LPU7Zvuf0h6ReqgUPyQqTxNvvR6qBQ/JCpPE2+9PN0Duzo/lnqds33P6Q9IvVQKH5IVJ4m33o9VAofkhUnibfenm6B3Z0fyz1O2b7n9IekXqoFD8kKk8Tb70eqgUPyQqTxNvvTzdA7s6P5Z6nbN9z+kPSL1UCh+SFSeJt96PVQKH5IVJ4m33p5ugd2dH8s9Ttm+5/SHpF6qBQ/JCpPE2+9HqoFD8kKk8Tb7083QO7Oj+Wep2zfc/pD0i9VAofkhUnibfej1UCh+SFSeJt96eboHdnR/LPU7Zvuf0h6ReqgUPyQqTxNvvR6qBQ/JCpPE2+9PN0Duzo/lnqds33P6Q9IvVQKH5IVJ4m33o9VAofkhUnibfenm6B3Z0fyz1O2b7n9IekXqoFD8kKk8Tb70eqgUPyQqTxNvvTzdA7s6P5Z6nbN9z+kPSL1UCh+SFSeJt96PVQKH5IVJ4m33p5ugd2dH8s9Ttm+5/SHpF6qBQ/JCpPE2+9HqoFD8kKk8Tb7083QO7Oj+Wep2zfc/pD0i9VAofkhUnibfej1UCh+SFSeJt96eboHdnR/LPU7Zvuf0h6ReqgUPyQqTxNvvR6qBQ/JCpPE2+9PN0Duzo/lnqds33P6Q9JfVOqE5I1L//AFvvgebQJ7s6P+E9WTtu95vSPZ7TzzcCWUf2rS8Al5pE55uBLKP7VpeAS808mqelJAACAAAAAAAAAAAAAAeTn4Qr/Ei//V7f+46n/Bu2p2XEzHGKaf5XV6/8JM5f/CBoqW6I6ZW2JdbU1v1/2xHPKM4mbO3FNnL5olxaakUHmnrOwTpHRWDgRVllEb8s/wCsPMIvIsNI4mNNOe+d3Dxl6Uzr8HVdxPJy/mSs7qFNV4tEvHamu2wYYo4sLW7EW/qbl13w5UX843+6POLOWefCky/mFT81dnvwpM/5hUxdj6QyiNrnp/8AZc6TsZ//ABY6/s77vE/B7Xd0rQs5mrGoZyk5aNVV4FHi6EaXWh7qGxKz/icUXM11Mrs7zZDUEvVUTURdQpxpp+/JWxYMUMXxWkYWnE4fIYpSYPlUlPe1FIsA35oTNC9Or161lk5mbBRvSbBaFdV04TwIXODroU4O++O2zsG3RhTo62xJvsbXiY+HWI3zxa+JXTpDGoi0wtWY4b/2h6d3jewOffVYjx+kvXmKS/CpB557SLoJroqJqbnGeZGiY0MtQXV1Q8nEpl8UypBxbhwWwJ4WTaWu10EPY0trZFbwngOlcKqqKa6Y3Q/ZP9l2lbW1xLjR+PVFNWLqzTMzlEzGe7674y+L0olU1bPpW2cNnKaiSkEMcCnfwmQx6fGniytOJvL+ula7gb/oVY07S81Tnf5256SM1cLTn5mf93w+f7Owr/sjqidam9jKeH8H/wB3s1j0+NOFfwik2YOpjR0tiVTVd22rRWpW9zp2p4P/ABOTMtnHwtMP5lYvZLRM8ricwy+VMVZq/Xs12mnHHDYa15pScbD/ACqcPj8/2d/+H/wDh/hvSNGlce8iYw8/+XV4xlnMzVOWWfwdM/g20NKoas2LBRxfW+2dyzyRy2opY5ls3at37BeDAWbuIMKGOE1JoWLiPxJULY1dxYc6e2QKPIrLcOFO2zsQQxe6am/CZPH7K7KkdT3LlrFbOddk0cUHvCnen1+gtHzVGFZVVZTPjLwD8faawL3S11pK2/ioziI+eURGf3SGovweN0U7eWuW601k1kfYbsXieK8tOO3/AHmE9TSuv+Hqk/nG33R5zZx1D8KTPp1BnHUPwpM+nUPWKdD6RojKm+nL/XzeGVaSsK+Np6/s9G/U1rseUFSfzjf7o09ootBdRdyl2CtTySeTWN02XSgyaYqJxwqw2xaXWwYILesci6uVB8KTLp1T5rvZnOcUkoo+dd4mopFH5xs4Gi73CxIrxLuZiPl+7Bi31nXRNNFtlPhv/ZvfQLVG9k2iHp5JspsTtNVBdPv4cH/ptj1Wncqls9lbmWzNs3fMV4MBZu410McPyjibQEaGibUrM7bwqpYqMF7UIkZa0cp4Cuv2ykUPc63W2Em/CYvHrK6ylLWDly1VtnlnXbKRQW7gp3p8npWcLSelacDCnLPdnx3+j6iw19HaOnGrjPxy+W6GcqH8HpdFOnyjlvbNZNjPeGTuDFeWnH/xMV6mrdh8PVJ/ON/ujzizjqH4UmfTqDOOofhSZ9OofRU6Gv6Yyi9n/X3fP1aTsq/1Wvr+z0b9TVuw+HKh/m233RqTRR6C6i7l7p3VRSSeTVRwgulBk8xUTjhVw4sHrYMEByHnJUHwpMunUPiu9mc52JRR86s97TUUij842MDRl7g4tOJiXUzEfL92Ou/s6qJpotspn5/s3ZoFajeybRIU+i3U2J3Yo1WT7+G2E9czgjQDaGWbSGcW3h1UxUYRwoRQSxo41iuv2y0UPc63rWHe58Z+I7jCuL3+636sRH3fW6BwcTBtMsTxnP7KwAfLPpAAAAAAAAAAAAAAAAAAAAABQaN0Vd7P4tLvV20vUsgnM0sjQaw29zb7sf7Dcy6yTNuq4VUxSUGvjjPMjRA3rRXpV9NZnFpWylpDimkPDBD2Yv27Y62+udnw8o4y+/8AwVoLtvSMTXTnh4eUz8/hH3n0hrUFROrmrulL26+l8gR0o2NsOG7it7lOzbWHwtFtNdUU0zvl+r7q6wrLArucacqKYzmflDqDQV3RWSaSq1nMErLXT2zBZ+C7qL9sRuy/W9NjczdnOqmdaWMbp4DZO331eLc4fGTSVyttIpW2YsksS2bwYCcHeQ2Hmh+ECvyz+vERo2Vq42TSHd8XbrVnPdfZh6304R65oHRW0Y9Fv/yxvq+ni/Cv4s/EGLeY2Lf4n6qpypj4R4R9nLs8nr2rJy/m0yUyp9MF4l1lOCKIsS0Ls94iiKI1aeDw+nFnEzmeIAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9p55uBLKP7VpeAS80ic83AllH9q0vAJeafnqp7QkAAIAAAAAAAAAAAAABgn1LyiaL5S9lTJ2rxjlvDHF5R88x6b+AJZ/Jp+iaKvT0UkwoG9J/SDOSS5TJGSTrLZi/URw8PuYYYEFCFVnowH84umk79tJ28qcz+aLyaNTVDWNsDbKQx4q23r+5pwdY7fD0ZdYmpNNO6rLf9XUYl/bYetrTvpdVZj098AS3+UT9EZj038ASz+TT9E5jp3RHT2ibocptljOo3LeYoStl+V1FVVsbhbqpGhZ17Po8RLpXotmU6ZUmklJsVOJnUSUgm0rcOMBWXKRYWu2uvs1vW7GmYsSwucPfluzmM/oui8tqojwlu5KjKfS2ROSy1JTjLGadn9pnjW1895jy6elEqigk2rMrbrw6oW2KYETZC3bLWa23C0v2GDtv7Rnd5bWmKaYJTpinK9VphNMowIGycUOElDDrbcK2P9mlYasYGLXTr0xnG/0bM4+DhVakzlO714Nyg5p/HXN5ncKrew2dOWqmJUwKfxiEbeCKGKJOHZMRh/GYVpot3tL1OnKakpzGSJgmwQmdUIL9ZFZwhCpCpGlg62DT+M2Y0fcV56lOcxnuz+H14/z+TDN9g05a27Pe6TXpCSPFcatKmSqvGKN4T8zJp/4FY9BCaLmeire2LP20oppvNHucSEgl/r/BSc41PDhWiUwLcGHxmYu1v9nNYXirUhO5JJpW6TTVjwGc0icK6z5MSUFlvjMVVjjU0zVVTw4/Rmp0lRExRTXO/dHFt3Mqn/gRl/LwmRYMWzFDFNmybZLi008A1PfvezVF0MkVnktpaXzqRIQQ45VxM4m6sMVsWDgwwYq3/iRusdExNbrJVSD2uabZypKeTGBpGoyfxOYWyMSeFjNysttt+Ix4drjYtMTh05zPCM4znL6GLfYdEzGLVw+Oe7N0QYx9JGM5RSTfS9u6Sg2ibhOGPzjnOb6NeQupnUaVJs0qhYSeQLziNxjFG+GpB71gxJ/7z63XaKua17M2qakkkzVso1jdxpt5moq4ghhSxmDg2oWWf7zanRt1TROJVRlEdWGnSFtXVFNFcT9N7fmY9PfAEt/lE/RGY9N/AEs/k0/ROf0dEjeItdj+MPMCV5s4jK8HVz1xi8LvcR2f2m9H08mz2iUptT8rbv37hBJdFk8cZPDrtdrlMG3/AIGvjW+Lgfr+Mxxid8ceH1ZMLGwcb9EeGfCY3TwXmY9N/AEs/k0/RK2NLSiVrY1lK2TVXjEm8MERpC7vRBVvWy1SKuaLlcvYU6uu1eqJziKOLGQQ4WthxVmnD8ZF7NHpSVt17WepwQq1S4shsip3ZNKCLGYO74rS7HXNmNHXtU6tFOcxlnlMTx+n9d3za+3WlNMTVVq5/Hdw+rrIx80lTGZo4t81bOk4Nom4Thj845+e3v3h17WE0llCU6zyanVm1r1R7M4UcpxqOMxeDio+t8dlpZXX6JaczaZ09LZ5K01XM8nj+XRYtxrWELeyHWw6zZev7vWMc2OPFM1ZRnGW7OM4z+OXDdvZovcKasp4fH48I3feXQGY9NfAEt/k0/RGY9N/AEs/k0/RIHele1OKJqem6ekFPt5/OJ5j4obHkwyRJOFKHCi12BGa0t0WM1ZU9VT17T0pymSIpKZGym6kcceEpCn18JCzBsOMOzuMXfTG7ciu5t8OdWrdP0n4Z/B0PmPTXwBLf5NP0StlSkkYrY1tK2TZXjE28MBp6+fRHx3bQyJlJJDZUtQzRrE+jl2V4rEtoYcKJTCwbfoss90t620TWpl2lFVVSciTqRSp3STFBnleKwFI4YtbhYNvXsih0jiLO5qiiqmndVwn7Z/+HNVzbUTVEzvh0IDnik9FYxqxWhUGMr0nM+exS6Zs3DjAVla8EOFFDFDg67/cdDmHGwMW3nVxYyn98mzg4+HcU62HOcftmrABgbAAAAAAAAAAAAAAAAAAAKADCVFULWlZG/nD9TFNWkESkcfyYTiZy3yqmma5immM5lzzo0r37KQpFKlWKmm/nFuAv+iR/wDXsHCpKL0a8c3hVrMJ6+s0sptwU0+9Sh7EP7ISLnw93j/n4s1eHg/Y34V0JGgtGUYFUf3lW+qfn8PtwD0B0Hdz/wCLugYZzMU7Ip5O7IFlo7NtBDpdaz9vZOXdDJdH+NK8RG1ZKy2SsNldRcMUO1h/aelGxoI8UnAdtorA440/Z5p/aTp7dTofAnjvr/8A1j+s/ZpzRTXzp3IXSzSbp6Wq7r1rL0+/Xi7r9nZPHlZZR6sq5dK41RSOOONRXbxxRbY6A0a19tl8V7i8uYKYyQSPCaNu9jV99U8fW/dOfD9CaAsNitdav9de+fl8I/m/GelbzbMedX9NO6P6gAPp3TAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2nnm4Eso/tWl4BLzSJzzcCKs9FFdfTyqktmVZypo/Z+tVm8ceugUg1sUP7Ij8/xhYmL/AIdMzPyeyV4lGH+urJvYGluq5ug5eyn7Y6rm6Dl7Kftl7Hc+XPSfZr7Zb88dW6QaW6rm6Dl7KftjquboOXsp+2NjufLnpPsbZb88dW6QaW6rm6Dl7KftjquboOXsp+2NjufLnpPsbZb88dW6QaW6rm6Dl7KftjquboOXsp+2NjufLnpPsbZb88dW6QaW6rm6Dl7KftjquboOXsp+2NjufLnpPsbZb88dW6QaW6rm6Dl7KftjquboOXsp+2NjufLnpPsbZb88dWUq/Q+UlWNWKVK61VazldCFCNxLZos0w04drDrIrDFraFW7+2TMZamweNU2j6KYouE5gtA4ymPbKY3Cw9P9pX1XNz/L2UdIfvVb3Q8vJT0hsU06Rw6YpyqiI3Rx9mDOxrqmr+HNkEdD5SSUsyJzHNZollSD2DVKZrOMBVLa4OHFbgn5OtDtQlQXiNa4dSXTqNpGkvA5TUigw4oNrFFDD1orTG9VxdBy9lPSFPVdXP8AL2U9Ic/k6R35U1fDx4T4cCa7GMt9Po2vNJU2nUqcsHySblo4giTWTU2scNpDLsLkaRuglUwY0zKrGaL+PDdWRxxKxR63BhhwovcssI31XdznL6UdIVdV7c/y/k/SmKmzvtWaIw6sp4xETlP13Km5tKqoqmumZjhOfBj+o+u23LJJrkOHh6napucl22FueFpE1SugpBCyptOVJqJVFAkjMW6lsUUC0MEGAnDg9zpQ8BHeq5ud5fybpT59VzdBy9lP2y66NJV/q1vX2+OUscTo+j9Or6DLQn3cSymFJK2lblBrlUD6COB+tCqivBDgwqQKYWnDpWGXom4SkqBqOyeMLJi6nECESEDmZTBZ3FAnF2YYcOK3SMP1XVz/AC9lPSH71XN0HL2U/bLrw9I1UzTXFW/6+zimqxpmKomnOE/rah5ReJTDqSTxLKpa4wcODGYG1iwrNdYWc7u0kFQO6ccvWyiisgXhdS/ZItYpDDgw84hvVdXOcvZP0hT1XVz/AC9lPSGCmzvojViirKPlPszTc2kzNWvTnPzSSsLkqSriaP5lN2Cirp/LY5OvHYpFBhto9tCY2mtDvS1JO2yjF1PlEkIMRAzcThwq3xeDg4OLij0tLSMb1XVz/L2U9IfvVc3QcvZT9syRg6Qoo/LmKsvv7Mf5ljNWtnTm+PUk3f5HkWlOtS/gvVtzkuD3uLw9LB+I3AyZosGKTdslYkkhBi4IO9hsNS9VzdBy9lP2ynqvrnuX8n6U5rwL7H/XRVVl8pn+iqMezwf0VUxn800p+6+nqdQn7dm1UTSny8bp7skWvUj60X0Fj+JmlVrsk6CtYR5soQQpwN8ZFhdaLD23Z7JGuq6uf5eynpB1XVz/AC9lPSDZr+JziiqN8TwnjH2cfnWfNT8PsuJ3oa6OnU6dTeyybSx88xWUqSmbuW8K2BDgw4UMEWltesX8k0P1EU6rT6jCXqJqyRZVdrGo4Uiixiu3ii04tdbb8ZiOq6uf5eynpD96rm6Dl7KftlVYekeFUVZff2TFdjnnE0pTeJc/TV5ljBWdouMpYYWTPGTtRsqjhbbSigis7JHEdDHQiUrmjJVo9fappwouXD1+s4VjTgiwoYcOOK3Bs0z5dVxdBy9lPSFXVc3QcvZT0n/oTRh6RwqdWIqiPv7Krqsq6taqaZlkXmh3oCaVC6nc2pxvOXzhFJDDmPriBJODrQwwQxdaH9glWh2oWSM2LdlK40mrCa6uNW+PixSLnvobPch+LsGO6rm6Dl7Kek/9B1XN0HL2U9J/6HE4d/MZZVZff2Nex/6WSW0PlBr3mp17qViqjTjw8oTUighjis62FFB2LbfjNomneq3uj5eSrpCjqurnOXsn6Qx1YF7jZZ0VTlu3xO6PhwZIxrTB/TVTGfzyboBpbquboOXsp+2Oq5ug5eyn7ZGx3Plz0n2Xtlvzx1bpBpbquboOXsp+2Oq5ug5eyn7Y2O58uek+xtlvzx1bpBpbquboOXsp+2Oq5ug5eyn7Y2O58uek+xtlvzx1bpBpbquboOXsp+2Oq5ug5eyn7Y2O58uek+xtlvzx1bpBpbquboOXsp+2Oq5ug5eyn7Y2O58uek+xtlvzx1bpBpbquboOXsp+2Oq5ug5eyn7Y2O58uek+xtlvzx1bpBpbquboOXsp+2Oq5ug5eyn7Y2O58uek+xtlvzx1bmBpnquboOXsp+2Z6h7+6AvFmeptNVQxnT3Aw8Q2twtaTVbY9Ea1VExHxylVNzg11atNcTP1bIOM9HHezZG2RoNgpZFZbZjpjZ30HuJ/9Tq+qJo5ktOPnzFoo/ct08NFsnto4u9POif3HXq1HUcwn0xpd46fOrYrbY7U4OtZb7mnpaZ8/pKuuKIw6Imc3q34Ds7PEvtuvsWmiMLKaYqqiM6vvlujj9cmpipu3VXxKSSPgzYvU13k8kl+ig/7G4NDFoZZ23r1OcVfKLWbWV7hCrbp2qxe922/R2T5bAs8Sa9XKd/yfoPSH4l0XY2mJc049NerGeUVRMzPhG7PjPu6L0O11EF1t3zNpGn+U3NkKz235el2P2EO0bV91lz90jpBkrYnPZ3hNWtlm2gh7tT9ln+86MPMvRT3aXw34XtPZsjRE0skrP1rL07YPe4ffP3uyer6Ds8Gu4ppxaoiinfvmIfiTT+krjHnEuaomrExJ8Pn7OQwbZ6ke9/kTNOjHUj3v8iZp0Z7Jt1n51PWPd5Xs1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x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9NL3xOwpy5txqZot1dAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAt0V017NjU0y4AAAAAAAAAAAAAAAAA1nPNwJZR/atLwCXmkTnm4Eso/tWl4BLzS6hIAAQAAAAAAAAAAAAAAAAPgsvYgjjFCMTSdqPdiS2JIvapeaSKbbjNuKdlmklY4U7PcAYtGSPVrOunpH2zeecXZ4yXgCG5uPuK/wDqDN55xdhL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GpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBjHFPNleunsSnDYR3ZZU+/Sk1I3VW7JAZxkvlqCapdmJp3eNvPMsAAAAAAAAAAAAAAf/9k=","p":"1.740.000đ","pn":1740000,"listPn":0,"salePn":1740000,"priceMode":"both","c":"Vòi rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["data:image/jpeg;base64,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5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x7mzXHl1dGpgbZ6ke9/kTNOjHUj3v8iZp0Y26z86nrHubNceXV0amBtnqR73+RM06MdSPe/yJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ACJmnRjbrPzqese5s1x5dXRqYG2epHvf5EzTox1I97/ImadGNus/Op6x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9NL3xOwpy5txqZot1dAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAtcubcamMubcamBdAt0V017NjU0y4AAAAAAAAAAAAAAAAA1nPNwJZR/atLwCXmkTnm4Eso/tWl4BLzS6hIAAQAAAAAAAAAAAAAAAAPgsvYgjjFCMTSdqPdiS2JIvapeaSKbbjNuKdlmklY4U7PcAYtGSPVrOunpH2zeecXZ4yXgCG5uPuK/wDqDN55xdhL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GpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBaalNuKGpTbii7AFpqU24oalNuKLsAWmpTbihqU24ouwBjHFPNleunsSnDYR3ZZU+/Sk1I3VW7JAZxkvlqCapdmJp3eNvPMsAAAAAAAAAAAAAAf/9k="],"sum":"Lựa chọn thiết bị nhà bếp không chỉ dừng lại ở công năng mà còn là yếu tố góp phần làm nên vẻ đẹp hiện đại của không gian sống. Vòi cố định cổ tròn xoay 360 độ BV101 chính là sản phẩm đáp ứng trọn vẹn các tiêu chí về tính năng, chất liệu, và thiết kế. Hãy cùng tìm hiểu chi tiết về sản phẩm này để hiểu vì sao BV101 là sự lựa chọn hoàn hảo cho mọi gia đình.\nTính Năng Nổi Bật Của Vòi Cố Định BV101 \nHai Đường Nước Nóng Lạnh \nVòi cố định BV101 được trang bị hai đường nước nóng lạnh, giúp bạn dễ dàng điều chỉnh nhiệt độ theo nhu cầu sử dụng. Tính năng này đặc biệt tiện lợi khi cần nước ấm để rửa thực phẩm hoặc làm sạch dụng cụ trong mùa đông.\nVòi Xoay 360 Độ \nKhả năng xoay linh hoạt 360 độ của BV101 mang lại sự tiện lợi tối đa. Bạn có thể dễ dàng điều chỉnh hướng dòng nước để làm sạch mọi ngóc ngách của bồn rửa, kể cả khi sử dụng những dụng cụ nấu nướng lớn.\nChất Liệu Cao Cấp: Inox 304 Xước Mờ \nBV101 được chế tạo từ inox 304 xước mờ, không chỉ đảm bảo độ bền vượt trội mà còn mang lại vẻ đẹp sang trọng cho không gian bếp. Đặc biệt, chất liệu này chống gỉ sét, chống bám bẩn và dễ dàng lau chùi.\nKích Thước Lý Tưởng \nVới kích thước D355 x R200 mm, BV101 phù hợp với nhiều kiểu bồn rửa và không gian bếp khác nhau. Thiết kế này mang lại sự cân đối và hài hòa, giúp nâng cao tính thẩm mỹ của gian bếp.\nƯu Điểm Khi Sử Dụng Vòi Cố Định BV101 \nTiện Lợi Và Linh Hoạt \nTính năng xoay 360 độ và hai đường nước nóng lạnh giúp bạn thực hiện các công việc bếp núc một cách nhanh chóng và tiện lợi hơn. Bạn không cần mất thời gian di chuyển hay điều chỉnh thiết bị, mọi thứ đều trong tầm tay.\nVòi Cố Định Cổ Tròn Xoay 360 Độ BV101 \nDễ Dàng Vệ Sinh Và Bảo Dưỡng \nBề mặt inox 304 xước mờ không chỉ giúp sản phẩm trông luôn mới mà còn dễ lau chùi, không bị ảnh hưởng bởi các hóa chất tẩy rửa thông thường. Điều này giúp bạn tiết kiệm thời gian và công sức trong việc bảo quản.\nAn Toàn Cho Sức Khỏe \nInox 304 là vật liệu được kiểm chứng an toàn, không gây thôi nhiễm các chất độc hại vào nguồn nước. Điều này đảm bảo nước sử dụng luôn sạch sẽ, an toàn cho sức khỏe gia đình bạn.\nChính Sách Bảo Hành Hấp Dẫn \nBV101 được bảo hành bề mặt trọn đời, khẳng định chất lượng và độ bền của sản phẩm. Đây là cam kết của nhà sản xuất đối với khách hàng, mang lại sự an tâm trong quá trình sử dụng.\nLàm Thế Nào Để Lựa Chọn Vòi Cố Định Phù Hợp? \nChất Liệu: Hãy chọn sản phẩm làm từ inox 304 để đảm bảo độ bền và an toàn.\nThiết Kế: Đảm bảo thiết kế phù hợp với phong cách và kích thước không gian bếp.\nTính Năng: Kiểm tra các tính năng như xoay linh hoạt, điều chỉnh nhiệt độ nước.\nChính Sách Bảo Hành: Lựa chọn sản phẩm có bảo hành dài hạn để đảm bảo lợi ích lâu dài.\nMẹo Làm Sạch Và Bảo Quản Vòi Cố Định BV101 \nVệ Sinh Hàng Ngày: Lau chùi nhẹ nhàng bằng khăn mềm và nước sạch để giữ bề mặt luôn sáng bóng.\nTránh Hóa Chất Mạnh: Không sử dụng các chất tẩy rửa có tính ăn mòn cao để bảo vệ lớp inox xước mờ.\nKiểm Tra Định Kỳ: Đảm bảo các khớp nối, đầu vòi và dây dẫn nước luôn hoạt động tốt, tránh rò rỉ.\nTại Sao Nên Chọn Vòi Cố Định BV101? \nBV101 của Boss không chỉ là một chiếc vòi rửa thông thường mà còn là điểm nhấn quan trọng trong không gian bếp. Với thiết kế hiện đại, chất liệu cao cấp và tính năng vượt trội, sản phẩm này đáp ứng hoàn hảo cả nhu cầu sử dụng và thẩm mỹ. Hơn nữa, chính sách bảo hành trọn đời là một sự đảm bảo tuyệt đối về chất lượng, giúp bạn hoàn toàn yên tâm khi sử dụng.\nVòi cố định cổ tròn xoay 360 độ BV101 là sự lựa chọn lý tưởng cho những ai đang tìm kiếm một sản phẩm vừa tiện ích, vừa bền đẹp cho gian bếp. Hãy để BV101 trở thành trợ thủ đắc lực trong công việc bếp núc, nâng cao chất lượng cuộc sống của bạn ngay hôm nay","desc":"Lựa chọn thiết bị nhà bếp không chỉ dừng lại ở công năng mà còn là yếu tố góp phần làm nên vẻ đẹp hiện đại của không gian sống. Vòi cố định cổ tròn xoay 360 độ BV101 chính là sản phẩm đáp ứng trọn vẹn các tiêu chí về tính năng, chất liệu, và thiết kế. Hãy cùng tìm hiểu chi tiết về sản phẩm này để hiểu vì sao BV101 là sự lựa chọn hoàn hảo cho mọi gia đình.\nTính Năng Nổi Bật Của Vòi Cố Định BV101 \nHai Đường Nước Nóng Lạnh \nVòi cố định BV101 được trang bị hai đường nước nóng lạnh, giúp bạn dễ dàng điều chỉnh nhiệt độ theo nhu cầu sử dụng. Tính năng này đặc biệt tiện lợi khi cần nước ấm để rửa thực phẩm hoặc làm sạch dụng cụ trong mùa đông.\nVòi Xoay 360 Độ \nKhả năng xoay linh hoạt 360 độ của BV101 mang lại sự tiện lợi tối đa. Bạn có thể dễ dàng điều chỉnh hướng dòng nước để làm sạch mọi ngóc ngách của bồn rửa, kể cả khi sử dụng những dụng cụ nấu nướng lớn.\nChất Liệu Cao Cấp: Inox 304 Xước Mờ \nBV101 được chế tạo từ inox 304 xước mờ, không chỉ đảm bảo độ bền vượt trội mà còn mang lại vẻ đẹp sang trọng cho không gian bếp. Đặc biệt, chất liệu này chống gỉ sét, chống bám bẩn và dễ dàng lau chùi.\nKích Thước Lý Tưởng \nVới kích thước D355 x R200 mm, BV101 phù hợp với nhiều kiểu bồn rửa và không gian bếp khác nhau. Thiết kế này mang lại sự cân đối và hài hòa, giúp nâng cao tính thẩm mỹ của gian bếp.\nƯu Điểm Khi Sử Dụng Vòi Cố Định BV101 \nTiện Lợi Và Linh Hoạt \nTính năng xoay 360 độ và hai đường nước nóng lạnh giúp bạn thực hiện các công việc bếp núc một cách nhanh chóng và tiện lợi hơn. Bạn không cần mất thời gian di chuyển hay điều chỉnh thiết bị, mọi thứ đều trong tầm tay.\nVòi Cố Định Cổ Tròn Xoay 360 Độ BV101 \nDễ Dàng Vệ Sinh Và Bảo Dưỡng \nBề mặt inox 304 xước mờ không chỉ giúp sản phẩm trông luôn mới mà còn dễ lau chùi, không bị ảnh hưởng bởi các hóa chất tẩy rửa thông thường. Điều này giúp bạn tiết kiệm thời gian và công sức trong việc bảo quản.\nAn Toàn Cho Sức Khỏe \nInox 304 là vật liệu được kiểm chứng an toàn, không gây thôi nhiễm các chất độc hại vào nguồn nước. Điều này đảm bảo nước sử dụng luôn sạch sẽ, an toàn cho sức khỏe gia đình bạn.\nChính Sách Bảo Hành Hấp Dẫn \nBV101 được bảo hành bề mặt trọn đời, khẳng định chất lượng và độ bền của sản phẩm. Đây là cam kết của nhà sản xuất đối với khách hàng, mang lại sự an tâm trong quá trình sử dụng.\nLàm Thế Nào Để Lựa Chọn Vòi Cố Định Phù Hợp? \nChất Liệu: Hãy chọn sản phẩm làm từ inox 304 để đảm bảo độ bền và an toàn.\nThiết Kế: Đảm bảo thiết kế phù hợp với phong cách và kích thước không gian bếp.\nTính Năng: Kiểm tra các tính năng như xoay linh hoạt, điều chỉnh nhiệt độ nước.\nChính Sách Bảo Hành: Lựa chọn sản phẩm có bảo hành dài hạn để đảm bảo lợi ích lâu dài.\nMẹo Làm Sạch Và Bảo Quản Vòi Cố Định BV101 \nVệ Sinh Hàng Ngày: Lau chùi nhẹ nhàng bằng khăn mềm và nước sạch để giữ bề mặt luôn sáng bóng.\nTránh Hóa Chất Mạnh: Không sử dụng các chất tẩy rửa có tính ăn mòn cao để bảo vệ lớp inox xước mờ.\nKiểm Tra Định Kỳ: Đảm bảo các khớp nối, đầu vòi và dây dẫn nước luôn hoạt động tốt, tránh rò rỉ.\nTại Sao Nên Chọn Vòi Cố Định BV101? \nBV101 của Boss không chỉ là một chiếc vòi rửa thông thường mà còn là điểm nhấn quan trọng trong không gian bếp. Với thiết kế hiện đại, chất liệu cao cấp và tính năng vượt trội, sản phẩm này đáp ứng hoàn hảo cả nhu cầu sử dụng và thẩm mỹ. Hơn nữa, chính sách bảo hành trọn đời là một sự đảm bảo tuyệt đối về chất lượng, giúp bạn hoàn toàn yên tâm khi sử dụng.\nVòi cố định cổ tròn xoay 360 độ BV101 là sự lựa chọn lý tưởng cho những ai đang tìm kiếm một sản phẩm vừa tiện ích, vừa bền đẹp cho gian bếp. Hãy để BV101 trở thành trợ thủ đắc lực trong công việc bếp núc, nâng cao chất lượng cuộc sống của bạn ngay hôm nay","specs":{"Thiết Kế":"Đảm bảo thiết kế phù hợp với phong cách và kích thước không gian bếp.","Tính Năng":"Kiểm tra các tính năng như xoay linh hoạt, điều chỉnh nhiệt độ nước.","Chính Sách Bảo Hành":"Lựa chọn sản phẩm có bảo hành dài hạn để đảm bảo lợi ích lâu dài.","Tránh Hóa Chất Mạnh":"Không sử dụng các chất tẩy rửa có tính ăn mòn cao để bảo vệ lớp inox xước mờ.","Kiểm Tra Định Kỳ":"Đảm bảo các khớp nối, đầu vòi và dây dẫn nước luôn hoạt động tốt, tránh rò rỉ."},"feats":["Chất Liệu: Hãy chọn sản phẩm làm từ inox 304 để đảm bảo độ bền và an toàn.","Thiết Kế: Đảm bảo thiết kế phù hợp với phong cách và kích thước không gian bếp.","Tính Năng: Kiểm tra các tính năng như xoay linh hoạt, điều chỉnh nhiệt độ nước.","Chính Sách Bảo Hành: Lựa chọn sản phẩm có bảo hành dài hạn để đảm bảo lợi ích lâu dài."],"sku":"BV101","vid":"","mod":"BV101","brand":"Boss","slug":"bv101-voi-co-dinh-co-tron-xoay-360-do-bv101-thiet-bi-nha-bep-boss","_source":"avatar2-add-product","_source_url":"https://bossvn.vn/voi-co-dinh-co-tron-xoay-360-do-bv101/","_added_at":"2026-10-05T11:47:25.908Z"},{"n":"MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E","l":"https://boschs.com.vn/san-pham/may-rua-chen-am-tu-bosch-smi6zcs16e/","i":"https://boschs.com.vn/wp-content/uploads/2025/02/fef-Sao-chep.jpg","p":"Giá niêm yết: 46.750.000đ — Giá KM: 24.500.000đ","pn":24500000,"listPn":46750000,"salePn":24500000,"priceMode":"both","c":"Máy rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://boschs.com.vn/wp-content/uploads/2025/02/fef-Sao-chep.jpg"],"sum":"Trang chủ / Sản phẩm / MÁY RỬA CHÉN BOSCH / MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E \nChi tiết sản phẩm\nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E\n33,300,000 ₫ 26,590,000 ₫ \r\nLượt xem : 5154 \r\nMáy Rửa Chén Bosch SMI6ZCS16E- Nhập Khẩu Đức – Bảo Hành 3 Năm\nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E số lượng \nMua hàng \nDanh mục: MÁY RỬA CHÉN BOSCH \nTừ khóa: bosch SMI6ZCS16E , máy rửa chén bosch , SMI6ZCS16E \nMô tả \nĐánh giá \nMô tả\nMáy Rửa Chén Bosch SMI6ZCS16E \n* THÔNG TIN KỸ THUẬT: \nMáy rửa bát Bosch SMI6ZCS16E có xuất xứ từ Châu Âu, mang đến bước đột phá cho người dùng những trải nghiệm hoàn toàn mới. Máy được trang bị nhiều công nghệ hiện đại như Sấy Zeolite® (Zeolith) – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo. \nGiàn Max Flex: tải máy rửa chén linh hoạt và thoải mái, có bánh xe chạy êm. \nNgăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn. \nGiá đỡ 3 tầng: Chiều cao có thể điều chỉnh theo 3 mức lên đến 5 cm, ngay cả khi giàn phía trên đã được chất đầy đồ. \nSilence Pro: máy rửa chén cực kỳ yên tĩnh (40 decibel). \nChương trình im lặng: Với chương trình này, tiếng ồn khi vận hành máy rửa chén của bạn sẽ tự động giảm xuống mức độ ồn thấp nhất. \nNgoại hình và thiết kế \nMáy rửa bát Bosch SMI6ZCS16E có thiết kế bán âm, được làm từ chất liệu thép không gỉ, bạn cần ốp thêm tấm gỗ vào mặt trước của máy cho đồng bộ với hệ tủ giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn \nBảng điều khiển của Máy rửa bát Bosch SMI6ZCS16E được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng. \n2 Giàn rửa + 1 ngăn kéo: Hệ thống giàn rửa của Máy rửa bát Bosch SMI6ZCS16E gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn. Máy có sức chứa lên tới 14 bộ chén bát, phù hợp cho gia đình từ 4-6 thành viên. \nKích thước thiết bị: Máy rửa bát Bosch SMI6ZCS16E có kích thước Cao 815-875 x Rộng 598 x Sâu 573 mm với trọng lượng 47 kg. \nKích thước lắp đặt: Cao 815-875 x Rộng 600 x Sâu min 550 mm. \nTính năng và công nghệ \n8 Chương trình rửa \nTùy vào số lượng, chất liệu và độ bẩn của bát đĩa mà người dùng lựa chọn chương trình rửa phù hợp để tối ưu hiệu quả rửa và sấy. Máy rửa bát Bosch SMI6ZCS16E được trang bị 8 chương trình rửa đa dạng: \nRửa tiết kiệm 50°C (Eco) \nRửa tự động 45 – 65°C (Auto 45 – 65°C) \nRửa thông minh (Intelligence) \nRửa chuyên sâu 70°C (Intensive) \nRửa nhanh 60°C (Express) \nRửa ly 40°C  \nRửa yên tĩnh 50°C \nRửa yêu thích/ Rửa tráng (Favourite) \nChương trình rửa đặc biệt: \nRửa nhanh tăng cường (SpeedPerfect Plus) \nSấy tăng cường (ExtraDry) \nĐiều khiển từ xa (Home Connect) \nRửa tăng cường giàn dưới cùng (IntensizeZone) \nZeolith \nVới Công nghệ sấy Zeolith trên Máy rửa bát Bosch SMI6ZCS16E giúp bát đĩa khô hoàn hảo hơn. Đây là một khoáng chất tự nhiên có tác dụng hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm. Quá trình hút hơi ẩm này được lặp đi lặp lại nhiều lần cho đến khi kết thúc quá trình rửa. Nhờ công nghệ Zeolith mà bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn. Bởi sấy Zeolith không sử dụng điện năng để sấy khô. \nFavourite / Rửa tráng \nTính năng Favourite giúp quá trình rửa và sấy bát đĩa trở nên dễ dàng hơn. Đồng thời tận dụng tối đa công dụng mà máy rửa bát mang lại. \nMặc định, chương trình Favourite sẽ là tính năng rửa tráng bát đĩa (PreWash). Khi tùy chọn Favourite, người dùng có thể kết hợp một chương trình cơ bản với một tính năng đặc biệt mà bạn yêu thích. Chẳng hạn như bạn kết hợp rửa Eco 50 độ với sấy hé cửa hiệu quả EfficientDry. Sau đó, bạn có thể lưu lại chương trình kết hợp này bằng cách nhấn giữ nút Favourite trong vòng 3 giây. Và khi cần sử dụng tính năng kết hợp này, người dùng chỉ việc kích hoạt Favourite với một lần chạm để bắt đầu. \nNgoài ra, người dùng cũng có thể tự thiết lập chương trình Favourite ngay trên ứng dụng Home Connect. \nExtra Clean Zone \nMáy rửa bát Bosch SMI6ZCS16E được trang bị hệ thống vòi phun Extra Clean Zone. Đây là hệ thống vòi phun thủy lực giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa. Người dùng cũng có thể chủ động bật tắt thông qua công tắc ON/OFF ngay trên hệ thống. \nMachine Care \nDầu mỡ và các cặn bẩn thức ăn có thể làm tăng sự phát triển của mùi hôi và các loại vi khuẩn, nấm mốc bám bên trong khoang máy. Điều này gây ảnh hưởng không nhỏ đến kết quả làm sạch bát đĩa của máy và sức khỏe con người. Vì vậy, người dùng nên có thói quen thường xuyên vệ sinh máy rửa bát theo định kỳ. \nMachine Care là chương trình vệ sinh tự động buồng máy rửa bát. Khi kích hoạt, tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo. \nChương trình này được sử dụng bằng cách cho chạy không tải (Không bát đĩa, đũa muỗng, thìa dĩa,…) kết hợp với chất tẩy rửa vệ sinh máy đặc biệt. Người dùng chỉ việc kích hoạt Machine Care và chọn Start để bắt đầu mà không cần kết hợp với chương trình nào khác. Thời lượng của tính năng Machine Care là 135 phút. \nNgoài ra, sau 30 chu kỳ rửa, Machine Care sẽ nhắc nhở bạn vệ sinh máy. Hoặc nếu thiết bị không nhắc nhở, chúng tôi khuyên bạn nên thực hiện vệ sinh khoang máy theo định kỳ (sau 30 lần rửa). \nChức năng an toàn \nMáy rửa bát Bosch SMI6ZCS16E được trang bị các tính năng và hệ thống bảo vệ an toàn cho người sử dụng: \nKhóa trẻ em (ChildLock): là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển. \nHệ thống AquaStop: là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài. \nHệ thống chống sét lan truyền: là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan. \nSản phẩm tương tự \nGiảm giá! \nMÁY RỬA CHÉN ĐỂ BÀN BOSCH SKS62E32EU\n21,400,000 ₫ 15,890,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ĐỘC LẬP BOSCH SMS6ZCI00P\n30,790,000 ₫ 24,790,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMV4HCX48E\n30,390,000 ₫ 24,190,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN BOSCH SMS4HMC25M\n27,990,000 ₫ 18,690,000 ₫ \r\nMua hàng","desc":"Trang chủ / Sản phẩm / MÁY RỬA CHÉN BOSCH / MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E \nChi tiết sản phẩm\nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E\n33,300,000 ₫ 26,590,000 ₫ \r\nLượt xem : 5154 \r\nMáy Rửa Chén Bosch SMI6ZCS16E- Nhập Khẩu Đức – Bảo Hành 3 Năm\nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E số lượng \nMua hàng \nDanh mục: MÁY RỬA CHÉN BOSCH \nTừ khóa: bosch SMI6ZCS16E , máy rửa chén bosch , SMI6ZCS16E \nMô tả \nĐánh giá \nMô tả\nMáy Rửa Chén Bosch SMI6ZCS16E \n* THÔNG TIN KỸ THUẬT: \nMáy rửa bát Bosch SMI6ZCS16E có xuất xứ từ Châu Âu, mang đến bước đột phá cho người dùng những trải nghiệm hoàn toàn mới. Máy được trang bị nhiều công nghệ hiện đại như Sấy Zeolite® (Zeolith) – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo. \nGiàn Max Flex: tải máy rửa chén linh hoạt và thoải mái, có bánh xe chạy êm. \nNgăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn. \nGiá đỡ 3 tầng: Chiều cao có thể điều chỉnh theo 3 mức lên đến 5 cm, ngay cả khi giàn phía trên đã được chất đầy đồ. \nSilence Pro: máy rửa chén cực kỳ yên tĩnh (40 decibel). \nChương trình im lặng: Với chương trình này, tiếng ồn khi vận hành máy rửa chén của bạn sẽ tự động giảm xuống mức độ ồn thấp nhất. \nNgoại hình và thiết kế \nMáy rửa bát Bosch SMI6ZCS16E có thiết kế bán âm, được làm từ chất liệu thép không gỉ, bạn cần ốp thêm tấm gỗ vào mặt trước của máy cho đồng bộ với hệ tủ giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn \nBảng điều khiển của Máy rửa bát Bosch SMI6ZCS16E được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng. \n2 Giàn rửa + 1 ngăn kéo: Hệ thống giàn rửa của Máy rửa bát Bosch SMI6ZCS16E gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn. Máy có sức chứa lên tới 14 bộ chén bát, phù hợp cho gia đình từ 4-6 thành viên. \nKích thước thiết bị: Máy rửa bát Bosch SMI6ZCS16E có kích thước Cao 815-875 x Rộng 598 x Sâu 573 mm với trọng lượng 47 kg. \nKích thước lắp đặt: Cao 815-875 x Rộng 600 x Sâu min 550 mm. \nTính năng và công nghệ \n8 Chương trình rửa \nTùy vào số lượng, chất liệu và độ bẩn của bát đĩa mà người dùng lựa chọn chương trình rửa phù hợp để tối ưu hiệu quả rửa và sấy. Máy rửa bát Bosch SMI6ZCS16E được trang bị 8 chương trình rửa đa dạng: \nRửa tiết kiệm 50°C (Eco) \nRửa tự động 45 – 65°C (Auto 45 – 65°C) \nRửa thông minh (Intelligence) \nRửa chuyên sâu 70°C (Intensive) \nRửa nhanh 60°C (Express) \nRửa ly 40°C  \nRửa yên tĩnh 50°C \nRửa yêu thích/ Rửa tráng (Favourite) \nChương trình rửa đặc biệt: \nRửa nhanh tăng cường (SpeedPerfect Plus) \nSấy tăng cường (ExtraDry) \nĐiều khiển từ xa (Home Connect) \nRửa tăng cường giàn dưới cùng (IntensizeZone) \nZeolith \nVới Công nghệ sấy Zeolith trên Máy rửa bát Bosch SMI6ZCS16E giúp bát đĩa khô hoàn hảo hơn. Đây là một khoáng chất tự nhiên có tác dụng hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm. Quá trình hút hơi ẩm này được lặp đi lặp lại nhiều lần cho đến khi kết thúc quá trình rửa. Nhờ công nghệ Zeolith mà bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn. Bởi sấy Zeolith không sử dụng điện năng để sấy khô. \nFavourite / Rửa tráng \nTính năng Favourite giúp quá trình rửa và sấy bát đĩa trở nên dễ dàng hơn. Đồng thời tận dụng tối đa công dụng mà máy rửa bát mang lại. \nMặc định, chương trình Favourite sẽ là tính năng rửa tráng bát đĩa (PreWash). Khi tùy chọn Favourite, người dùng có thể kết hợp một chương trình cơ bản với một tính năng đặc biệt mà bạn yêu thích. Chẳng hạn như bạn kết hợp rửa Eco 50 độ với sấy hé cửa hiệu quả EfficientDry. Sau đó, bạn có thể lưu lại chương trình kết hợp này bằng cách nhấn giữ nút Favourite trong vòng 3 giây. Và khi cần sử dụng tính năng kết hợp này, người dùng chỉ việc kích hoạt Favourite với một lần chạm để bắt đầu. \nNgoài ra, người dùng cũng có thể tự thiết lập chương trình Favourite ngay trên ứng dụng Home Connect. \nExtra Clean Zone \nMáy rửa bát Bosch SMI6ZCS16E được trang bị hệ thống vòi phun Extra Clean Zone. Đây là hệ thống vòi phun thủy lực giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa. Người dùng cũng có thể chủ động bật tắt thông qua công tắc ON/OFF ngay trên hệ thống. \nMachine Care \nDầu mỡ và các cặn bẩn thức ăn có thể làm tăng sự phát triển của mùi hôi và các loại vi khuẩn, nấm mốc bám bên trong khoang máy. Điều này gây ảnh hưởng không nhỏ đến kết quả làm sạch bát đĩa của máy và sức khỏe con người. Vì vậy, người dùng nên có thói quen thường xuyên vệ sinh máy rửa bát theo định kỳ. \nMachine Care là chương trình vệ sinh tự động buồng máy rửa bát. Khi kích hoạt, tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo. \nChương trình này được sử dụng bằng cách cho chạy không tải (Không bát đĩa, đũa muỗng, thìa dĩa,…) kết hợp với chất tẩy rửa vệ sinh máy đặc biệt. Người dùng chỉ việc kích hoạt Machine Care và chọn Start để bắt đầu mà không cần kết hợp với chương trình nào khác. Thời lượng của tính năng Machine Care là 135 phút. \nNgoài ra, sau 30 chu kỳ rửa, Machine Care sẽ nhắc nhở bạn vệ sinh máy. Hoặc nếu thiết bị không nhắc nhở, chúng tôi khuyên bạn nên thực hiện vệ sinh khoang máy theo định kỳ (sau 30 lần rửa). \nChức năng an toàn \nMáy rửa bát Bosch SMI6ZCS16E được trang bị các tính năng và hệ thống bảo vệ an toàn cho người sử dụng: \nKhóa trẻ em (ChildLock): là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển. \nHệ thống AquaStop: là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài. \nHệ thống chống sét lan truyền: là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan. \nSản phẩm tương tự \nGiảm giá! \nMÁY RỬA CHÉN ĐỂ BÀN BOSCH SKS62E32EU\n21,400,000 ₫ 15,890,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ĐỘC LẬP BOSCH SMS6ZCI00P\n30,790,000 ₫ 24,790,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMV4HCX48E\n30,390,000 ₫ 24,190,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN BOSCH SMS4HMC25M\n27,990,000 ₫ 18,690,000 ₫ \r\nMua hàng","specs":{"Lượt xem":"5154"},"feats":["Giàn Max Flex: tải máy rửa chén linh hoạt và thoải mái, có bánh xe chạy êm.","Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn.","Giá đỡ 3 tầng: Chiều cao có thể điều chỉnh theo 3 mức lên đến 5 cm, ngay cả khi giàn phía trên đã được chất đầy đồ.","Silence Pro: máy rửa chén cực kỳ yên tĩnh (40 decibel).","Chương trình im lặng: Với chương trình này, tiếng ồn khi vận hành máy rửa chén của bạn sẽ tự động giảm xuống mức độ ồn thấp nhất."],"sku":"SMI6ZCS16E","vid":"","mod":"SMI6ZCS16E","brand":"BOSCH","slug":"smi6zcs16e-may-rua-chen-am-tu-bosch-smi6zcs16e","_source":"avatar2-add-product","_source_url":"https://boschs.com.vn/san-pham/may-rua-chen-am-tu-bosch-smi6zcs16e/","_added_at":"2026-10-05T14:43:26.379Z"},{"n":"Máy rửa bát bán âm Bosch SMI6ZCS16E","l":"https://boschhome.com.vn/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6/?gad_source=1&gad_campaignid=22745767436&gbraid=0AAAAADb_g-0El2armGKS39qd1R78_yI48&gclid=CjwKCAjwoOjVBhArEiwAUwDak0nrb40nNozRXxxsskhVCjxPMlk1m3LuWIO62B0qSStfBLeOrLwNURoCITEQAvD_BwEhe&gclid=CjwKCAjwoOjVBhArEiwAUwDak8ZiRw14XwGNOwXbbV8yd7PcMcea4meRjuQ-PZY0im_HG9Z-qIFTPRoCpz4QAvD_BwEjwKCAjwoOjVBhArEiwAUwDakxtuAv3vMNheBF7y8iFuvYwR7dyzBXqRBguZh1xF2AQ0c-1uySLETBoCI2wQAvD_BwE","i":"https://b1.congngheviet.com.vn/file/s2-hc03/boschhome-com-vn/wp-content/uploads/2024/11/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6.jpg","p":"Giá niêm yết: 38.500.000đ — Giá KM: 23.200.000đ","pn":23200000,"listPn":38500000,"salePn":23200000,"priceMode":"both","c":"Máy rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://b1.congngheviet.com.vn/file/s2-hc03/boschhome-com-vn/wp-content/uploads/2024/11/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6.jpg"],"sum":"Với dung tích rửa lớn lên đến 14 bộ chén đĩa châu Âu cùng 8 chương trình rửa cơ bản đa dạng, 3 chương trình rửa bổ sung và được tích hợp rất nhiều công nghệ hiện đại như tính năng điều khiển từ xa Home Connect, công nghệ sấy khô Zeolith cao cấp, hệ thống 3 giàn rửa linh hoạt,… SMI6ZCS16E chính là trợ thủ đắc lực giúp công việc dọn dẹp sau nấu nướng trở nên dễ dàng và đơn giản hơn bao giờ hết. \nƯu điểm \nThời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng. \nKiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. . \nChất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng. \nBảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa. \nDung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa. \nSở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình. \nChức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn. \nCông nghệ Home Connect giúp bạn kết nối và điều khiển máy rửa bát từ xa. Giúp bạn cập nhật lượng tiêu thụ điện nước và chất tẩy rửa, cập nhật tình trạng máy, điều khiển từ xa, điều khiển từ xa bằng giọng nói một cách vô cùng tiện lợi với các thao tác dễ dàng. \nSấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn. \nChương trình rửa thông minh Intelligent được tích hợp ở những dòng máy rửa bát cao cấp của Bosch, giúp tự động điều chỉnh quá trình rửa bát. Sau khi chương trình rửa kết thúc, người dùng có thể đánh giá kết quả làm sạch và làm khô thông qua ứng dụng Home Connect. Dựa vào dữ liệu trên, máy rửa bát sẽ tự động điều chỉnh các cài đặt và đề xuất người dùng một vài lựa chọn thay thế. \nChương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại. \nTăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus. \nTăng áp lực nước rửa giàn dưới cùng với tính năng vùng rửa chuyên sâu IntensiveZone và giàn giữa với hệ thống thủy lực Extra Clean Zone giúp bạn loại bỏ hoàn toàn các vết bẩn cứng đầu trên những vật dụng khó rửa. \nThiết kế 3 khay rửa thông minh, linh hoạt giúp tối ưu lượng bát đĩa, nồi chảo khi xếp vào máy. Đặc biệt, giàn giữa có thể điều chỉnh nâng lên và hạ xuống thêm 5 cm dễ dàng chỉ bằng thao tác chạm cần gạt. \nĐộng cơ không chổi than EcoSilence Drive mang lại chất lượng rửa cao với độ ồn thấp, đảm bảo thiết bị hoạt động trơn tru và yên tĩnh. \nNhược điểm \nChưa được trang bị tính năng rửa nửa tải (HalfLoad). \nTính năng  \nHẹn giờ. \nKhóa phím điều khiển bảo vệ trẻ em. \nCảm biến nhận biết độ sạch của nước. \n8 chương trình cài đặt sẵn: rửa tự động (Auto 45 – 65°C), rửa tiết kiệm (Eco 50°C), rửa chuyên sâu (Intensive 70°C), rửa thông minh (Intelligent), rửa nhanh (Express 60°C), rửa yên tĩnh (Silence 50°C), chương trình rửa yêu thích (Favourite), rửa ly (Glass 40°C). \n3 chương trình rửa bổ sung: tăng tốc độ rửa SpeedPerfect Plus, vùng rửa chuyên sâu Intensize Zone, sấy tăng cường Extra Dry. \nCông nghệ Home Connect kết nối và điều khiển máy rửa bát từ xa. \nCông nghệ ActiveWater giúp tối ưu lượng nước rửa từng chu kỳ. \nChức năng Machine Care tự động vệ sinh khoang máy rửa bát. \nVùng làm sạch thêm ExtraClean Zone với 3 vòi phun nước xoay giúp làm sạch triệt để bát đũa của bạn với lượng nước gấp 3 lần mà không cần thêm chất tẩy rửa hay tăng nhiệt độ. \nHệ thống Dosage Assistant giúp hòa tan và phân bổ đồng đều chất tẩy rửa. \nCảm biến tải LoadSensor giúp tiết kiệm nước và năng lượng khi làm sạch số lượng bát đĩa ít hơn. \nCảm biến nước AquaSensor giúp điều chỉnh lượng nước dựa vào độ bẩn của bát đĩa. \nKhử khuẩn bằng nước nóng. \nBáo thiếu muối. \nBáo thiếu chất tẩy rửa. \nBáo thiếu nước làm bóng. \nTự động báo lỗi và dừng hoạt động khi có vấn đề về nguồn cấp nước (Cảm biến AquaStop). \nThiết bị bảo vệ chống sét lan truyền. \nThông số kỹ thuật","desc":"Với dung tích rửa lớn lên đến 14 bộ chén đĩa châu Âu cùng 8 chương trình rửa cơ bản đa dạng, 3 chương trình rửa bổ sung và được tích hợp rất nhiều công nghệ hiện đại như tính năng điều khiển từ xa Home Connect, công nghệ sấy khô Zeolith cao cấp, hệ thống 3 giàn rửa linh hoạt,… SMI6ZCS16E chính là trợ thủ đắc lực giúp công việc dọn dẹp sau nấu nướng trở nên dễ dàng và đơn giản hơn bao giờ hết. \nƯu điểm \nThời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng. \nKiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. . \nChất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng. \nBảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa. \nDung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa. \nSở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình. \nChức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn. \nCông nghệ Home Connect giúp bạn kết nối và điều khiển máy rửa bát từ xa. Giúp bạn cập nhật lượng tiêu thụ điện nước và chất tẩy rửa, cập nhật tình trạng máy, điều khiển từ xa, điều khiển từ xa bằng giọng nói một cách vô cùng tiện lợi với các thao tác dễ dàng. \nSấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn. \nChương trình rửa thông minh Intelligent được tích hợp ở những dòng máy rửa bát cao cấp của Bosch, giúp tự động điều chỉnh quá trình rửa bát. Sau khi chương trình rửa kết thúc, người dùng có thể đánh giá kết quả làm sạch và làm khô thông qua ứng dụng Home Connect. Dựa vào dữ liệu trên, máy rửa bát sẽ tự động điều chỉnh các cài đặt và đề xuất người dùng một vài lựa chọn thay thế. \nChương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại. \nTăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus. \nTăng áp lực nước rửa giàn dưới cùng với tính năng vùng rửa chuyên sâu IntensiveZone và giàn giữa với hệ thống thủy lực Extra Clean Zone giúp bạn loại bỏ hoàn toàn các vết bẩn cứng đầu trên những vật dụng khó rửa. \nThiết kế 3 khay rửa thông minh, linh hoạt giúp tối ưu lượng bát đĩa, nồi chảo khi xếp vào máy. Đặc biệt, giàn giữa có thể điều chỉnh nâng lên và hạ xuống thêm 5 cm dễ dàng chỉ bằng thao tác chạm cần gạt. \nĐộng cơ không chổi than EcoSilence Drive mang lại chất lượng rửa cao với độ ồn thấp, đảm bảo thiết bị hoạt động trơn tru và yên tĩnh. \nNhược điểm \nChưa được trang bị tính năng rửa nửa tải (HalfLoad). \nTính năng  \nHẹn giờ. \nKhóa phím điều khiển bảo vệ trẻ em. \nCảm biến nhận biết độ sạch của nước. \n8 chương trình cài đặt sẵn: rửa tự động (Auto 45 – 65°C), rửa tiết kiệm (Eco 50°C), rửa chuyên sâu (Intensive 70°C), rửa thông minh (Intelligent), rửa nhanh (Express 60°C), rửa yên tĩnh (Silence 50°C), chương trình rửa yêu thích (Favourite), rửa ly (Glass 40°C). \n3 chương trình rửa bổ sung: tăng tốc độ rửa SpeedPerfect Plus, vùng rửa chuyên sâu Intensize Zone, sấy tăng cường Extra Dry. \nCông nghệ Home Connect kết nối và điều khiển máy rửa bát từ xa. \nCông nghệ ActiveWater giúp tối ưu lượng nước rửa từng chu kỳ. \nChức năng Machine Care tự động vệ sinh khoang máy rửa bát. \nVùng làm sạch thêm ExtraClean Zone với 3 vòi phun nước xoay giúp làm sạch triệt để bát đũa của bạn với lượng nước gấp 3 lần mà không cần thêm chất tẩy rửa hay tăng nhiệt độ. \nHệ thống Dosage Assistant giúp hòa tan và phân bổ đồng đều chất tẩy rửa. \nCảm biến tải LoadSensor giúp tiết kiệm nước và năng lượng khi làm sạch số lượng bát đĩa ít hơn. \nCảm biến nước AquaSensor giúp điều chỉnh lượng nước dựa vào độ bẩn của bát đĩa. \nKhử khuẩn bằng nước nóng. \nBáo thiếu muối. \nBáo thiếu chất tẩy rửa. \nBáo thiếu nước làm bóng. \nTự động báo lỗi và dừng hoạt động khi có vấn đề về nguồn cấp nước (Cảm biến AquaStop). \nThiết bị bảo vệ chống sét lan truyền. \nThông số kỹ thuật","specs":{"Loại máy rửa chén":"Bán tích hợp","Bảng điều khiển phía trước":"Có","Nhãn năng lượng":"B","Độ ồn tối đa":"40dB","Xây dựng chất lượng":"Cao cấp","Chất lượng giặt":"Cao cấp","Bảng điều khiển vị trí":"Ngoài","Vị trí thiết bị":"Được xây dựng trong","Chiều cao thích hợp":"81,5 – 87,5cm","Chiều rộng thích hợp":"60 – 60,8cm","Chiều sâu thích hợp":"55 cm","Chiều cao của bảng điều khiển phía trước":"54,1 – 61,1cm","Hệ thống bản lề":"Cửa trên cửa","Chiều cao":"81,5 cm","Chiều rộng":"59,8 cm","Chiều sâu":"57,3 cm","Chân có thể điều chỉnh":"Có","Đầu có thể tháo rời":"–","Cân nặng":"47,1kg","Loại ngăn đựng dao kéo":"Ngăn kéo","Khay dao kéo có thể điều chỉnh độ cao":"–","Không gian để bát đĩa":"Nhiều, Trung bình","Số lượng cài đặt địa điểm":"14","Bố cục có thể tùy chỉnh":"Có","Giá trên có thể điều chỉnh":"Có","Giá đỡ trên có thể gập lại":"Có","Có thể gập lại hỗ trợ giá đỡ thấp hơn":"Có","Rất phù hợp với các loại món ăn":"Bình sữa trẻ em, Chảo nướng, Bát đĩa nửa tải, Nồi và chảo lớn, Hộp nhựa, Ly uống rượu (23cm)","Chiếu sáng nội thất":"Có","Chương trình giặt":"Chu kỳ tự động, tiết kiệm, chuyên sâu, ngắn, im lặng","Chức năng nửa tải":"–","Cảm biến tải":"–","Chức năng chu kỳ rút ngắn":"Có","Chiếu sàn":"Không","Giá đỡ dưới có chức năng nâng":"–","Phát hiện chất tẩy rửa":"Có","Nạp chất tẩy rửa máy rửa chén tự động":"–","Chỉ báo nạp muối":"Có","Chỉ báo nạp nước trợ xả":"Có","Tín hiệu kết thúc chu kỳ":"Có","Loại tín hiệu kết thúc chu kỳ":"Quang học","Khóa an toàn trẻ em":"Có","Số nhiệt độ làm sạch":"6","Nhiệt độ làm sạch tối đa":"70°C","Phương pháp sấy":"Zeolit ​​(bát khô thêm)","Vùng chuyên sâu":"Có","Hạng tốc độ":"Nhanh","Điều khiển qua ứng dụng":"Có","Điều khiển máy sấy qua ứng dụng":"Vận hành từ xa, Đọc thông tin qua ứng dụng","Bắt đầu trì hoãn":"Có","Bắt đầu phân chia độ trễ":"1 – 24 giờ","Tùy chọn tắt tự động":"Có","Ngôn ngữ bảng điều khiển":"Tiếng Anh, Ký hiệu","Chi phí năng lượng hàng năm":"72,8 euro","Tiêu thụ năng lượng hàng năm":"182 kWh","Tiêu thụ năng lượng trên mỗi chu kỳ":"0,65 kWh","Chức năng tiết kiệm năng lượng":"Tự động tắt, Chu trình tiết kiệm năng lượng, Cấp nước nóng, Lượng nước sử dụng được xác định theo mức độ bẩn","Thời lượng chu kỳ sinh thái":"215 phút","Chi phí nước hàng năm":"3,53 euro","Lượng nước sử dụng hàng năm":"2520 lít","Lượng nước sử dụng mỗi chu kỳ":"9 lít","Thân thiện với môi trường":"Đúng","Số lượng vòi phun tay phun":"2","Loại động cơ":"Biến tần","Chất liệu nội thất":"Thép không gỉ","Đầu nối nước":"Nước lạnh và nước ấm","Bảo vệ rò rỉ":"Có","Loại bảo vệ rò rỉ":"Cảm biến rò rỉ đáy, Bảo vệ chống tràn, Ống an toàn","Ống đầu vào có thể tháo rời":"–","Ống thoát nước có thể tháo rời":"–","Chiều dài ống đầu vào":"1,65 m","Loại nguồn điện":"Mạng lưới điện","Nguồn điện tối thiểu":"2400W"},"feats":["Thời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng.","Kiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. .","Chất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng.","Bảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa.","Dung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa.","Sở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình.","Chức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn.","Sấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn.","Chương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại.","Tăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus."],"sku":"SMI6ZCS16E","vid":"","mod":"SMI6ZCS16E","brand":"Bosch","slug":"smi6zcs16e-may-rua-bat-ban-am-bosch-smi6zcs16e","_source":"avatar2-add-product","_source_url":"https://boschhome.com.vn/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6/?gad_source=1&gad_campaignid=22745767436&gbraid=0AAAAADb_g-0El2armGKS39qd1R78_yI48&gclid=CjwKCAjwoOjVBhArEiwAUwDak0nrb40nNozRXxxsskhVCjxPMlk1m3LuWIO62B0qSStfBLeOrLwNURoCITEQAvD_BwEhe&gclid=CjwKCAjwoOjVBhArEiwAUwDak8ZiRw14XwGNOwXbbV8yd7PcMcea4meRjuQ-PZY0im_HG9Z-qIFTPRoCpz4QAvD_BwEjwKCAjwoOjVBhArEiwAUwDakxtuAv3vMNheBF7y8iFuvYwR7dyzBXqRBguZh1xF2AQ0c-1uySLETBoCI2wQAvD_BwE","_added_at":"2026-10-05T11:47:18.605Z"},{"n":"GIÁ DAO THỚT GIA VỊ NAN OVAL XK.40M2 - Grandx","l":"https://grandx.com.vn/product/gia-dao-thot-gia-vi-nan-oval-xk-40m2","i":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-5-2.png","p":"5.230.000đ","pn":5230000,"listPn":0,"salePn":5230000,"priceMode":"both","c":"Giá dao thớt, gia vị","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-5-2.png"],"sum":"Đặc tính sản phẩm \nGiá dao thớt gia vị nan Oval\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho tủ cánh kéo \nTính năng đột phá \nTích hợp giỏ đựng thìa, dĩa\nKhay đựng nước nhựa cao cấp ABS có viền nhôm 2 mặt chống cong vênh\nHệ chuyển động sử dụng bộ ray âm hoạt động ổn định, độ bền cao \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ DAO THỚT GIA VỊ NAN OVAL XK.40M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"Đặc tính sản phẩm \nGiá dao thớt gia vị nan Oval\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho tủ cánh kéo \nTính năng đột phá \nTích hợp giỏ đựng thìa, dĩa\nKhay đựng nước nhựa cao cấp ABS có viền nhôm 2 mặt chống cong vênh\nHệ chuyển động sử dụng bộ ray âm hoạt động ổn định, độ bền cao \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ DAO THỚT GIA VỊ NAN OVAL XK.40M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XK.40M2","Chất liệu rổ":"SUS304 Oval","Chất liệu khung":"INOX 304 sơn nhiệt","Kích thước sản phẩm (mm)":"R357*S438*C506","Chiều rộng tủ (mm)":"400mm"},"feats":["Tích hợp giỏ đựng thìa, dĩa Khay đựng nước nhựa cao cấp ABS có viền nhôm 2 mặt chống cong vênh Hệ chuyển động sử dụng bộ ray âm hoạt động ổn định, độ bền cao"],"sku":"XK.40M2","vid":"","mod":"XK.40M2","brand":"GrandX","slug":"xk-40m2-gia-dao-thot-gia-vi-nan-oval-xk-40m2-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-dao-thot-gia-vi-nan-oval-xk-40m2","_added_at":"2026-10-05T14:43:24.675Z"},{"n":"GIÁ GIA VỊ TITANIUM XS.40T - Grandx","l":"https://grandx.com.vn/product/gia-gia-vi-titanium-xs-40t","i":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-copy.png","p":"6.680.000đ","pn":6680000,"listPn":0,"salePn":6680000,"priceMode":"both","c":"Giá dao thớt, gia vị","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-copy.png"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị Grand X với ngăn kéo thu gọn trong hộc tủ, tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng nhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ TITANIUM XS.40T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị Grand X với ngăn kéo thu gọn trong hộc tủ, tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng nhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ TITANIUM XS.40T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{},"feats":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"sku":"XS.40T","vid":"","mod":"XS.40T","brand":"GrandX","slug":"xs-40t-gia-gia-vi-titanium-xs-40t-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-gia-vi-titanium-xs-40t","_added_at":"2026-10-05T14:43:21.504Z"},{"n":"GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S1 - Grandx","l":"https://grandx.com.vn/product/gia-dung-chai-lo-gia-vi-nan-det-xs-40s1","i":"https://grandx.com.vn/wp-content/uploads/2024/12/XS.25S.40S2-PHOI-CANH.png","p":"3.630.000đ","pn":3630000,"listPn":0,"salePn":3630000,"priceMode":"both","c":"Giá dao thớt, gia vị","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/XS.25S.40S2-PHOI-CANH.png"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XS.40S1","Chất liệu rổ":"SUS304","Chất liệu khung":"Thép Carbon sơn nhiệt","Kích thước sản phẩm (mm)":"R335*S485*C450","Chiều rộng tủ (mm)":"400"},"feats":["ĐẶC TÍNH SẢN PHẨM","Giá đựng chai lọ gia vị nan dẹt","Chất liệu SUS304","Bề mặt hoàn thiện điện hóa xước mờ","Dùng cho cánh kéo","Hệ chuyển động sử dụng bộ ray âm","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"sku":"XS.40S1","vid":"","mod":"XS.40S1","brand":"GrandX","slug":"xs-40s1-gia-dung-chai-lo-gia-vi-nan-det-xs-40s1-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-dung-chai-lo-gia-vi-nan-det-xs-40s1","_added_at":"2026-10-05T14:43:17.222Z"},{"n":"GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S2 - Grandx","l":"https://grandx.com.vn/product/gia-dung-chai-lo-gia-vi-nan-det-xs-40s2","i":"https://grandx.com.vn/wp-content/uploads/2025/01/XS.25S.40S2.png","p":"3.950.000đ","pn":3950000,"listPn":0,"salePn":3950000,"priceMode":"both","c":"Giá dao thớt, gia vị","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2025/01/XS.25S.40S2.png"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\n","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\n","specs":{"Mã sản phẩm":"XS.40S2","Chất liệu rổ":"SUS304","Chất liệu khung":"INOX 304","Kích thước sản phẩm (mm)":"R335*S485*C450","Chiều rộng tủ (mm)":"400"},"feats":["ĐẶC TÍNH SẢN PHẨM","Giá đựng chai lọ gia vị nan dẹt","Chất liệu SUS304","Bề mặt hoàn thiện điện hóa xước mờ","Dùng cho cánh kéo","Hệ chuyển động sử dụng bộ ray âm","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"sku":"XS.40S2","vid":"","mod":"XS.40S2","brand":"GrandX","slug":"xs-40s2-gia-dung-chai-lo-gia-vi-nan-det-xs-40s2-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-dung-chai-lo-gia-vi-nan-det-xs-40s2","_added_at":"2026-10-17T04:15:08.942Z"},{"n":"GIÁ BÁT NÂNG HẠ NAN DẸT XL.90S2","l":"https://grandx.com.vn/product/gia-bat-nang-ha-nan-det-xl-90s2","i":"https://grandx.com.vn/wp-content/uploads/2026/09/XL.60.70.80.90S1_2-02.jpg","p":"10.890.000đ","pn":10890000,"listPn":0,"salePn":10890000,"priceMode":"both","c":"Phụ kiện tủ bếp trên","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2026/09/XL.60.70.80.90S1_2-02.jpg"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá bát đĩa nâng hạ 2 tầng nan Dẹt SUS304\nBề mặt điện hóa xước mờ\nKhung chính bằng Thép Carbon sơn nhiệt màu xám đậm\nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợp\nvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval bằng INOX SUS 304\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT NÂNG HẠ NAN DẸT XL.90S2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá bát đĩa nâng hạ 2 tầng nan Dẹt SUS304\nBề mặt điện hóa xước mờ\nKhung chính bằng Thép Carbon sơn nhiệt màu xám đậm\nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợp\nvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval bằng INOX SUS 304\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT NÂNG HẠ NAN DẸT XL.90S2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XL.90S2","Chất liệu rổ":"SUS304","Chất liệu khung":"Inox 304","Kích thước sản phẩm":"R864*S280*C550","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"feats":["ĐẶC TÍNH SẢN PHẨM","Giá bát đĩa nâng hạ 2 tầng nan Dẹt SUS304","Bề mặt điện hóa xước mờ","Khung chính bằng Thép Carbon sơn nhiệt màu xám đậm","Điều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợp","với nhu cầu sử dụng thực tế","2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh","Ống tay cầm hình oval bằng INOX SUS 304","THÔNG SỐ SẢN PHẨM","Mở rộng"],"sku":"XL.90S2","vid":"","mod":"XL.90S2","brand":"GrandX","slug":"xl-90s2-gia-bat-nang-ha-nan-det-xl-90s2","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-bat-nang-ha-nan-det-xl-90s2","_added_at":"2026-10-05T14:43:14.687Z"},{"n":"Giá treo quần âu đa năng kết hợp khay đựng đồ Garis GW0470","l":"https://garis.vn/gia-treo-quan-au-da-nang-gw04.html?srsltid=AfmBOoo5AwhtJSAMVHqmv8HV1NEZvllrpswaWN8ihQjGkvd0S3W7HLD2","i":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91a%20n%C4%83ng%20GW04%201.jpg","p":"4.730.400đ","pn":4730400,"listPn":4730400,"salePn":4730400,"priceMode":"list","c":"Giá treo quần âu đa năng","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91a%20n%C4%83ng%20GW04%201.jpg"],"sum":"Giá treo quần âu đa năng GW04 – Thiết kế linh hoạt, chất liệu bền đẹp, phù hợp cho mọi không gian tủ quần áo. Giúp quần âu luôn thẳng phẳng và ngăn nắp.","desc":"Giá treo quần âu đa năng GW04 – Thiết kế linh hoạt, chất liệu bền đẹp, phù hợp cho mọi không gian tủ quần áo. Giúp quần âu luôn thẳng phẳng và ngăn nắp.","specs":{"Chất liệu":": Khung bằng thép sơn tĩnh điện, nan bằng thép phủ nano","Tải trọng":": 30kg","Màu sắc":": Trắng","Bảo hành":": 24 tháng"},"feats":[],"sku":"GW0470","vid":"","mod":"GW0470","brand":"Garis","slug":"gw0470-gia-treo-quan-au-da-nang-ket-hop-khay-dung-do-garis-gw0470","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-treo-quan-au-da-nang-gw04.html?srsltid=AfmBOoo5AwhtJSAMVHqmv8HV1NEZvllrpswaWN8ihQjGkvd0S3W7HLD2","_added_at":"2026-10-05T14:43:13.342Z"},{"n":"Giá treo quần âu đơn cân Garis GWE38","l":"https://garis.vn/gia-treo-quan-au-don-can-gw38e.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C6%A1n%20c%C3%A2n%20GW38E.jpg","p":"2.484.000đ","pn":2484000,"listPn":2484000,"salePn":2484000,"priceMode":"list","c":"Giá treo quần âu đơn cân ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C6%A1n%20c%C3%A2n%20GW38E.jpg"],"sum":"Giá treo quần âu đơn cân GW38E Thiết kế cân đối, bền đẹp, tối ưu hóa không gian tủ. Dễ lắp đặt, giữ quần âu phẳng phiu và ngăn nắp!","desc":"Giá treo quần âu đơn cân GW38E Thiết kế cân đối, bền đẹp, tối ưu hóa không gian tủ. Dễ lắp đặt, giữ quần âu phẳng phiu và ngăn nắp!","specs":{},"feats":["Màu xanh Emerald, tạo nên vẻ đẹp và sự tươi mới cho không gian treo quần áo. Màu sắc này cũng tạo điểm nhấn và sự phong cách cho sản phẩm."],"sku":"GWE38","vid":"","mod":"GWE38","brand":"Garis","slug":"gwe38-gia-treo-quan-au-don-can-garis-gwe38","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-treo-quan-au-don-can-gw38e.html","_added_at":"2026-10-05T14:43:11.744Z"},{"n":"Giá treo quần âu đôi Garis GWE35","l":"https://garis.vn/gia-treo-quan-au-doi-gw35e.html","i":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C3%B4i%20GW35E.jpg","p":"2.950.000đ","pn":2950000,"listPn":0,"salePn":2950000,"priceMode":"list","c":"Giá treo quần âu đôi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C3%B4i%20GW35E.jpg"],"sum":"Giá treo quần âu đôi GW35E Thiết kế tiện lợi, chất liệu bền đẹp, tối ưu không gian tủ quần áo. Dễ lắp đặt, hỗ trợ lưu trữ quần âu ngăn nắp và gọn gàng","desc":"Giá treo quần âu đôi GW35E Thiết kế tiện lợi, chất liệu bền đẹp, tối ưu không gian tủ quần áo. Dễ lắp đặt, hỗ trợ lưu trữ quần âu ngăn nắp và gọn gàng","specs":{},"feats":["Màu xanh Emerald, tạo nên vẻ đẹp và sự tươi mới cho không gian treo quần áo. Màu sắc này cũng tạo điểm nhấn với sự phong cách cho sản phẩm."],"sku":"GWE35","vid":"","mod":"GWE35","brand":"Garis","slug":"gwe35-gia-treo-quan-au-doi-garis-gwe35","_source":"avatar2-add-product","_source_url":"https://garis.vn/gia-treo-quan-au-doi-gw35e.html","_added_at":"2026-10-05T14:43:10.318Z"},{"n":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","l":"https://www.dienmayxanh.com/may-giat/may-giat-hitachi-inverter-105-kg-bd-1054hvow?utm_flashsale=1","i":"https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806.jpg","p":"Giá niêm yết: 10.990.000đ — Giá KM: 5.990.000đ","pn":5990000,"listPn":10990000,"salePn":5990000,"priceMode":"both","c":"Máy giặt / sấy","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-638963804276138450.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-638963804285992497.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-99-638962219298592474.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-5-639063368977740536.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-639063369030108820.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-639063369065311055.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-639063369104866518.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-4-639063369150311821.jpg"],"sum":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","desc":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","specs":{"Loại máy giặt":"Cửa trước","Lồng giặt":"Lồng ngang","Khối lượng giặt":"10.5 Kg","Số người sử dụng":"Trên 7 người","Kiểu động cơ":"Truyền động gián tiếp (dây Curoa)","Tốc độ quay vắt tối đa":"1400 vòng/phút","Chất liệu lồng giặt":"Inox","Chất liệu vỏ máy":"Kim loại sơn tĩnh điện","Chất liệu cửa máy":"Nhựa","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2025","Thời gian bảo hành động cơ":"10 năm","Hiệu suất sử dụng điện":"5.7 Wh/kg","Loại Inverter":"Công nghệ Inverter","Chương trình":"Đồ màu Vải mỏng Đồ trẻ em Đồ lót Đồ len Đồ hỗn hợp Đồ cotton Đồ Jeans Áo sơ mi Xả + vắt Vệ sinh lồng giặt Vắt Giặt vệ sinh Giặt tiết kiệm Giặt nhanh Giặt chăn bông","Công nghệ giặt":"Giặt nước nóng Giặt hơi nước","Bảng điều khiển":"Song ngữ Anh - Việt có núm xoay, cảm ứng và màn hình hiển thị","Tiện ích":"Vệ sinh lồng giặt Khóa trẻ em Hẹn giờ giặt Chống nhăn Chỉnh số vòng vắt Chỉnh nhiệt độ nước","Kích thước - Khối lượng":"Cao 85 cm - Ngang 60 cm - Sâu 63.5 cm - Nặng 70 kg","Chiều dài ống cấp nước":"110 cm","Chiều dài ống thoát nước":"180 cm","Hãng":"Hitachi. Xem thông tin hãng"},"feats":["Thiết bị sử dụng kiểu động cơ gián tiếp truyền động dây curoa nên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.","Tiện ích giặt chống nhăn được thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.","Hẹn giờ giặt giúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.","Tùy chỉnh số vòng vắt, nhiệt độ nước cho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.","Vệ sinh lồng giặt bằng nước nóng giúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt."],"sku":"BD-1054HVOW","vid":"","mod":"BD-1054HVOW","brand":"Hitachi","slug":"bd-1054hvow-may-giat-hitachi-inverter-10-5-kg-bd-1054hvow","_source":"avatar2-add-product","_source_url":"https://www.dienmayxanh.com/may-giat/may-giat-hitachi-inverter-105-kg-bd-1054hvow?utm_flashsale=1","_added_at":"2026-10-05T14:43:04.943Z"},{"n":"KHÓA CỬA ĐIỆN TỬ HUBERT HB CG26F","l":"https://hubert.vn/san-pham/khoa-cua-dien-tu-hubert-hb-cg26f/","i":"data:image/jpeg;base64,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m5t795vCLwheeKDm5t8d5vCLwheeKG04ANWObm3v1Og3hF4QvPFBzc2+O83hH4QvPFDacAGrHNzb37zeEXhC88UHNzb37zeEXhC88UNpwAasc3NvfvN4ReELzxQc3NvjvN4ReELzxQ2nABqxzc29+83hF4QvPFD60n9vylNymEOEtKU/+Y3vixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+373osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLFl4NSWO75OVrjZaVrQpyqE3lzDkFXRVadnm1Slyi1xxuU7QDkAAAAAAAAAAAAAAAAdV51pT8mceOS32ReeznHyyg9kHfWVfWDxnV+yDz2c4+WOL0Uu6joQyd6tRMnwh871TjUVG9smCbPjv021c3Lon2BT+sHWfCVTPZ1ESfDJd10/OFybNfm22H7ftPjCm0/OFxbNXm3WH7ftPjiIE32yPumsRfbFD5qiKbR66QXFtlfdN4i+2KHzVEUyn11MX32G/XkXnmkX57TM/nJx6EXOhvq3ZdH0xisT+YYeevkXHmj357TM/nKg9EpKmtEuU/TG5/ijIfzzYOcVArtf2u8OmLGSVFcYepczJGdYK9cYyjgh6fpaYnD2SbxrczhypkImNNmTsS8nRtHLq9nkyl9UbkEFd3fpsLihGu71jeZfcCTRpHE+qnOPEqoNUuG1a9v1YrK95nfN+GOnXi2eQv8Ax7oRdai5eeVr26jnnpa+nClueZz+MfDnkcjHlXXPz1p+nD889Tf07/xFMc8CvbH45vn9Np/KHKLiVutP00WhsmyS10bUWGUI14yv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","p":"6.000.000đ","pn":6000000,"listPn":0,"salePn":6000000,"priceMode":"both","c":"Khóa vân tay","cs":"san-pham-them-moi","ci":"fa-box","imgs":["data:image/jpeg;base64,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m5t795vCLwheeKDm5t8d5vCLwheeKG04ANWObm3v1Og3hF4QvPFBzc2+O83hH4QvPFDacAGrHNzb37zeEXhC88UHNzb37zeEXhC88UNpwAasc3NvfvN4ReELzxQc3NvjvN4ReELzxQ2nABqxzc29+83hF4QvPFD60n9vylNymEOEtKU/+Y3vixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+373osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLFl4NSWO75OVrjZaVrQpyqE3lzDkFXRVadnm1Slyi1xxuU7QDkAAAAAAAAAAAAAAAAdV51pT8mceOS32ReeznHyyg9kHfWVfWDxnV+yDz2c4+WOL0Uu6joQyd6tRMnwh871TjUVG9smCbPjv021c3Lon2BT+sHWfCVTPZ1ESfDJd10/OFybNfm22H7ftPjCm0/OFxbNXm3WH7ftPjiIE32yPumsRfbFD5qiKbR66QXFtlfdN4i+2KHzVEUyn11MX32G/XkXnmkX57TM/nJx6EXOhvq3ZdH0xisT+YYeevkXHmj357TM/nKg9EpKmtEuU/TG5/ijIfzzYOcVArtf2u8OmLGSVFcYepczJGdYK9cYyjgh6fpaYnD2SbxrczhypkImNNmTsS8nRtHLq9nkyl9UbkEFd3fpsLihGu71jeZfcCTRpHE+qnOPEqoNUuG1a9v1YrK95nfN+GOnXi2eQv8Ax7oRdai5eeVr26jnnpa+nClueZz+MfDnkcjHlXXPz1p+nD889Tf07/xFMc8CvbH45vn9Np/KHKLiVutP00WhsmyS10bUWGUI14yvNor03rEUTrKfFGo/Nxb06o9BvIkMGpSbv2Zx8mWiicVDtDw8Qc9OC4eK9Jc9PWkpUv6Qco9ZAABcV9+zj/omX56LBFffs4/6Jl+eiwQAUxiR90Vg16y5PmiYucUviR90Vgz6y5PmiYC59ynaFFXPiHi5OXncVs4Rx8CdGy27PmieVqqYz56slvijZLIbiqaRkuNrm69TuBewpS9cGpeWuiYuGycQX1qL3C1RZTyTVsVajpIlDFTVSzdaW0zVJqfip3ACdYa3s2xGsGFvlk2UQRmGpHe9z8pOvnk/lExEds+14myrVirSgkKox0K1SZNE/PoRMuSgkQCnNlnzMXn51XH/AFs5FTx33YK355vf9mERbGyz5mLz86rj/rZyKnjvuwVvzze/7MIgLXx2pu3fg4b/AOfCfMHguPcp2hTuPH2zYOf5QEv6ufC3utANVdvX7B2L+cB/kRtQl1pMafYzS3RlJcF+xSJlbNsdrzGhXVT8CUlnblFFddLtpIJl0im7I6ivaG4iXngPoAAAwl5fajN+1rj5Iw6eGvmd2p7SMPm5R08U5csLYE890qrnqxWRSSp6KspwEye6MMxa0fzDtyJgzq0PVgzRa1P3WmQpQGbAAAV8n5uLj800vnSgsEV8n5uLj800vnSgsEAAAAdKS+x738mf4o8gtn5ndmGxMMtoPFVFO4MI4+45yHboUJWpbWdrSNSc0Tk88x1s9KGryNwnqR7E7lK9KtBjqwkXWPrG1jUN6Gru1Q0y5a13d3d3Op1emA86sVsUcWYi9tqN1h3ckyZuwcWSmk4Y7q6kXFuElt9umpadWlC9r8XcCP47yuG0tsb4ht8NMcbwxJYc8UDXfU8uqvVgqo6JuJoqqk3K17vtD05JGRzeqhko5GlVqUKpWidOHSnUpXt7g+BbehSMTMCRDUrU9aGMjREtC1rTqVrTc3AGp2ze3vew9rbFLBmVxKum74NnAxk43NPvKrqouFzUz0Kag/O27b0Ivihs5qqxDWp5DFBkVwbQpurU06dJSvn0/hG3hWLIj0z4rNOjk9KFMtQtMxqU6lK188HTFk9Mmd0gmpVsbOSpi0rUpu3Td6lQGj2POGi99bbdmWXEXhN2YiphlKGI5gV6Nly0TeF4lM3UIXsv0RVGEW0ddcMnsyYj4v3rOUgnrC6IiTkamcqpvXBXGkzKvQtOErweCPTczBiZ6V+ZmnVyUtSUWqWmaha9Wm71dwfCsDDmRTbmim9UkjZiEqkXKSvbpTc3KVAeUmG8vc0VsvtsTGNwXLEt8Q8SHLLEK7mdFFpFvCtiqJo1pXqpFJu1L6kdmCXu60T47YmbNl2Xle8JHW9CwcPdr2irhw2bGc0VekaVPQtFtEuY3qR6rliYtBhWOKyQK1NWtTJUTLkrWvV3abm4OWcZGsUKtWbVFJGu7upkToUtd3q9KnSAaJ2xcWAymDF+mj9sPE2St9NzC1fTyrxwZxGL1W6ygsZLdJrH66WnUG9EVp1jm1SLapNAmQ5uUcuXsh+C29CkZHYkh2pWylaGOjREtCmrTqVrTc3KjKUKWlNylKUoA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1XfW1fWDxtW+yzz2c5+WOPZVXjUR5BXba8pZF6TdtTaFUnjJ84puV7nUUOQ/vZheilkbdddqIbO9U4mT7623RCZ30cW32XhBJjzxFXwlUwIq+FB1E+oLl2avNusP2/afHFNJ9QW/s4K//GOx/b9p8cTvsJ3ti/dMYiezkPmqIpVPrqAuHbNV/wCc/iD7PQ+aoik98EIpwzkJ/GLwiXoP5Fx5o9+e0zP5yoPSHcp1NweankV6qbjEnEOidc5SxDPMf/PKD0sGKX88t7otrAx4xNt19XQpHXC9KUp+DXrynYfpEHyiWbm4HJZWbTqk1T4SDTt+rF0+SKxbFPbtniptylSWimDhSlKdVSqFN1SopS4LmbW8x1lq5lj9ZJ3QvRSzu3nd6NttN2u4ZY31sSgo+tVVllFla6iqqmcxx3ZeQczbo0o5VzmP1KdxTuB8BG68Od2vbH4H6AVH5H6HYYRknMKZIuMXkDdy2SMoYbT7KOwDiVjpdaEnfULKWvZjfKo8cukqpOXlPSm+71a+qAY/Yo2Kbp2oLlSl54juLsCMW3XsnQuWruv7WQ7da9mbsR7cWLY1s4dWuys6zohtGQ8WlRJo3SJloSnbr+MLKsm28ObVj7Js+MTj4iMRK2aII06RCduvbEnAAAYCeuaFtZEjqaf0ZpqG0yZimr/QAjv7OP8AomX56LBFJdFGwUsZlHtboS0udclN3Ir+2vWicdF3Dn91Cfva30QE1FL4kfdFYM+suT5omJn0XcOf3UJ+9rfREAxfWfoTeH2MEDGO52Ptl07rIt2CeZ0do6bHRMsmnXl0IppGy/jqAvQcblO1QVC22nsE1S5F73SYn9KetF2tS+7IJVEYt4XzZM8ZiPbjg5uxJJobvuc4CagOqksm5S1W6qZyd0WuYdoBTmyz5mLz86rj/rZyKnjvuwVvzze/7MIj6YIbTGBmHWFsmpd+KFvsjoXHPKKNzOiVX4b9Y6dNMnqBgMAHr3F/G8+J0YyPzKSlpOdXc062hRVmixZMin7NYySDhZWheCSihCALm2h3zOIkcKJOTckbNGd+NN8OFj5Sp5mLwhN03rzF/lGIkZWQ2j5V1Z9nvl2uGrBc6E5ON1sp55Ts2TI5P+j+nLdnyCdkYS/aXhE5/APEONOzK7qW3n6qaeTNXUKioahierFeXRjRaMgmxwkwiuljDNlmqVZKajy1UQiWOXc0mxky5auzk6lPQy8OvYgM28Zx9/3nE4W2Q0q3suwXyLqbVQTytjum3TbRqVadWpFMqivc5SF8/g7ACpLQvLCyy7ebW5ZRX5o9slUiKLSOcHMY1eqatcnTOMpXGCOrTSTtC71f4Ic9Pj1AWOOuoomklrK1yUTED6IVzrfWeE1xKp9tRdBP+bU4xL6Lue/EzVvtNK3bXb11V49NfdVekT85ypySo/vZen3RuxAfJSXSxImkp9c+jZNsud+pOFeCSUep9Ran/Z0eqWvZKcLsC5s5a0rN3dI1uUtDsbdKXcYN1CZV35v2yeleQWnYE8/lG7DLjY6P6JR27o6O9bPY5TRzQtMnNI/nLnp6R3BfP5Xciaztz25aKCbmeeJsklK6aZqlNWmbtdKgCQAIN0Z8L/3Vpe8rfRDoz4X/ALq0veVvogOun5uLj800vnSgsEUclipYimLys1zxJbw53EmuvRFbLq76UNl5AuNg8aSseg/aLaqC5M5T07IoDvAAAAAAAAAADgcgAAAAA4HIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKoxR2e8NcWVKO7liTJSBeLo+bH01ql/Gbzxa443KdoBqLcPkfFiyNN2BvWdj/AFKhUli/FECuXyNKSefYTEZupu8rfbOpfiGG6cze9oW2pvaZuFkyW9KqrwvcjrQ2ItizSm9Y2545VdXkpUVymN/EYB5yXL5GBiwRXcjJ2Gep+rPUv+6KqnvI39pdBXcZ22k4qn2VHBOF/OHs8ADwWk9jraKhVVFFMM5lXT5WkhWoj8bZGNNozzI1oWHcJroQVIvHkSjjmrQ+py+SP6CKlLXqlpX+IdTekeiejqjZKhqdQ1CU3afxgPETypW2/jpckldtx2O4aPZVQm/HMgdNCla6ennyV9aJOl5E3tOO3SaD+atxJHslqvj1oUv4yULwh65O8TcPWB9Fe7o0p+0VWlfijIQ9z25cdD1hpds7onyypqcIv8QCm9krZbt3ZeshaEZvjyU5MGI5lpFXqqnTLuUIX1JfOGwQ43KdocgNGtrryPqT2gsVUsZLMvhCGljsSR7pq/b1XQUInyDErSvB6QoqvkOl/wAy5O5uPGmNTL52lGn8YPVncp1NwY99Jx8O1UdSDpNsgn2ax8pQHmyz8hgiiU/xhja6U9ZFEL/vCY295DvgpHU/xzf91vPUJmQTp8mN0uith9qaPPfH+6rufyiSsJRhJNiO410m6QPyTpHzFAahQfkU+ydEK6rqEnpL2VLLF+JWgse2thDZRtKqa0ZgtArKJ8k7ohl6/wA/dGwoAIfb+GeH9ppZLdsqDjCdpqwISv8ANEuImmmWhE0ylLTqUpTcpQfoYCYui3bcpuzUu2Z0PySnU4Rv0QGe3KDkRFpidh8/PooXdG1U9UrQvxhKwH7H4USSVpuKpEPSndFpUfsAGG53Irmnza3i335ob21slN3Sz5twZPebT9qo+4oPruUEVlMQbOhVatZC6GKRyF4Zaqbpi+5ASXebT9qo+4oPpQhC0y0IWlKU3NylPOEdi72tScc71hrgj3i3pRFd038gkgDHuIeKdJ6blg2Vr+NItf8AyEUksGcLZZNROUw/gnJVOVUzNOn9BROwAU6psq4HqLb5ZWZSOW9MYOlW1f8AVmoOurs0W45R3lS/sQeZ1eLWjeep7vdUncbmfd3Bbp3STZI6rhUhCE5ZjcEpRHFcTsP2x9Fa6o4tfyu7T+UBjILAvB+3YUkBD4cW82jkSZaI0YpVLWvb3a0Exi4qLhGabCLjm7RuSu6VNJOhC0r2x+Iidhp1HVh5Fu7T7tFTNlGVAfkxCHLUhy0MU1NytK03aVoMMwtyAiEKt4yIatU611KkRRoUteluedTtDNjgB+CIIp9bRIX+AtKD6DFSczDwSe+5iRbtE+7WUyjBI4nYfqq1QpdMdu+v3KfygJUoomklrK106Jisypr4rvCqKlWSs9upupkpwebJ/POb/s3ap6J63lWM3ctZRrqJ1SXbq8k5eEUxR2iEImWhCEKUpaUpSlKblKUAU7fOPVo4e3I6tp9wCQ0bv56tVWhSk3SnMkimTc4ap8nSpTLyuqPynj/Z7Mz6KxIZ8w5aLrmctq0M5KRDRbrHW1CF3MpSOUswzF2YKWZeEwtK3E3VWo/0N9tKKmK2dHQ60dQm7umMXsfWkGOPs/2O5bPmMieUeKSce+jXTtd4dRdZFyRBM+Y9e0m0QKXudwB2HWNeEzLT33IKJmWVMnVGrFXMiZNwVLjOBwOOUKn+kUTC2Za27ui052E01W6pzkpWqeStDkNkOUxdzpdMogU1YGE8dLyL6blyNnsk43wqWr2u7m32i66ROw4xumJDZErhzFNlY207gbnpIPFnmTW3TVUWPqHpTMAn28mf7UR97oPsUpSFoUhaFpTpUpSm5Sg5AAAAAAEZfYgWdHn0nVzxySn41c39A7kPckFPF3YaWbuKbnJIp0y/ogM0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApm+buui5LkPh7YqlUVS0/xk/L0zp/vRDdjXuzedmKUvTqYxLZduitGi7qvoZDKCqdn5pltZ/dr3jJCYeHcuT9lWnL/wB4B1FrDwnw2it9Xe6364p1TGoYx6m9QmXpjAqlwLusm9U2DyNIpwCuaIVyU1OpmOTdyfpCF0SkryjJDE2bS1F3Uo4ZlTOpw00KKlSbJIlPwS1qdchKH9D3T7vCMIhMy6tuOyTrRw7bmb6qiCzWmYqhk83SrQ565y8Dz8ub9OmUL9tuduDDG4WVmXVMKSUM/wAhI2RW6e9j7mWlK19Kz5SbvY5idiemW8hrC0JS9MMHcWqmYiBE2D2JUrXptU3vFGRLXzyoqZsnrUe5F74fS6lw2Tbs86rx8lFtXZ/XKIlrUBmnDpJqko7crUTTIXOcx+SUopZZ1IYsncyr2VUirLbdQqldKixfTD1P1Kep7Hg9lyZbjg+WQsZVgjXcrIrJMz1p5xTG3a/+Bal/SEWxugLBZ7P68PfEs/jociLep12H1xRXNukoT9IBLULCwzh2qCq6UeVJbIgiuov01q9hw93hjC3ThPbJXKKtuzdIOaPw2lCuMpz6fcdl/IKjxVjsBVsH8LkLhu2ZbwKSifMV2jWtVFy5eFqZhKcSGuDi20Nh64m7jlULnRbI8ymyNa72VLmPpahvxnzALHw0u6QfqvbPungTsRwz15O+kupqU9V1c38JDdmLLFS3235g4j2tdDSmUzh8Vu69URQxW39LlP3gotoBFLxuxpZsG5knCdVjlpotkqdVZfsE/wDjuTCumllOrmSNf2Kk9VNEhddJEymm1bJdvKfkfx8Luu5LlL8SSuLFG3badG+okEd+VL3R1DG/8mxif58wpnagn3V7YuReDK79wzteIiFbkuCqHSMs3SKY2T+Z/OATjot7JvNDne58Ind6xubq2n7vkjMOrMdW4jz/AOFk9U7dQuqohQ+q3co/75fx04VOx7k2qmKOJWBluSUNA4eWdb09aa7IppJsZjUjghvZXXMwt3Zfmndh4tzOCjOUXe2tKRaVy27r9MyLZQqZsnuT0J/m6gNlrPuxneMGlLNk6kMami4Sr6CrTlk/47ZRKhUdhpVt3FG4rZS+s10SvEidycmXd/1blMn+ZFuAK0xKvR/HvG1oWpWppySrnrXlUaI06p6k7o27XL605uwHWtvBmFR/xldi68zKKddUcqGrSpv/ADHXsBrzdv26rge0zqJPlWyFe5Imsdt/Q2N7tTuh+7u2kMGrNmXduXBejZq/Z9NdGiZz1IbuOB2QCQyGE9kSaekaFTLXu6dIQc1LhwVkUlt8rPrQVU49I1anqz9USvY09T2XT7LlU7jbtzoRztCHwb0X1CfXkiujxe53CZTdUXXhNfymO+DBLilmJGzpXVbLlLyaOUfRSfizgLcSXSdpkVSWzkULmKYnJMUdsVtglJrP7IQaLm6cWsqwLu+cUqm6QvvZiF/RElvyWUt+zpydJ1yNjnTsnripGygK7uS4JrEaXkLYtuSrGQUfU1JGSIfLq6fXKUN6V1SbvZVKfsSVzQRK7sNINKhLas9xPMq9JKUeSDdg2d/iQqqcuoT+LKLItzD2PmMKjWe7dOW6D/iHSyKvDVQIvkqXP6sidc/rzCubzw3ZYckdX9csu1pBR/1S/XJHIrOVia2mjHoEOXKmgVPKXcL0wFoyWENqz7AjppHmiHKhCqbqdd2pTfj3OUOnaVyXHC3AWwb0d1UVN9jH+701PUH7uvcm8/KYpvVfGytqTBK96USjr3bsl/SZHiD/AMteD/OHZxsKkva7W645ZPWjFCOmy5PfCGLX9EBbIxcxMtLfi3EzKrUSbM0dRY/aH3Zrb8aoOqeiEKoK4xxVUVYwcFTkSUjur+qokissQnuyFARs0XMYmrK3Pfj1WOtpNT6njqV3Nz+GvZm/H53ofdGsZrhtZKbRNFOHSMTt13eEMZdrZVBGPiY9I9U2zR04Ry0zbiqeiinX+Vep/wBAee+Ku0BiLI4inrBT7mMY2w+XaQqCR9wqFEzZM5vTN3LwzecA3rmMOGKT3f1gyFYucjktaiKdctDl7RaeeXc4HciSYcXqpd7JdlJJVby8XxDtOvJrXsT/APH4xV2A16SmIVqW3fT1HK/fLfVNEi8EyxzrIuaU7ilSkSWp60TNwhSCxxjVGvSLONHBViU9ZqfHQqAtwQm/bzLaMcQ6CVXD9+vvRih5xj+ec/qS/wBnbE2FRv6N53G8qCtdRGGj0KlJ6tTWVzfzCgOgysart82l77UczEm6qZaqZ6FoRol2e7Q5uAThdQv/ALhl6sMIpRWsK05nLODcBJNNSlamN2iVrwTjI4wkkDYb3CSJpTmiSOVOiXczVryekanZF7oV5csC9g7EjlYaaUUIZ2wrRA5iK7n1SjSlW9aFzFOYnDJ2wGQLFzVhpHuqx1HascRY3NCKXpTlENkPuZez/H/xS27fm2lywrabja7rdwnqJ17Iv4h2qkZv2aqG5Q6audFTcp59eCYV7guZaPNcttr9bjJEhyfioqgVQ/8APzALS3KV6tKdIVJfl6y6sgezbXd0bOUktaSfV6jVLl7lDdvT3eF6ovZV6VuCjLLdwJLIue+bwWom1WXM8er185NM27k930gGVsGzbDkE3BiR6z1ZBxxi69d2pz93Qu7wB+7khsFnr49svZWHZy1DkRohRwWixD9gXINWcSts9KNSaNcCklo4tDn384kW5KqKafFk7KvYdMa7RlzzNF3l2OHyir7mo0fKLKVzGMrnWOeh+6AelUNLT2G9xIWdcj1R5DyB9Ng8NymxuwTrXuOx9TuF7vpXANck7th8SsH447Y5VHB48h2roq1D7q9MqJ6GzF4CpamKfL60XhackrOW1DTivLfMEnR6flClMAyqqyaSdVVTaZCco1RVCryZxTdq1aLKs7aS4CVacGryvYKm9Tu8Mifn7lM/LylkGLL07e0lWyNa0rJLpMTVp55VD8Mv8OmU5f0hI7bi0IiGbMk6Uppp0qbpdU9eEYBDJuNwjw2bIK3O8ZRxV+IIs5rWmb1PSH0fYaQEyROWttWrJeieduqhXLwu6IfqjVS+7ElcXNoS74Gl5XMiyhlTvXZE0DVbt2yafTTJwuWbsOCLg2L3LpS1rpbOpeef0azW4jSYTORZEuinxfDAWbZt1zCsopZ90FoWTbEzIK8nfaRMuevri6hf5SG7PpWSKtxNoWHlIC70OLO3kUqKH/FU9CKf6gziv6JBaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6y6KK6CiK3TIpwDCn8B5Cka0lcN5ehE3sUuclSeeYvI+JRP3QugVViNh1KPZMl72Q4q1nUC8NHkkeE7k1ewP6oBXl6WQ8s57RVuY9YVPhNFKpVUKQyZzqpJKEp2NV60UqbpqKq0TpXkimH5jSJFbfioU8udVqdqilTjFCVyZD1Lk5Z8hd3N3VTjZZDG8kWlzLxCth4yW3ch91Pcoev8J+L/wBYMcXFGzkHFDYc2YZ3JLbu5RFsWpqcHL0jJ9LsS+iU6oDm7ikw9wXgbOJShpmrJo1IQnVO5Sy1JT9Yy0/jMLas6DrbVqwsGb/q5g2ae9k3BXdlWBOy9x0vzERTdfI0zMGFeEm2p3Zu7P8AF4XdbouQBXuMUSrL2LIb1SznY1I7SKTlGyV4W5+hmEPxJusrrAReZjrKRu9YiKJFIrLqUNXg8Lcp6jjBeNSlrTcqWlaV6W5Wgpx9alz4bSjiYspvWTiXB860VTdqdCn73um4RPU9j2PcgINiVckm0wuw7eUwHRl1HqyWeIM1McsSbJwcpCcgSDECfk2mOVhxrXB5GXRcIU1Z4yGasd1zdKRTqFy/7wlJMdrWbkonLMl2rinKRrTLue/aY6b3E2duk28cPINdZU/UeqJmImn/AAqHLkp/FqAObrXrdeKVu241rmJEK0fPD9wRM5FvlCNi/pKdwLfEFsGxS2g3VePVt+S76mdy47dPOJTtFE6AVDiNuW7iDbF5VTrvY1N4rV9XSuYn8w7mvrqE7YqractKZt+84PH2zYM0+wTaHibjYp8KrmNUKfp0y9jpmN/IQbKXLb8ddUQ4gpZLM1XJuVNTq0r5x6V7YrVq8vrDAvM24GB52DrTKm7QJU1NztKEKUxifwUKYvrQGivOhs8UlObdMSpbmV1zmHzLrzQ3PStXNl3fVDaTZotKcmbynMf7xgzQDFaPJFQUcrwat41MpcinT9QQonnPhgdv/mhzmR+/u73o31M3utT+aO47e3vieWkbAR6kFCUplO7WTMXNTtJkNlMf+CpSl9cA7OHStbnv25byKQhW1KbxRru9nXcqr/qyNaeu1e0LeGAtq3o61odCJiksiCJMpaV6pq93X8Yz4CpLNW51sTbjtx7TcJIuKvmp+6Iqc6/yp3JP82n3YydwYCYR3XKKz9w2NFvpB1011lCbhjVHcxAsc12tknjJbeUux3Ds3H4uyIb1IjjLE6etY1GOIcI4RUJ/01NMx01P4FCFyfy6YCv8XNiLD29kWa9mVLbLlDgKFbJbqSxfVFFgWraEDs94PEtlg9KZNoketXK9evOVOmdU34vojtKY7205LowjRw7X7FNOmev+p1B0Glr3NiJNtpu/W9WMKThN4uvSOv8AltzqE7LL5/ZdyAkeEUUrFWMwTVSORV1U7wxT04VM58xd31WnlEiuyDrc1rS8AVXIaUYOGlDdzqEyjPUKWlNyhaUp+KgblO0ArjB+4aTtrUbOeLfMzn3yh2RDVMap/wCfmL+iKY8kAuJyxwxi7eacmbkdxU2Xg1IkXUynFs3VZc5FzprxsA2V2r9fs6cErr1dDecbq+u4PJ5Q6DnFu2XrFSNxDtdRsoXpmQctukev4tTpU/RMYB5dMGC8tKIRsdw3DtUrZPc7tQ2Qend9NiR1m21hDEV1HlSNGJC16daJJkybtf0Cm9zUQV5aWDc1cbK4cPsKqrzbNzvpqoglUpE1e7qUvE1/SMLcsKyX7aVPdl4qEdTaye6QvKKzJ3BTdmbk5jepoAsRBFFBBNFHpET4BRXGNbVWsAynkafYd7rLeobKEURVP/ERWhv0RZ46blu2fIKtnCNFUlaaZ0z04JqAIrPXRI9DmQum0ozmlKEYnXaNaU6ai+XrY8oL2t28LcuNWOveDWYyzytVlEFKbla1UU1M5B6XqQ944Wu1KQbNaZto/UTpwnLf1FaeiE/Hyv4R1py+8ILjds5K6LWSXlWfWTOGyVVEjdoutlNX3ICJ7FMbiDbNhSFnX5ai8WjHu98RyjgtKGWKryi/8d0LAbrc9OM6LprxjS3G6lVD05OZTiSJ/wAtVTj4Pr7u29v8V2RAqotDcp+7IZNOhf4y/F/lKJpZVmMrMi6s0TVVXWU1Ha5+Uup3X8HqQEvFRXGrS0sXmFwL03I+bQI1OfuV081Nz3CtDfxHFuiN3ZarG7og8W9ploauqkuTlIq9icoCLX5PUazUPGsXrdhIuW7h1vh0tkSKgQyOoWtPRK5zF4ArK3rIRhrhOs3xAg0qRdaKtHB3JDkfHORTLnJqcHR7DKJTvu5bLMWIvS1+bsW03aN5BJvnpQtermIXMYnndjUdyuJGHKlNNvaaq61OojSONu/+CYCRWbc8VSy1JkxqUM3XdUc0TW1aHcprmIpRNTssynxh08E2qq0NKXSt0+bshqo+rQTIVEin6VSnP+kMA3te6MRjJIy0fW27bTru1ZkpkWV6e7lpSnILu+fyv4BcDJk3YN0mTZGiSSRNNNMnJKUB3hrNNWWpdNp3xgKR1SMeuVCrM3FS8E9N8UWS9fu5afyK9wNmRBL5sEt0kTk41bec2z+t3HUzeoU7ovTr/KA0I8opjtrKU5mxOXzz80a8L+aPq72MMc4633ZCQsc7WcHSUIkg9pU3Zd0Uo3TTv+/bZpvO57QdOjJ/9JaUqoQ38ZC7v+rHK2J10Sm4ztayZFZb01RFUhS/xqlT/wDMBrvhBhxfuGuHStuXOnRrMTTw/MyLTPmUTUUSolqnMU3S4wpDfoHG5sNGow0PGxCNeLYIEQL61MmUQm07DfN5Q943i6o+ll68SQnW2Za9XL+P1X9AsncoAg2K0eZzZrhVJKp6xqhHlal5dCE5dSeqyZhnbalUZuDbySKtD0VT3T5O6GcqUpqVKYtK0r1aVoKlNFTOGkgo6hWi7y3FeMMgjumUbU7gpezJ3NS8Knn5uCWga6XVjA9wnxtxFdLXRPqncUOi2jSxNVGqbs6RNNStc/DoUgs3YskHsxa1zSz655SaO4md0y0g1qjWh9FPkcKotRniVYUibWcmbpKbu6fOnQxqevLThF/SKOm6xQj1CFjrHYVkn5q7tCNiFOXd9VRM2Uv+cMUB88S1eeGZgrRR4dVpAh1tzsCEOVVT/UkUJ/n0u7FqiubMtV7EruLouVXVmpCunlLXgt0q7ldKnbrXcpUxvxU7igsYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXauK9vookcaTsyht/5m2lw097bupn/jpT34gsQVxI4SQD+Sn5ZN7IN151FNA5klNyiOQ+Y2nTzs+5xndAOyyxIsaTZxaz2XZoGl0SKNUFjUrWvHaXVr6vgj9Td5srduWMtktsyKq8rm0FWyJNPgcI/ZdoYVrgNbTVgWPI6eVKRPQLWtS9Iu/N+dLg+mCYTlpMbhk4yXWWcIqxe+CpaZsvXiZTgOm1xEsp0moshcbSpE9WpuFWmXTLqrfzOEJUiqkqimqlXdIpwiilHez3GN49CNiZZ4oirJtXr1RyalVNNMmmZMm4Xs+zF5UpSlNylKdIBX9w4sWlac9W37gfGarUiTyxD1JwTFIbJpk7avqR8W+MNtq1jFaFXISUhObqdT04RU9LV09zutMphl5SxYOWuPnjlW1HSxW5EE01SlMUmQ+pQ5S91nEPRwPhiTkY6rJu1m0XH7zIiqbd/6JvXtdwc1fXAJE9xBspvb0Rdb1VHmVMqFKg4XJQmWuUx8x931o+UfifbPNhnEuy1jDv2ibtCjimnU9FV1EUi7nncj+cUFsLYKQtmEteaqeSZwKhF0t85a0VomSqZCqdLp8Aw6h8HowzeiLmXfKmK0aMEjKHoY5Um7kyxKZtztGygO1CYlM5263sOmdBq2bLbySMof6oVdcI25Qnc5U1PciaxskzlGJJKNWou3X4ZDk7IVehgVCNHqkojcsvv5Ryk4I5zF1CnTMv2WXp8F0oXp9oWDatutrSttjbrZwdVNknokUP0zVAdG57raWwRsRyg4dOn59Fq0bUpVVQ2XdN0jVyjrqXxbtTNW0g5Uj3kgmc6LV7wFK5M3nV3S9iYfW6rRb3bVi5q+XYvYxxvhs5b03DlNky16tBGZPBCJmpRtMy9xTDhw2y0oZVQtd3cQWR6XB6XBXNX+IBm2uIGGT5YiDCdilVl+t13S7vW9Xz/UcIdtLEOyVEW6xbiYbjh1vdHhdMy2XPk3O6yCPOcErUXSo1XUXqQ+9s9C1pStSNmxm1C/xkVN/IP1D4NW5Cbx0XCyiscosskrlTKatTt9HdNUpadgAmEFccDcaS/MaTSeaB9BeqdeEU/4xnhA7Ew2icPqSXMx+4dKSVUqqmcUL1UyZCcgtBPAEKcX7Ft7hNbaLV85XROVFwo3Qqqk1OolnLqG9bl90OrCYm2ZcsMyfxzlJdB8qkgdGtSVq2MpmylVJm4HJH6UshdvPPp2LuV5HtpNcjp60TInUp1SEKnnpnL0qZSFzetGFb4JRTdJm3byjlGrNrGtyKJEKWpjMjL1TPXt7u+a+4ATFlcFnOI5eajJGNO2YZt8rpVpUqXb3dwY6PxFtt9GqTDyq8U0RynKrJE0CqlU5NS1OMXaGEkTbULPwL6Rdyqdx5d975rwus0R6VaeoLuj4q4XSjhk1bK3q9WWilyKxyhm6VSpUTIZPcNTLw+Aqan8NAE4g52KuKMJJwzxJ2yXzZFka7pTDMiNWnbbSz7cbQEbwkW3JUN1TVUPmOb+cJKAr+ZxUgYCafwzyHlaLR8erKLKFRLpb3KXMc+fMOZLEG0KW4ncDN7FSCR1SI9N0nyq5c9M9eyKQw7Nx4fs7gdy7xd4ZPmrb60DX1KanVMIzOYFQkwdStJNVEh1c9CkL0su9SNjU3O3lLugJJc97xtj0YkXiJBzzQXK1RMxQoYplD8gvKHZYXpb8g7Qj0V6aztRWjYlenVUqVN056bnYlPwPXDsTNooSzSIa0X0yREg2eJZfPol1CiPWfhklalxknaTbp0ik3dtGzZUpaUSK4clWP1PVgLIFc39c0nFSUFEs5drDoyW+yqyrshDJomTKQxUuEbLun3Te9GFjDoOmTSRb0QdtEFk6V3aEUpQ25UBTpMXLgjph62esEZmKodq1I+bH3CmWUj989JPuDZf5w6knjW0nUE2dus45o6cEZOCvVnCNW6NVG++apHObg5twuQTvEuUraFtUkIhi0oqrING9V1k6VSaUUOVAzhT8RExX9yXdB21EZFZOElNJo6mEXDYqKKL4yBipkaVKXq148Bl0McikM0IW0lzMXCaBzmorSilKqslnhCUSy9pKpP0iiR2DiZS+pB+zowQRrHtWTgyrd1Rcpt8Ez0LyexGMtO+WFyXo8sKQiGhlmqBlVHKRqbiiqVCoq7hew3Dn3BLbZse37Mo55hNlCmdmIdydRWqhjZeR0zVAS0Q65r5j7XesIpaOkXjqQTVO3RZJUUrUqeXPu5jF7oTEQu47BhLsuSNnJxmk7LGt1kyIrJ0MTdUycLd/RAd/nttM1HyS03HkPG8N4Q6xczb8p2umCV0We4VYIN5qLOq/JnbFoqTMqX1HbEFXwOQWnZScVuWRUdO+s1OalaIm30VynubvVy5cnT7EdqmEjVW6mF2updyq4aUb65DFLQjhVvn0jUp51K6xv5AGbm8S4CCk1YpVq7cuk3SSFUW6VDmOdVEyxNzp+pMM5b9wMLpYElIheirZTMSlTFymoYhtwxTUEZuLDasxPc8sdLqM32/GjwhqJlNQpkkVkeSb1C5hn7VtdtaMRzNbLnWqZQ7hZdXpnVVUNumOannAJKOBjZaQLFRzqQMlVSjZA61Sk5RsohrXF60HLlds2XcKKJqNU9zJyqrImWob+JMps/aygMvz720e4JO3VXlE3MUzo+c1PwSESry65/U9l66g+nP7ZFG5HVLritA5zkIffRcpjeeX+cUVJc8Rhg6ZSU0efkEpGXKozcr0UVUKWkghkpRQnUNTIYlcpe4IPq9tKxHztsmXEVTdctXa7lU1CZnLdy3JuUKfLlJxaG7u8oBf+5Tqbg5EJYYlWGqWiLW5WNd7J8nPXgl4NO16ovuiiRRcqwmmqchHrJuG5+QdOoDKCnoDHSHnDt0DRKjTf8ApHZajgptRJRwVLdrl5Bs5i8EXCK+jMJLOhoNtCxbGqKbZ03d6paFoqqokvrEzG8+mcBzDXFh1fqrpOLo1kKoIkdGqZnUuZLMamamcvT4ZTDE2tinbT635GfQiyR8cxOVGlUy0WUrwjE3FEU+Gmbg8mokFt4fQNqLJrR6q5dONJEE1Dbu6iQ51d3+eYRaUwLjnaLtROdk1ZBWqJkV1zlNl0NbSJWlKcItddTpm7QCVxuIdqy7ttHRkjvtVykVclUm5zEoRQuoTMfcyk4vuhNBXVp4YRdpO2SsK/fpIooEbrtaqU03GmlokMcvrfi0FigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAONynaHIAA43KdocgA43KdocgADjcp2qBuU7VByADjcp2qBuU7Q5ABxuU7VByAAONynaDcoOQAcblOruBuU7VByADjcp2hyAAOK0pXpVpQNynaHIAONynaDcp2hyADjcp2hyAAONynaDcp2hyADjcoG5TtUHIAA43KDkAHwOkm5JVNRMpiV6pTU3aVGM52reqgVvWIZVRS3chKolyl/wCNygzQ43KdoBjiRcc2dGdoNESrq7uorQtKG6fTqMjuU7QblO0OQAcblO0OQAcblO0G5TtUHIAONynaDcp2hyAD51KU1K0rSlaV6Vd0VzD4LWZBmZb3IuWrNu9ap1qflUcmzHr/ABUqen6ZhZQ43KdoBW7TBu2WLojoizgxk6sakpU3SpVqTKlu9sdcuCNq733prvaNKN9PR1eLqfe50dXL28huoLQ3KdoNynaAVxK4MWhMoqpKkVyOFDL7pTbnCqVvTd/g+pU/5RJ7Zttha0Q2iGBMqLfPubpKcLdNm84SDcp2g3KdoByONynaHIAONylerSgblO0OQAcblN3d3ByAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//Z"],"sum":"Description\nKHÓA CỬA THÔNG MINH HUBERT HB CG26F – CÔNG NGHỆ HIỆN ĐẠI, AN TOÀN TUYỆT ĐỐI \nTrong thời đại công nghệ 4.0, khóa cửa thông minh trở thành lựa chọn tối ưu cho những ai đề cao tính bảo mật, tiện lợi và hiện đại trong không gian sống. Hubert HB CG26F là dòng khóa điện tử cao cấp tích hợp nhiều công nghệ tiên tiến, đặc biệt là nhận diện khuôn mặt 3D , mang lại trải nghiệm sử dụng an toàn và đẳng cấp cho gia đình và doanh nghiệp.\nNHỮNG TÍNH NĂNG NỔI BẬT CỦA HUBERT HB CG26F \nCông nghệ mở khóa hiện đại – bảo mật tối ưu \nNhận diện khuôn mặt 3D : \nMở khóa siêu tốc chỉ trong 0,5 giây. Khả năng hoạt động chính xác trong điều kiện thiếu sáng và chống giả mạo khuôn mặt.\nMở khóa từ xa qua WiFi : Kết nối qua ứng dụng Wishome  \ncho phép mở khóa và theo dõi lịch sử sử dụng ngay trên điện thoại.\nCảm biến vân tay FPC Thụy Điển : Nhận diện chính xác, bảo mật cao, thời gian phản hồi chỉ 0,5 giây.\nMật khẩu bảo mật cao : Hỗ trợ mã số dài tới 32 ký tự, có chức năng xáo trộn số để chống nhìn trộm.\nThẻ từ: Quét nhanh, tiện lợi, phù hợp cho người già và trẻ nhỏ\nChìa khóa cơ chống sao chép : Dự phòng trong trường hợp khẩn cấp, đảm bảo an toàn cao hơn\nAn toàn vượt trội \nCảnh báo xâm nhập : Kích hoạt còi báo động khi có hành vi phá khóa hoặc nhập sai mã/vân tay nhiều lần.\nChế độ bảo mật riêng tư : Có thể khóa từ bên trong để đảm bảo an toàn tuyệt đối khi cần thiết.\nPin sạc lithium 5000mAh : Dung lượng lớn, tiết kiệm năng lượng, có thể sử dụng trong thời gian dài mà không cần thay pin thường xuyên.\nCamera hiển thị hình ảnh : Cho phép quan sát trực tiếp người đang đứng trước cửa, tăng cường bảo vệ và nhận diện.\nFace ID 3D siêu nhanh : Nhận diện chính xác, kể cả khi có thay đổi nhẹ trên khuôn mặt.\nChống cháy nổ – chống giật : Trang bị bo mạch chống chập điện, đảm bảo an toàn tuyệt đối trong điều kiện khí hậu nóng ẩm tại Việt Nam.\nTHÔNG SỐ KỸ THUẬT","desc":"Description\nKHÓA CỬA THÔNG MINH HUBERT HB CG26F – CÔNG NGHỆ HIỆN ĐẠI, AN TOÀN TUYỆT ĐỐI \nTrong thời đại công nghệ 4.0, khóa cửa thông minh trở thành lựa chọn tối ưu cho những ai đề cao tính bảo mật, tiện lợi và hiện đại trong không gian sống. Hubert HB CG26F là dòng khóa điện tử cao cấp tích hợp nhiều công nghệ tiên tiến, đặc biệt là nhận diện khuôn mặt 3D , mang lại trải nghiệm sử dụng an toàn và đẳng cấp cho gia đình và doanh nghiệp.\nNHỮNG TÍNH NĂNG NỔI BẬT CỦA HUBERT HB CG26F \nCông nghệ mở khóa hiện đại – bảo mật tối ưu \nNhận diện khuôn mặt 3D : \nMở khóa siêu tốc chỉ trong 0,5 giây. Khả năng hoạt động chính xác trong điều kiện thiếu sáng và chống giả mạo khuôn mặt.\nMở khóa từ xa qua WiFi : Kết nối qua ứng dụng Wishome  \ncho phép mở khóa và theo dõi lịch sử sử dụng ngay trên điện thoại.\nCảm biến vân tay FPC Thụy Điển : Nhận diện chính xác, bảo mật cao, thời gian phản hồi chỉ 0,5 giây.\nMật khẩu bảo mật cao : Hỗ trợ mã số dài tới 32 ký tự, có chức năng xáo trộn số để chống nhìn trộm.\nThẻ từ: Quét nhanh, tiện lợi, phù hợp cho người già và trẻ nhỏ\nChìa khóa cơ chống sao chép : Dự phòng trong trường hợp khẩn cấp, đảm bảo an toàn cao hơn\nAn toàn vượt trội \nCảnh báo xâm nhập : Kích hoạt còi báo động khi có hành vi phá khóa hoặc nhập sai mã/vân tay nhiều lần.\nChế độ bảo mật riêng tư : Có thể khóa từ bên trong để đảm bảo an toàn tuyệt đối khi cần thiết.\nPin sạc lithium 5000mAh : Dung lượng lớn, tiết kiệm năng lượng, có thể sử dụng trong thời gian dài mà không cần thay pin thường xuyên.\nCamera hiển thị hình ảnh : Cho phép quan sát trực tiếp người đang đứng trước cửa, tăng cường bảo vệ và nhận diện.\nFace ID 3D siêu nhanh : Nhận diện chính xác, kể cả khi có thay đổi nhẹ trên khuôn mặt.\nChống cháy nổ – chống giật : Trang bị bo mạch chống chập điện, đảm bảo an toàn tuyệt đối trong điều kiện khí hậu nóng ẩm tại Việt Nam.\nTHÔNG SỐ KỸ THUẬT","specs":{"Công nghệ di chuyển":"AIVI 3D + LSD","Điều khiển qua App":"Ecovacs Home","Dòng":"Lau hút đồng thời","Dung tích hộp nước":"240ml","Dung tích Hộp rác":"470ml","Dung lượng PIN":"5200mAh","Hạng mục":"Chi tiết","Lưu trữ":"100 vân tay, 100 thẻ từ, 100 mã số, 30 khuôn mặt","Chất liệu":"Hợp kim nhôm + ABS cao cấp","Kích thước cửa phù hợp":"Độ dày từ 40–90mm, độ rộng đố cửa tối thiểu 80mm","Ruột khóa":"Chuẩn 6068 – độ bền cao, chống cắt phá"},"feats":["Description","KHÓA CỬA THÔNG MINH HUBERT HB CG26F – CÔNG NGHỆ HIỆN ĐẠI, AN TOÀN TUYỆT ĐỐI","NHỮNG TÍNH NĂNG NỔI BẬT CỦA HUBERT HB CG26F","Công nghệ mở khóa hiện đại – bảo mật tối ưu","Nhận diện khuôn mặt 3D :","Mở khóa từ xa qua WiFi : Kết nối qua ứng dụng Wishome","Thẻ từ: Quét nhanh, tiện lợi, phù hợp cho người già và trẻ nhỏ","Chìa khóa cơ chống sao chép : Dự phòng trong trường hợp khẩn cấp, đảm bảo an toàn cao hơn","An toàn vượt trội","THÔNG SỐ KỸ THUẬT"],"sku":"HB CG26F","vid":"","mod":"HB CG26F","brand":"Hubert","slug":"hb-cg26f-khoa-cua-dien-tu-hubert-hb-cg26f","_source":"avatar2-add-product","_source_url":"https://hubert.vn/san-pham/khoa-cua-dien-tu-hubert-hb-cg26f/","_added_at":"2026-10-05T11:47:23.592Z"},{"n":"Máy rửa bát bán âm Bosch SMI6ZCS16E","l":"https://boschhome.com.vn/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6/?gad_source=1&gad_campaignid=22745767436&gbraid=0AAAAADb_g-0El2armGKS39qd1R78_yI48&gclid=CjwKCAjwoOjVBhArEiwAUwDak0nrb40nNozRXxxsskhVCjxPMlk1m3LuWIO62B0qSStfBLeOrLwNURoCITEQAvD_BwEhe&gclid=CjwKCAjwoOjVBhArEiwAUwDak8ZiRw14XwGNOwXbbV8yd7PcMcea4meRjuQ-PZY0im_HG9Z-qIFTPRoCpz4QAvD_BwEjwKCAjwoOjVBhArEiwAUwDakxtuAv3vMNheBF7y8iFuvYwR7dyzBXqRBguZh1xF2AQ0c-1uySLETBoCI2wQAvD_BwE","i":"https://b1.congngheviet.com.vn/file/s2-hc03/boschhome-com-vn/wp-content/uploads/2024/11/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6.jpg","p":"Giá niêm yết: 38.500.000đ — Giá KM: 23.200.000đ","pn":23200000,"listPn":38500000,"salePn":23200000,"priceMode":"both","c":"Máy rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://b1.congngheviet.com.vn/file/s2-hc03/boschhome-com-vn/wp-content/uploads/2024/11/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6.jpg"],"sum":"Với dung tích rửa lớn lên đến 14 bộ chén đĩa châu Âu cùng 8 chương trình rửa cơ bản đa dạng, 3 chương trình rửa bổ sung và được tích hợp rất nhiều công nghệ hiện đại như tính năng điều khiển từ xa Home Connect, công nghệ sấy khô Zeolith cao cấp, hệ thống 3 giàn rửa linh hoạt,… SMI6ZCS16E chính là trợ thủ đắc lực giúp công việc dọn dẹp sau nấu nướng trở nên dễ dàng và đơn giản hơn bao giờ hết. \nƯu điểm \nThời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng. \nKiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. . \nChất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng. \nBảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa. \nDung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa. \nSở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình. \nChức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn. \nCông nghệ Home Connect giúp bạn kết nối và điều khiển máy rửa bát từ xa. Giúp bạn cập nhật lượng tiêu thụ điện nước và chất tẩy rửa, cập nhật tình trạng máy, điều khiển từ xa, điều khiển từ xa bằng giọng nói một cách vô cùng tiện lợi với các thao tác dễ dàng. \nSấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn. \nChương trình rửa thông minh Intelligent được tích hợp ở những dòng máy rửa bát cao cấp của Bosch, giúp tự động điều chỉnh quá trình rửa bát. Sau khi chương trình rửa kết thúc, người dùng có thể đánh giá kết quả làm sạch và làm khô thông qua ứng dụng Home Connect. Dựa vào dữ liệu trên, máy rửa bát sẽ tự động điều chỉnh các cài đặt và đề xuất người dùng một vài lựa chọn thay thế. \nChương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại. \nTăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus. \nTăng áp lực nước rửa giàn dưới cùng với tính năng vùng rửa chuyên sâu IntensiveZone và giàn giữa với hệ thống thủy lực Extra Clean Zone giúp bạn loại bỏ hoàn toàn các vết bẩn cứng đầu trên những vật dụng khó rửa. \nThiết kế 3 khay rửa thông minh, linh hoạt giúp tối ưu lượng bát đĩa, nồi chảo khi xếp vào máy. Đặc biệt, giàn giữa có thể điều chỉnh nâng lên và hạ xuống thêm 5 cm dễ dàng chỉ bằng thao tác chạm cần gạt. \nĐộng cơ không chổi than EcoSilence Drive mang lại chất lượng rửa cao với độ ồn thấp, đảm bảo thiết bị hoạt động trơn tru và yên tĩnh. \nNhược điểm \nChưa được trang bị tính năng rửa nửa tải (HalfLoad). \nTính năng  \nHẹn giờ. \nKhóa phím điều khiển bảo vệ trẻ em. \nCảm biến nhận biết độ sạch của nước. \n8 chương trình cài đặt sẵn: rửa tự động (Auto 45 – 65°C), rửa tiết kiệm (Eco 50°C), rửa chuyên sâu (Intensive 70°C), rửa thông minh (Intelligent), rửa nhanh (Express 60°C), rửa yên tĩnh (Silence 50°C), chương trình rửa yêu thích (Favourite), rửa ly (Glass 40°C). \n3 chương trình rửa bổ sung: tăng tốc độ rửa SpeedPerfect Plus, vùng rửa chuyên sâu Intensize Zone, sấy tăng cường Extra Dry. \nCông nghệ Home Connect kết nối và điều khiển máy rửa bát từ xa. \nCông nghệ ActiveWater giúp tối ưu lượng nước rửa từng chu kỳ. \nChức năng Machine Care tự động vệ sinh khoang máy rửa bát. \nVùng làm sạch thêm ExtraClean Zone với 3 vòi phun nước xoay giúp làm sạch triệt để bát đũa của bạn với lượng nước gấp 3 lần mà không cần thêm chất tẩy rửa hay tăng nhiệt độ. \nHệ thống Dosage Assistant giúp hòa tan và phân bổ đồng đều chất tẩy rửa. \nCảm biến tải LoadSensor giúp tiết kiệm nước và năng lượng khi làm sạch số lượng bát đĩa ít hơn. \nCảm biến nước AquaSensor giúp điều chỉnh lượng nước dựa vào độ bẩn của bát đĩa. \nKhử khuẩn bằng nước nóng. \nBáo thiếu muối. \nBáo thiếu chất tẩy rửa. \nBáo thiếu nước làm bóng. \nTự động báo lỗi và dừng hoạt động khi có vấn đề về nguồn cấp nước (Cảm biến AquaStop). \nThiết bị bảo vệ chống sét lan truyền. \nThông số kỹ thuật","desc":"Với dung tích rửa lớn lên đến 14 bộ chén đĩa châu Âu cùng 8 chương trình rửa cơ bản đa dạng, 3 chương trình rửa bổ sung và được tích hợp rất nhiều công nghệ hiện đại như tính năng điều khiển từ xa Home Connect, công nghệ sấy khô Zeolith cao cấp, hệ thống 3 giàn rửa linh hoạt,… SMI6ZCS16E chính là trợ thủ đắc lực giúp công việc dọn dẹp sau nấu nướng trở nên dễ dàng và đơn giản hơn bao giờ hết. \nƯu điểm \nThời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng. \nKiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. . \nChất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng. \nBảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa. \nDung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa. \nSở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình. \nChức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn. \nCông nghệ Home Connect giúp bạn kết nối và điều khiển máy rửa bát từ xa. Giúp bạn cập nhật lượng tiêu thụ điện nước và chất tẩy rửa, cập nhật tình trạng máy, điều khiển từ xa, điều khiển từ xa bằng giọng nói một cách vô cùng tiện lợi với các thao tác dễ dàng. \nSấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn. \nChương trình rửa thông minh Intelligent được tích hợp ở những dòng máy rửa bát cao cấp của Bosch, giúp tự động điều chỉnh quá trình rửa bát. Sau khi chương trình rửa kết thúc, người dùng có thể đánh giá kết quả làm sạch và làm khô thông qua ứng dụng Home Connect. Dựa vào dữ liệu trên, máy rửa bát sẽ tự động điều chỉnh các cài đặt và đề xuất người dùng một vài lựa chọn thay thế. \nChương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại. \nTăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus. \nTăng áp lực nước rửa giàn dưới cùng với tính năng vùng rửa chuyên sâu IntensiveZone và giàn giữa với hệ thống thủy lực Extra Clean Zone giúp bạn loại bỏ hoàn toàn các vết bẩn cứng đầu trên những vật dụng khó rửa. \nThiết kế 3 khay rửa thông minh, linh hoạt giúp tối ưu lượng bát đĩa, nồi chảo khi xếp vào máy. Đặc biệt, giàn giữa có thể điều chỉnh nâng lên và hạ xuống thêm 5 cm dễ dàng chỉ bằng thao tác chạm cần gạt. \nĐộng cơ không chổi than EcoSilence Drive mang lại chất lượng rửa cao với độ ồn thấp, đảm bảo thiết bị hoạt động trơn tru và yên tĩnh. \nNhược điểm \nChưa được trang bị tính năng rửa nửa tải (HalfLoad). \nTính năng  \nHẹn giờ. \nKhóa phím điều khiển bảo vệ trẻ em. \nCảm biến nhận biết độ sạch của nước. \n8 chương trình cài đặt sẵn: rửa tự động (Auto 45 – 65°C), rửa tiết kiệm (Eco 50°C), rửa chuyên sâu (Intensive 70°C), rửa thông minh (Intelligent), rửa nhanh (Express 60°C), rửa yên tĩnh (Silence 50°C), chương trình rửa yêu thích (Favourite), rửa ly (Glass 40°C). \n3 chương trình rửa bổ sung: tăng tốc độ rửa SpeedPerfect Plus, vùng rửa chuyên sâu Intensize Zone, sấy tăng cường Extra Dry. \nCông nghệ Home Connect kết nối và điều khiển máy rửa bát từ xa. \nCông nghệ ActiveWater giúp tối ưu lượng nước rửa từng chu kỳ. \nChức năng Machine Care tự động vệ sinh khoang máy rửa bát. \nVùng làm sạch thêm ExtraClean Zone với 3 vòi phun nước xoay giúp làm sạch triệt để bát đũa của bạn với lượng nước gấp 3 lần mà không cần thêm chất tẩy rửa hay tăng nhiệt độ. \nHệ thống Dosage Assistant giúp hòa tan và phân bổ đồng đều chất tẩy rửa. \nCảm biến tải LoadSensor giúp tiết kiệm nước và năng lượng khi làm sạch số lượng bát đĩa ít hơn. \nCảm biến nước AquaSensor giúp điều chỉnh lượng nước dựa vào độ bẩn của bát đĩa. \nKhử khuẩn bằng nước nóng. \nBáo thiếu muối. \nBáo thiếu chất tẩy rửa. \nBáo thiếu nước làm bóng. \nTự động báo lỗi và dừng hoạt động khi có vấn đề về nguồn cấp nước (Cảm biến AquaStop). \nThiết bị bảo vệ chống sét lan truyền. \nThông số kỹ thuật","specs":{"Loại máy rửa chén":"Bán tích hợp","Bảng điều khiển phía trước":"Có","Nhãn năng lượng":"B","Độ ồn tối đa":"40dB","Xây dựng chất lượng":"Cao cấp","Chất lượng giặt":"Cao cấp","Bảng điều khiển vị trí":"Ngoài","Vị trí thiết bị":"Được xây dựng trong","Chiều cao thích hợp":"81,5 – 87,5cm","Chiều rộng thích hợp":"60 – 60,8cm","Chiều sâu thích hợp":"55 cm","Chiều cao của bảng điều khiển phía trước":"54,1 – 61,1cm","Hệ thống bản lề":"Cửa trên cửa","Chiều cao":"81,5 cm","Chiều rộng":"59,8 cm","Chiều sâu":"57,3 cm","Chân có thể điều chỉnh":"Có","Đầu có thể tháo rời":"–","Cân nặng":"47,1kg","Loại ngăn đựng dao kéo":"Ngăn kéo","Khay dao kéo có thể điều chỉnh độ cao":"–","Không gian để bát đĩa":"Nhiều, Trung bình","Số lượng cài đặt địa điểm":"14","Bố cục có thể tùy chỉnh":"Có","Giá trên có thể điều chỉnh":"Có","Giá đỡ trên có thể gập lại":"Có","Có thể gập lại hỗ trợ giá đỡ thấp hơn":"Có","Rất phù hợp với các loại món ăn":"Bình sữa trẻ em, Chảo nướng, Bát đĩa nửa tải, Nồi và chảo lớn, Hộp nhựa, Ly uống rượu (23cm)","Chiếu sáng nội thất":"Có","Chương trình giặt":"Chu kỳ tự động, tiết kiệm, chuyên sâu, ngắn, im lặng","Chức năng nửa tải":"–","Cảm biến tải":"–","Chức năng chu kỳ rút ngắn":"Có","Chiếu sàn":"Không","Giá đỡ dưới có chức năng nâng":"–","Phát hiện chất tẩy rửa":"Có","Nạp chất tẩy rửa máy rửa chén tự động":"–","Chỉ báo nạp muối":"Có","Chỉ báo nạp nước trợ xả":"Có","Tín hiệu kết thúc chu kỳ":"Có","Loại tín hiệu kết thúc chu kỳ":"Quang học","Khóa an toàn trẻ em":"Có","Số nhiệt độ làm sạch":"6","Nhiệt độ làm sạch tối đa":"70°C","Phương pháp sấy":"Zeolit ​​(bát khô thêm)","Vùng chuyên sâu":"Có","Hạng tốc độ":"Nhanh","Điều khiển qua ứng dụng":"Có","Điều khiển máy sấy qua ứng dụng":"Vận hành từ xa, Đọc thông tin qua ứng dụng","Bắt đầu trì hoãn":"Có","Bắt đầu phân chia độ trễ":"1 – 24 giờ","Tùy chọn tắt tự động":"Có","Ngôn ngữ bảng điều khiển":"Tiếng Anh, Ký hiệu","Chi phí năng lượng hàng năm":"72,8 euro","Tiêu thụ năng lượng hàng năm":"182 kWh","Tiêu thụ năng lượng trên mỗi chu kỳ":"0,65 kWh","Chức năng tiết kiệm năng lượng":"Tự động tắt, Chu trình tiết kiệm năng lượng, Cấp nước nóng, Lượng nước sử dụng được xác định theo mức độ bẩn","Thời lượng chu kỳ sinh thái":"215 phút","Chi phí nước hàng năm":"3,53 euro","Lượng nước sử dụng hàng năm":"2520 lít","Lượng nước sử dụng mỗi chu kỳ":"9 lít","Thân thiện với môi trường":"Đúng","Số lượng vòi phun tay phun":"2","Loại động cơ":"Biến tần","Chất liệu nội thất":"Thép không gỉ","Đầu nối nước":"Nước lạnh và nước ấm","Bảo vệ rò rỉ":"Có","Loại bảo vệ rò rỉ":"Cảm biến rò rỉ đáy, Bảo vệ chống tràn, Ống an toàn","Ống đầu vào có thể tháo rời":"–","Ống thoát nước có thể tháo rời":"–","Chiều dài ống đầu vào":"1,65 m","Loại nguồn điện":"Mạng lưới điện","Nguồn điện tối thiểu":"2400W"},"feats":["Thời gian bảo hành lên tới 3 năm, đảm bảo chất lượng mang lại sự an tâm cho khách hàng.","Kiểu dáng âm tủ sang trọng, đồng bộ với không gian bếp, thể hiện phong cách thẩm mỹ hiện đại của bạn. .","Chất liệu thép không gỉ cao cấp, có khả năng chịu lực tốt, chống bám vân tay và bền bỉ theo thời gian sử dụng.","Bảng điều khiển được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo, giúp bạn dễ dàng vận hành và theo dõi chu trình rửa.","Dung tích chứa lớn, công suất rửa 14 bộ bát đĩa châu Âu tương đương với lượng bát đĩa dành cho một gia đình Việt có 4 – 6 thành viên; có thể gộp 2,3 bữa ăn cho 1 lần rửa.","Sở hữu 8 chương trình rửa cơ bản và 3 chương trình bổ sung thông minh giúp người dùng có đa dạng sự lựa chọn, tùy thuộc vào lối sống sinh hoạt và thói quen ăn uống của mỗi gia đình.","Chức năng rửa yêu thích Favourite giúp bạn kết hợp chương trình cơ bản và tính năng đặc biệt trong một nút nhấn.","Sấy khô hiệu quả với công nghệ sấy Zeolith. Giúp bát đĩa được sấy khô hoàn hảo và tiết kiệm điện năng hơn.","Chương trình sấy tăng cường ExtraDry sẽ tăng nhiệt độ ở chu trình xả cuối cùng lên 70°C và kéo dài trong 10p, giúp sấy khô bát đĩa một cách hoàn hảo và diệt sạch vi khuẩn gây hại.","Tăng tốc độ rửa, giảm đến 75% thời gian rửa với công nghệ SpeedPerfect Plus."],"sku":"SMI6ZCS16E","vid":"","mod":"SMI6ZCS16E","brand":"Bosch","slug":"smi6zcs16e-may-rua-bat-ban-am-bosch-smi6zcs16e","_source":"avatar2-add-product","_source_url":"https://boschhome.com.vn/may-rua-bat-ban-am-bosch-smi6zcs16e-serie-6/?gad_source=1&gad_campaignid=22745767436&gbraid=0AAAAADb_g-0El2armGKS39qd1R78_yI48&gclid=CjwKCAjwoOjVBhArEiwAUwDak0nrb40nNozRXxxsskhVCjxPMlk1m3LuWIO62B0qSStfBLeOrLwNURoCITEQAvD_BwEhe&gclid=CjwKCAjwoOjVBhArEiwAUwDak8ZiRw14XwGNOwXbbV8yd7PcMcea4meRjuQ-PZY0im_HG9Z-qIFTPRoCpz4QAvD_BwEjwKCAjwoOjVBhArEiwAUwDakxtuAv3vMNheBF7y8iFuvYwR7dyzBXqRBguZh1xF2AQ0c-1uySLETBoCI2wQAvD_BwE","_added_at":"2026-10-02T09:16:45.887Z"},{"n":"KHAY CHIA THÌA NĨA ĐA NĂNG CHẤT LIỆU NHỰA PP CAO CẤP XT.P900 / XT.P900-1 - Grandx","l":"https://grandx.com.vn/product/khay-chia-thia-nia-da-nang-chat-lieu-nhua-pp-cao-cap-xt-p900","i":"https://grandx.com.vn/wp-content/uploads/2024/12/XT.P600.P900-2.jpg","p":"940.000đ","pn":940000,"listPn":0,"salePn":940000,"priceMode":"both","c":"Khay chia thìa, dĩa","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/XT.P600.P900-2.jpg"],"sum":"Đặc tính sản phẩm \nKhay chia thìa nĩa\nChất liệu nhựa cao cấp PP chịu nhiệt\nĐạt các têu chuẩn vệ sinh an toàn cho sức khỏe được\nkiểm tra chứng nhận bởi FDA\nKích thước sản phẩm đa dạng, dễ lắp đặt, dễ vệ sinh \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “KHAY CHIA THÌA NĨA ĐA NĂNG CHẤT LIỆU NHỰA PP CAO CẤP XT.P900 / XT.P900-1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"Đặc tính sản phẩm \nKhay chia thìa nĩa\nChất liệu nhựa cao cấp PP chịu nhiệt\nĐạt các têu chuẩn vệ sinh an toàn cho sức khỏe được\nkiểm tra chứng nhận bởi FDA\nKích thước sản phẩm đa dạng, dễ lắp đặt, dễ vệ sinh \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “KHAY CHIA THÌA NĨA ĐA NĂNG CHẤT LIỆU NHỰA PP CAO CẤP XT.P900 / XT.P900-1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Tên sản phẩm":"Khay chia thìa dĩa đa năng chất liệu nhựa PP cao cấp XT.P900 / XT.P900-1","Chất liệu":"PP","Đặc tính sản phẩm":"Màu Dark Grey","Kích thước sản phẩm (mm)":"W850*D490*H55","Chiều rộng tủ (mm)":"900","Đơn vị":"Cái"},"feats":["Đặc tính sản phẩm","Khay chia thìa nĩa","Chất liệu nhựa cao cấp PP chịu nhiệt","Đạt các têu chuẩn vệ sinh an toàn cho sức khỏe được","kiểm tra chứng nhận bởi FDA","Kích thước sản phẩm đa dạng, dễ lắp đặt, dễ vệ sinh","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"sku":"XTP900","vid":"","mod":"XTP900","brand":"GrandX","slug":"xtp900-khay-chia-thia-nia-da-nang-chat-lieu-nhua-pp-cao-cap-xt-p900-xt-p900-1-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/khay-chia-thia-nia-da-nang-chat-lieu-nhua-pp-cao-cap-xt-p900","_added_at":"2026-10-05T14:40:35.177Z"},{"n":"GIÁ XOONG NỒI TITANIUM XP.90T - Grandx","l":"https://grandx.com.vn/product/gia-xoong-noi-titanium-xp-90t","i":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-7.png","p":"6.100.000đ","pn":6100000,"listPn":0,"salePn":6100000,"priceMode":"both","c":"Giá bát đĩa, Xoong nồi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-7.png"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng xoong nồi với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc tối ưu hóa vật liệu, kết cấu và công năng lưu trữ , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc … đáy phủ lớp chống trượt chống va đập đồ. \nGiá xoong nồi GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ XOONG NỒI TITANIUM XP.90T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng xoong nồi với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc tối ưu hóa vật liệu, kết cấu và công năng lưu trữ , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc … đáy phủ lớp chống trượt chống va đập đồ. \nGiá xoong nồi GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ XOONG NỒI TITANIUM XP.90T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XP.90T","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R864*S470*C226","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"feats":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"sku":"XP.90T","vid":"","mod":"XP.90T","brand":"GrandX","slug":"xp-90t-gia-xoong-noi-titanium-xp-90t-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-xoong-noi-titanium-xp-90t","_added_at":"2026-10-05T11:47:15.505Z"},{"n":"GIÁ BÁT ĐĨA TITANIUM XD.90T - Grandx","l":"https://grandx.com.vn/product/gia-bat-dia-titanium-xd-90t","i":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png","p":"9.300.000đ","pn":9300000,"listPn":0,"salePn":9300000,"priceMode":"both","c":"Giá bát đĩa, Xoong nồi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng bát đĩa, với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc lưu trữ tối ưu hóa vật liệu, kết cấu và công năng , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc …đáy phủ lớp chống trượt chống va đập đồ. \nGiá bát đĩa GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \n","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng bát đĩa, với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc lưu trữ tối ưu hóa vật liệu, kết cấu và công năng , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc …đáy phủ lớp chống trượt chống va đập đồ. \nGiá bát đĩa GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \n","specs":{"Mã sản phẩm":"XD.80T","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R864*S470*C226","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"feats":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"sku":"XD.80T","vid":"","mod":"XD.80T","brand":"GrandX","slug":"xd-80t-gia-bat-dia-titanium-xd-90t-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-bat-dia-titanium-xd-90t","_added_at":"2026-10-19T02:19:15.599Z"},{"n":"GIÁ GIA VỊ 3 TẦNG ĐỘC LẬP TITANIUM XS.40MT - Grandx","l":"https://grandx.com.vn/product/gia-gia-vi-3-tang-doc-lap-titanium-xs-40mt","i":"https://grandx.com.vn/wp-content/uploads/2024/12/XS.40MT-1024x683.jpg","p":"11.130.000đ","pn":11130000,"listPn":0,"salePn":11130000,"priceMode":"both","c":"Giá dao thớt, gia vị","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/XS.40MT-1024x683.jpg"],"sum":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị 3 tầng Grand X với 02 ngăn kéo trên thu gọn trong hộc tủ treo vào tủ độc lập tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng\nnhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nNgăn kéo dưới cùng hỗ trợ lưu trữ được hầu hết các loại gia vị và chai lọ giúp ngăn nắp, gọn gàng cho không gian bếp \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp\ncho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ 3 TẦNG ĐỘC LẬP TITANIUM XS.40MT” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị 3 tầng Grand X với 02 ngăn kéo trên thu gọn trong hộc tủ treo vào tủ độc lập tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng\nnhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nNgăn kéo dưới cùng hỗ trợ lưu trữ được hầu hết các loại gia vị và chai lọ giúp ngăn nắp, gọn gàng cho không gian bếp \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp\ncho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ 3 TẦNG ĐỘC LẬP TITANIUM XS.40MT” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XS.40MT","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R364*S447*C548","Kích thước lọt lòng tủ (mm)":"364","Chiều rộng tủ (mm)":"400"},"feats":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"sku":"XS.40MT","vid":"","mod":"XS.40MT","brand":"GrandX","slug":"xs-40mt-gia-gia-vi-3-tang-doc-lap-titanium-xs-40mt-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-gia-vi-3-tang-doc-lap-titanium-xs-40mt","_added_at":"2026-10-05T14:40:29.986Z"},{"n":"MÂM XOAY 3/4 -270° XC.270.80S1 - Grandx","l":"https://grandx.com.vn/product/mam-xoay-3-4-270-xc-270-80s1","i":"https://grandx.com.vn/wp-content/uploads/2025/03/XC.270.80S.png","p":"3.810.000đ","pn":3810000,"listPn":0,"salePn":3810000,"priceMode":"sale","c":"Kệ góc, mâm xoay liên hoàn","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2025/03/XC.270.80S.png"],"sum":"Đặc tính sản phẩm \nKệ góc mâm xoay góc mở 3/4 -270° \nChất liệu SUS304 nan dẹt\nBề mặt hoàn thiện điện hóa xước mờ \nKhung thép Carbon sơn nhiệt\nHệ chuyển động trục nhẹ nhàng êm ái\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “MÂM XOAY 3/4 -270° XC.270.80S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"Đặc tính sản phẩm \nKệ góc mâm xoay góc mở 3/4 -270° \nChất liệu SUS304 nan dẹt\nBề mặt hoàn thiện điện hóa xước mờ \nKhung thép Carbon sơn nhiệt\nHệ chuyển động trục nhẹ nhàng êm ái\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “MÂM XOAY 3/4 -270° XC.270.80S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Tên sản phẩm":"Mâm xoay 3/4 -270° XC.270.80S1","Kích thước sản phẩm":"R710*S800-900*C(600-800)","Đơn vị":"Bộ","Chiều rộng tủ":"800","Khoảng mở cánh":"≥ 370mm","Chiều sâu tủ":"≥530mm","Chiều cao":"620-800mm","Lưu ý":"Để thuận tện cho việc sử dụng quý khách nên thiết kế khoảng hở chiều rộng cánh ≥ 400mm"},"feats":["Đặc tính sản phẩm","Kệ góc mâm xoay góc mở 3/4 -270°","Chất liệu SUS304 nan dẹt","Bề mặt hoàn thiện điện hóa xước mờ","Khung thép Carbon sơn nhiệt","Hệ chuyển động trục nhẹ nhàng êm ái","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"sku":"XC27080S1","vid":"","mod":"XC27080S1","brand":"GrandX","slug":"xc27080s1-mam-xoay-3-4-270-xc-270-80s1-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/mam-xoay-3-4-270-xc-270-80s1","_added_at":"2026-10-05T14:40:28.077Z"},{"n":"Tủ đồ khô cánh mở GrandX XPR.600S","l":"https://grandx.com.vn/product/tu-do-kho-canh-mo-xpr-600s","i":"https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg","p":"14.850.000đ","pn":14850000,"listPn":0,"salePn":14850000,"priceMode":"both","c":"Tủ đồ khô","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg"],"sum":"Tủ đồ khô cánh mở XPR.600S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.600S \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.600S được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.600S còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.600S nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 564 mm , dành riêng cho các khoang tủ rộng 600mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.600S được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.600S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.600S chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “TỦ ĐỒ KHÔ CÁNH MỞ XPR.600S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"Tủ đồ khô cánh mở XPR.600S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.600S \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.600S được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.600S còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.600S nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 564 mm , dành riêng cho các khoang tủ rộng 600mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.600S được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.600S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.600S chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “TỦ ĐỒ KHÔ CÁNH MỞ XPR.600S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XPR.600S1","Chất liệu":"INOX SUS 304","Kích thước sản phẩm (mm)":"R530*S500*C(1650-1950)","Kích thước lọt lòng tủ (mm)":"≥ 564","Chiều rộng tủ (mm)":"600","Số tầng rổ":"6 tầng","Tải trọng mỗi tầng":"Tối đa 5kg"},"feats":["Khả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.","Bề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.","Khung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp."],"sku":"XPR.600S1","vid":"","mod":"XPR.600S1","brand":"GrandX","slug":"xpr-600s1-tu-do-kho-canh-mo-grandx-xpr-600s","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/tu-do-kho-canh-mo-xpr-600s","_added_at":"2026-10-05T14:40:26.730Z"},{"n":"Kệ chén dĩa bản bắt mặt hộc inox 304 - Phụ kiện tủ bếp Higold 303304","l":"https://phukienbepthanhdat.com/ke-chen-dia-ban-bat-mat-hoc-inox-304-303304-900mm-higold/","i":"https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303301.jpg","p":"4.140.000đ","pn":4140000,"listPn":0,"salePn":4140000,"priceMode":"both","c":"Kệ chén dĩa","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303301.jpg"],"sum":"Kệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 (303304 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303304. Đây là kệ để chén đĩa bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm, kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu.\nKệ Chén Dĩa Bản được sản xuất theo công nghệ hiện đại của Đức, đạt tiêu chuẩn chất lượng Châu Âu. Thiết kế của sản phẩm phù hợp với mọi loại bếp hiện đại.\nĐiểm nổi bật của sản phẩm là các công năng thông minh giúp sắp xếp chén đĩa, đũa muỗng,… ngăn nắp trong hộc tủ. Kệ còn được trang bị hệ thống ray trượt giảm chấn êm ái, đẩy kệ ra vào rất nhẹ nhàng.\nKệ Chén Dĩa Bản giúp bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều kích thước đa dạng.\nKệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng đồ đạc trong tủ bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian lưu trữ và là điểm nhấn cho một không gian bếp hoàn hảo.\n","desc":"Kệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 (303304 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303304. Đây là kệ để chén đĩa bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm, kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu.\nKệ Chén Dĩa Bản được sản xuất theo công nghệ hiện đại của Đức, đạt tiêu chuẩn chất lượng Châu Âu. Thiết kế của sản phẩm phù hợp với mọi loại bếp hiện đại.\nĐiểm nổi bật của sản phẩm là các công năng thông minh giúp sắp xếp chén đĩa, đũa muỗng,… ngăn nắp trong hộc tủ. Kệ còn được trang bị hệ thống ray trượt giảm chấn êm ái, đẩy kệ ra vào rất nhẹ nhàng.\nKệ Chén Dĩa Bản giúp bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều kích thước đa dạng.\nKệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng đồ đạc trong tủ bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian lưu trữ và là điểm nhấn cho một không gian bếp hoàn hảo.\n","specs":{},"feats":["Kệ Chén Dĩa Dạng Bản Inox 304 (303311 – 600mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303201 – 600mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303202 – 700mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303203 – 800mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303204 – 900mm) – Higold"],"sku":"303304","vid":"","mod":"303304","brand":"Higold","slug":"303304-ke-chen-dia-ban-bat-mat-hoc-inox-304-phu-kien-tu-bep-higold-303304","_source":"avatar2-add-product","_source_url":"https://phukienbepthanhdat.com/ke-chen-dia-ban-bat-mat-hoc-inox-304-303304-900mm-higold/","_added_at":"2026-10-05T14:40:24.873Z"},{"n":"Kệ xoong bản bắt mặt hộc inox 304 - Phụ kiện tủ bếp Higold","l":"https://phukienbepthanhdat.com/ke-xoong-ban-bat-mat-hoc-inox-304-303204-900mm-higold/","i":"https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303201.jpg","p":"2.960.000đ","pn":2960000,"listPn":0,"salePn":2960000,"priceMode":"both","c":"Kệ xoong nồi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303201.jpg"],"sum":"Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303204 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303204. Đây là kệ đựng xoong nồi bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm và kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu HIGOLD.\nKệ Xoong Bản được sản xuất theo công nghệ tiên tiến của Đức, đạt tiêu chuẩn chất lượng cao của Châu Âu. Thiết kế của sản phẩm hoàn toàn phù hợp với các loại bếp hiện đại.\nĐiểm nổi bật của Kệ Xoong Bản là các tính năng thông minh giúp sắp xếp gọn gàng các đồ dùng nhà bếp như xoong, nồi, chảo, ấm đun,… ngăn nắp trong hộc tủ. Kệ được trang bị hệ thống ray trượt giảm chấn êm ái, kéo rút nhẹ nhàng.\nKệ Xoong Bản có tác dụng bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều lựa chọn kích thước khác nhau.\nKệ Xoong Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng các vật dụng nhà bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian và là điểm nhấn cho một không gian bếp hoàn hảo.\n","desc":"Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303204 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303204. Đây là kệ đựng xoong nồi bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm và kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu HIGOLD.\nKệ Xoong Bản được sản xuất theo công nghệ tiên tiến của Đức, đạt tiêu chuẩn chất lượng cao của Châu Âu. Thiết kế của sản phẩm hoàn toàn phù hợp với các loại bếp hiện đại.\nĐiểm nổi bật của Kệ Xoong Bản là các tính năng thông minh giúp sắp xếp gọn gàng các đồ dùng nhà bếp như xoong, nồi, chảo, ấm đun,… ngăn nắp trong hộc tủ. Kệ được trang bị hệ thống ray trượt giảm chấn êm ái, kéo rút nhẹ nhàng.\nKệ Xoong Bản có tác dụng bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều lựa chọn kích thước khác nhau.\nKệ Xoong Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng các vật dụng nhà bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian và là điểm nhấn cho một không gian bếp hoàn hảo.\n","specs":{},"feats":["Kệ Xoong Nồi Dạng Bản Inox 304 (303211 – 600mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303311 – 600mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303312 – 700mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303313 – 800mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303314 – 900mm) – Higold"],"sku":"303204","vid":"","mod":"303204","brand":"Higold","slug":"303204-ke-xoong-ban-bat-mat-hoc-inox-304-phu-kien-tu-bep-higold","_source":"avatar2-add-product","_source_url":"https://phukienbepthanhdat.com/ke-xoong-ban-bat-mat-hoc-inox-304-303204-900mm-higold/","_added_at":"2026-10-05T14:40:23.390Z"},{"n":"Khóa cửa cổng sắt chống nước Demax ELG908 AC/GB IP56 APP REMOTE","l":"https://khoadientunhapkhau.com.vn/khoa-cua-cong-sat-chong-nuoc-demax-elg908-ac-gb-ip56-app-remote/","i":"https://b1.congngheviet.com.vn/file/s2-hc08/khoadientunhapkhau-com-vn/wp-content/uploads/2026/04/image_1775631075773.jpg","p":"15.680.000đ","pn":15680000,"listPn":0,"salePn":15680000,"priceMode":"both","c":"Khóa cổng","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://b1.congngheviet.com.vn/file/s2-hc08/khoadientunhapkhau-com-vn/wp-content/uploads/2026/04/image_1775631075773.jpg"],"sum":"Khóa cửa cổng sắt chống nước Demax ELG908 AC/GB IP66 APP REMOTE là dòng khóa thông minh cao cấp chuyên dụng cho cửa cổng, nổi bật với khả năng chống nước – chống bụi vượt trội cùng công nghệ mở khóa đa dạng như nhận diện khuôn mặt 3D, tĩnh mạch lòng bàn tay và điều khiển từ xa. Sản phẩm mang đến giải pháp an ninh hiện đại, tiện nghi cho nhà phố, biệt thự và khu vực ngoài trời.\nĐặc điểm nổi bật \nVật liệu cao cấp \nKhóa được chế tạo từ hợp kim nhôm đúc nguyên khối phay CNC chắc chắn, tăng độ bền và khả năng chịu lực\nBảng điều khiển kính cường lực chống trầy xước, chống ố vàng, đảm bảo tính thẩm mỹ lâu dài\nThân khóa thép không gỉ SUS 304 chống ăn mòn, phù hợp môi trường ngoài trời\nThiết kế chuyên dụng cho cửa cổng \nThiết kế chắc chắn, phù hợp lắp đặt cho cửa sắt, cổng ngoài trời\nKiểu dáng hiện đại, màu đen sang trọng, nâng tầm không gian sống\nTính năng mở khóa đa dạng \nMở khóa bằng nhận diện khuôn mặt FACE ID 3D\nMở khóa bằng tĩnh mạch lòng bàn tay\nMở khóa từ xa qua App Wi-Fi (Tuya)\nMở khóa bằng NFC từ smartphone (tùy chọn)\nMở khóa bằng vân tay\nMở khóa bằng thẻ từ\nMở khóa bằng mật mã\nChìa khóa cơ chống sao chép\nMở khóa bằng remote điều khiển từ xa\nChức năng thông minh và an toàn \nChống nước, chống bụi tiêu chuẩn IP66, hoạt động ổn định ngoài trời\nCảnh báo đột nhập, nhắc nhở pin yếu\nVô hiệu hóa thẻ bị mất giúp tăng cường bảo mật\nChế độ thông phòng linh hoạt\nHỗ trợ tự động khóa (Auto Lock)\nCông nghệ sinh trắc học FPC Thụy Điển cho độ chính xác cao\nDung lượng và vận hành \nLưu trữ tối đa 50 khuôn mặt và 50 tĩnh mạch lòng bàn tay\nLưu trữ 100 vân tay và 200 thẻ từ\nThẻ từ kèm theo 2 chiếc, chìa khóa cơ 2 chiếc, remote 2 chiếc\nMật mã động 10 chữ số tăng cường bảo mật\nĐộng cơ DC siêu nhỏ giúp vận hành êm ái, ổn định\nHoạt động tốt trong môi trường từ -20°C đến 60°C\nĐộ ẩm phù hợp từ 15% đến 90%\nThông số kỹ thuật \nKích thước khóa ngoài: 61 x 197 mm\nKích thước khóa trong: 145 x 105 mm\nNguồn cung cấp: Pin sạc Lithium 7.4V – 3200 mAh\nThời gian sử dụng: 3 – 6 tháng/lần sạc\nNguồn điện khẩn cấp: Cổng USB Type-C\nĐộ dày cửa: 40 – 80 mm\nĐộ rộng đố cửa: > 80 mm\nMàu hoàn thiện: Đen\nXuất xứ: Malaysia\nBảo hành: 3 năm","desc":"Khóa cửa cổng sắt chống nước Demax ELG908 AC/GB IP66 APP REMOTE là dòng khóa thông minh cao cấp chuyên dụng cho cửa cổng, nổi bật với khả năng chống nước – chống bụi vượt trội cùng công nghệ mở khóa đa dạng như nhận diện khuôn mặt 3D, tĩnh mạch lòng bàn tay và điều khiển từ xa. Sản phẩm mang đến giải pháp an ninh hiện đại, tiện nghi cho nhà phố, biệt thự và khu vực ngoài trời.\nĐặc điểm nổi bật \nVật liệu cao cấp \nKhóa được chế tạo từ hợp kim nhôm đúc nguyên khối phay CNC chắc chắn, tăng độ bền và khả năng chịu lực\nBảng điều khiển kính cường lực chống trầy xước, chống ố vàng, đảm bảo tính thẩm mỹ lâu dài\nThân khóa thép không gỉ SUS 304 chống ăn mòn, phù hợp môi trường ngoài trời\nThiết kế chuyên dụng cho cửa cổng \nThiết kế chắc chắn, phù hợp lắp đặt cho cửa sắt, cổng ngoài trời\nKiểu dáng hiện đại, màu đen sang trọng, nâng tầm không gian sống\nTính năng mở khóa đa dạng \nMở khóa bằng nhận diện khuôn mặt FACE ID 3D\nMở khóa bằng tĩnh mạch lòng bàn tay\nMở khóa từ xa qua App Wi-Fi (Tuya)\nMở khóa bằng NFC từ smartphone (tùy chọn)\nMở khóa bằng vân tay\nMở khóa bằng thẻ từ\nMở khóa bằng mật mã\nChìa khóa cơ chống sao chép\nMở khóa bằng remote điều khiển từ xa\nChức năng thông minh và an toàn \nChống nước, chống bụi tiêu chuẩn IP66, hoạt động ổn định ngoài trời\nCảnh báo đột nhập, nhắc nhở pin yếu\nVô hiệu hóa thẻ bị mất giúp tăng cường bảo mật\nChế độ thông phòng linh hoạt\nHỗ trợ tự động khóa (Auto Lock)\nCông nghệ sinh trắc học FPC Thụy Điển cho độ chính xác cao\nDung lượng và vận hành \nLưu trữ tối đa 50 khuôn mặt và 50 tĩnh mạch lòng bàn tay\nLưu trữ 100 vân tay và 200 thẻ từ\nThẻ từ kèm theo 2 chiếc, chìa khóa cơ 2 chiếc, remote 2 chiếc\nMật mã động 10 chữ số tăng cường bảo mật\nĐộng cơ DC siêu nhỏ giúp vận hành êm ái, ổn định\nHoạt động tốt trong môi trường từ -20°C đến 60°C\nĐộ ẩm phù hợp từ 15% đến 90%\nThông số kỹ thuật \nKích thước khóa ngoài: 61 x 197 mm\nKích thước khóa trong: 145 x 105 mm\nNguồn cung cấp: Pin sạc Lithium 7.4V – 3200 mAh\nThời gian sử dụng: 3 – 6 tháng/lần sạc\nNguồn điện khẩn cấp: Cổng USB Type-C\nĐộ dày cửa: 40 – 80 mm\nĐộ rộng đố cửa: > 80 mm\nMàu hoàn thiện: Đen\nXuất xứ: Malaysia\nBảo hành: 3 năm","specs":{"Bảo hành":"3 năm"},"feats":["Malaysia","Chưa có đánh giá nào."],"sku":"ELG908","vid":"","mod":"ELG908","brand":"Demax","slug":"elg908-khoa-cua-cong-sat-chong-nuoc-demax-elg908-ac-gb-ip56-app-remote","_source":"avatar2-add-product","_source_url":"https://khoadientunhapkhau.com.vn/khoa-cua-cong-sat-chong-nuoc-demax-elg908-ac-gb-ip56-app-remote/","_added_at":"2026-10-05T14:40:21.419Z"},{"n":"Khóa cửa nhôm Demax EL909AG CNC FACE ID REMOTE APP WIFI","l":"https://bepviet.vn/khoa-cua-thong-minh/khoa-cua-nhan-dien-khuon-mat/khoa-cua-nhom-demax-el909ag-cnc-face-id-remote-app-wifi?srsltid=AU7gw4V_BonSZXfOuMyEfHgl1qMSpiyxRMj8imAkSkjotFhKgpgDy2Yk","i":"https://bepviet.vn/media/product/10316_909111.png","p":"19.800.000đ","pn":19800000,"listPn":0,"salePn":19800000,"priceMode":"both","c":"Khóa cửa nhôm Demax EL909AG CNC FACE ID REMOTE APP WIFI","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bepviet.vn/media/product/10316_909111.png"],"sum":"Kích thước khóa: 38x420mm Độ dày cửa: 40~80mm Độ rộng đố cửa: >60mm","desc":"Kích thước khóa: 38x420mm Độ dày cửa: 40~80mm Độ rộng đố cửa: >60mm","specs":{"Mã bảo vệ":"[Đổi mã khác]"},"feats":[],"sku":"EL909AG","vid":"","mod":"EL909AG","brand":"Demax","slug":"el909ag-khoa-cua-nhom-demax-el909ag-cnc-face-id-remote-app-wifi","_source":"avatar2-add-product","_source_url":"https://bepviet.vn/khoa-cua-thong-minh/khoa-cua-nhan-dien-khuon-mat/khoa-cua-nhom-demax-el909ag-cnc-face-id-remote-app-wifi?srsltid=AU7gw4V_BonSZXfOuMyEfHgl1qMSpiyxRMj8imAkSkjotFhKgpgDy2Yk","_added_at":"2026-10-05T14:40:19.350Z"},{"n":"Thanh suốt treo quần áo, hợp kim nhôm Garis GW30AR","l":"https://garis.vn/bo-gia-treo-quan-ao-co-dinh-gw30-ar-30-br.html","i":"https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg","p":"939.600đ","pn":939600,"listPn":0,"salePn":939600,"priceMode":"both","c":"Bộ giá treo quần áo cố định","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg"],"sum":"Bộ giá treo quần áo cố định GW30.AR – Kiểu dáng chắc chắn, chất liệu cao cấp, tối ưu không gian lưu trữ. Giải pháp tiện lợi cho tủ quần áo hiện đại.","desc":"Bộ giá treo quần áo cố định GW30.AR – Kiểu dáng chắc chắn, chất liệu cao cấp, tối ưu không gian lưu trữ. Giải pháp tiện lợi cho tủ quần áo hiện đại.","specs":{},"feats":[],"sku":"GW30AR","vid":"","mod":"GW30AR","brand":"Garis","slug":"gw30ar-thanh-suot-treo-quan-ao-hop-kim-nhom-garis-gw30ar","_source":"avatar2-add-product","_source_url":"https://garis.vn/bo-gia-treo-quan-ao-co-dinh-gw30-ar-30-br.html","_added_at":"2026-10-05T14:40:17.412Z"},{"n":"GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2 - Grandx","l":"https://grandx.com.vn/product/gia-bat-dia-nang-ha-nan-oval-sus304-xl-90m2","i":"https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg","p":"11.100.000đ","pn":11100000,"listPn":0,"salePn":11100000,"priceMode":"both","c":"Phụ kiện tủ bếp trên","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg"],"sum":"Đặc tính sản phẩm \nGiá bát đĩa nâng hạ 2 tầng nan Oval SUS304\nBề mặt điện hóa xước mờ \nKhung chính bằng INOX SUS304 màu xám đậm \nĐiều chỉnh trợ lực \nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval nâng bằng INOX SUS 304 \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","desc":"Đặc tính sản phẩm \nGiá bát đĩa nâng hạ 2 tầng nan Oval SUS304\nBề mặt điện hóa xước mờ \nKhung chính bằng INOX SUS304 màu xám đậm \nĐiều chỉnh trợ lực \nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval nâng bằng INOX SUS 304 \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","specs":{"Mã sản phẩm":"XL.90M2","Chất liệu rổ":"SUS304","Chất liệu khung":"INOX 304","Kích thước sản phẩm (mm)":"R864*S280*C550","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"feats":["Đặc tính sản phẩm","Giá bát đĩa nâng hạ 2 tầng nan Oval SUS304","Bề mặt điện hóa xước mờ","Khung chính bằng INOX SUS304 màu xám đậm","Điều chỉnh trợ lực","Điều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế","2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh","Ống tay cầm hình oval nâng bằng INOX SUS 304","THÔNG SỐ SẢN PHẨM","Mở rộng"],"sku":"SUS304","vid":"","mod":"SUS304","brand":"GrandX","slug":"sus304-gia-bat-dia-nang-ha-nan-oval-sus304-xl-90m2-grandx","_source":"avatar2-add-product","_source_url":"https://grandx.com.vn/product/gia-bat-dia-nang-ha-nan-oval-sus304-xl-90m2","_added_at":"2026-10-05T14:43:23.335Z"},{"n":"THÙNG RÁC TRÒN EUROKING KR.14L","l":"https://ahabep.com/thuong-hieu/euroking/thung-dung-rac-nha-bep/thung-rac-tron-euroking-kr-14l.html?srsltid=AU7gw4VuC3t1rc_xADNxaXK3pf6hR4DzjYFGxcSbqzgXP1VTnBG1b-Zl","i":"http://ahabep.com/upload/images/thung-rac-tron-euroking-kr-14l.png","p":"1.100.000đ","pn":1100000,"listPn":0,"salePn":1100000,"priceMode":"both","c":"THÙNG ĐỰNG RÁC NHÀ BẾP","cs":"san-pham-them-moi","ci":"fa-box","imgs":["http://ahabep.com/upload/images/thung-rac-tron-euroking-kr-14l.png"],"sum":"Mã sản phẩm: KR.14L Hãng sản xuất: EUROKING Loại: Thùng rác","desc":"Mã sản phẩm: KR.14L Hãng sản xuất: EUROKING Loại: Thùng rác","specs":{"THÔNG SỐ SẢN PHẨM VÀ KÍCH THƯỚC LẮP ĐẶT Kích thước sản phẩm":"14 lít W370*D330*H400"},"feats":[],"sku":"KR14L","vid":"","mod":"KR14L","brand":"EUROKING","slug":"kr14l-thung-rac-tron-euroking-kr-14l","_source":"avatar2-add-product","_source_url":"https://ahabep.com/thuong-hieu/euroking/thung-dung-rac-nha-bep/thung-rac-tron-euroking-kr-14l.html?srsltid=AU7gw4VuC3t1rc_xADNxaXK3pf6hR4DzjYFGxcSbqzgXP1VTnBG1b-Zl","_added_at":"2026-10-05T12:52:08.804Z"},{"n":"TÚI NIÊM PHONG","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260929_041008_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260929_041008_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Nội thất","cs":"noi-that","ci":"fa-box","sum":"🔒 **TÚI NIÊM PHONG – HÀNG SẴN GIÁ TỐT** 🔥\n\n📦 Túi chắc chắn – niêm phong tiện lợi\n🛡️ Phù hợp đóng gói Kích thước: 0969 213 223 - 0368855161**\n👉 **Inbox ngay để nhận báo giá!**","desc":"🔒 **TÚI NIÊM PHONG – HÀNG SẴN GIÁ TỐT** 🔥\n\n📦 Túi chắc chắn – niêm phong tiện lợi\n🛡️ Phù hợp đóng gói","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"tui-niem-phong","_source":"zalo-products-all-autosync","_added_at":"2026-09-29T04:10:08Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"VERIF88 Produs verif","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_150922_seller_test_88.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_150922_seller_test_88.jpg"],"p":"88.000 đ","pn":88000,"listPn":88000,"salePn":88000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"VERIF88 | verifica fluxul complet spec88","desc":"VERIF88 | verifica fluxul complet","specs":{},"feats":[],"sku":"VERIF88","vid":"","mod":"VERIF88","brand":"","slug":"verif88","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T15:09:22Z","seller_name":"Seller Test","seller_id":"seller-test-88","bot_link":"https://zalo.me/3019064351949097305?uid=seller-test-88","admin_hash":"0b2d8aee76"},{"n":"Hết mùa trung thu","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260928_100021_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260928_100021_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Hết mùa trung thu","desc":"Hết mùa trung thu","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"het-mua-trung-thu","_source":"zalo-products-all-autosync","_added_at":"2026-09-28T10:00:21Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"Sự kết hợp giữa gạo lứt","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260928_055343_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260928_055343_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Sự kết hợp giữa gạo lứt","desc":"Sự kết hợp giữa gạo lứt","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"su-ket-hop-giua-gao-lut","_source":"zalo-products-all-autosync","_added_at":"2026-09-28T05:53:43Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"Em nhận Đơn Bánh Giò Nóng cho Chiều này ạ \nBánh giò Size Lớn với công thức gia truyền nhà em đây.\n💕Bánh mềm mịn núng nính nên người già và con nít rất dễ ăn.\n💕Bánh nhà em cam kết hong có chất phụ gia","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260927_074623_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260927_074623_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Em nhận Đơn Bánh Giò Nóng cho Chiều này ạ \nBánh giò Size Lớn với công thức gia truyền nhà em đây.\n💕Bánh mềm mịn núng nính nên người già và con nít rất dễ ăn.\n💕Bánh nhà em cam kết hong có chất phụ gia và chất bảo quản cho anh chị nè.\n\nGiá Thành đi liền với chất lượng \n✅ combo 5 bánh / 100k\n✅ combo 10 bánh / 180k\n\nBánh đã bao gồm có 2 trứng + thịt mộc nhĩ ăn kèm nước mắm hành phi nhà làm . Ý như ảnh","desc":"Em nhận Đơn Bánh Giò Nóng cho Chiều này ạ \nBánh giò Size Lớn với công thức gia truyền nhà em đây.\n💕Bánh mềm mịn núng nính nên người già và con nít rất dễ ăn.\n💕Bánh nhà em cam kết hong có chất phụ gia và chất bảo quản cho anh chị nè.\n\nGiá Thành đi liền với chất lượng \n✅ combo 5 bánh / 100k\n✅ combo 10 bánh / 180k\n\nBánh đã bao gồm có 2 trứng + thịt mộc nhĩ ăn kèm nước mắm hành phi nhà làm . Ý như ảnh . FREE SHIP MỌI NHÀ","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"em-nhan-don-banh-gio-nong-cho-chieu-nay-a-banh-gio-size-lon-voi-cong-thuc-gia-tr","_source":"zalo-products-all-autosync","_added_at":"2026-09-27T07:46:23Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"A23 TÚI DU LỊCH ĐA NĂNG A23","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260926_171157_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260926_171157_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Bếp nhà bếp","cs":"bep-nha-bep","ci":"fa-box","sum":"🧳 TÚI DU LỊCH ĐA NĂNG A23 – GỌN GÀNG Kích thước: 43 x 23 x 20 cm\n\n✔️giá 1 túi 269k. Giao hàng miễn phí ship toàn quốc. Khi nhận được kiểm tra hàng trước khi thanh toán 0938572628","desc":"🧳 TÚI DU LỊCH ĐA NĂNG A23 – GỌN GÀNG","specs":{},"feats":[],"sku":"A23","vid":"","mod":"A23","brand":"","slug":"a23","_source":"zalo-products-all-autosync","_added_at":"2026-09-26T17:11:57Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"BÀO NGƯ 🦪\n✅ 195k 2 khay= 16 con\n🧨Dễ dàng chế biến các món : Xào","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260926_001933_d0898d9c44dcad82f4cd.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260926_001933_d0898d9c44dcad82f4cd.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Bếp nhà bếp","cs":"bep-nha-bep","ci":"fa-box","sum":"🦪BÀO NGƯ 🦪\n✅ 195k 2 khay= 16 con\n🧨Dễ dàng chế biến các món : Xào","desc":"🦪BÀO NGƯ 🦪\n✅ 195k 2 khay= 16 con\n🧨Dễ dàng chế biến các món : Xào","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"bao-ngu--195k-2-khay-16-conde-dang-che-bien-cac-mon--xao","_source":"zalo-products-all-autosync","_added_at":"2026-09-26T00:19:33Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"E gom cá Linh Non trả đơn ngày mai\n\n💰 Cá linh non #90k/ 1kg\n\ncá sống được làm sạch ruột và dập đá gửi lên chứ không phải hàng đông lạnh nhé\n\nhàng em bán cam kết chuẩn 100% cá linh chứ không phải hàng","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_232001_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_232001_b6e5ebf022b0cbee92a1.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"E gom cá Linh Non trả đơn ngày mai\n\n💰 Cá linh non #90k/ 1kg\n\ncá sống được làm sạch ruột và dập đá gửi lên chứ không phải hàng đông lạnh nhé\n\nhàng em bán cam kết chuẩn 100% cá linh chứ không phải hàng pha tạp cá trôi","desc":"E gom cá Linh Non trả đơn ngày mai\n\n💰 Cá linh non #90k/ 1kg\n\ncá sống được làm sạch ruột và dập đá gửi lên chứ không phải hàng đông lạnh nhé\n\nhàng em bán cam kết chuẩn 100% cá linh chứ không phải hàng pha tạp cá trôi","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"e-gom-ca-linh-non-tra-don-ngay-mai-ca-linh-non-90k-1kgca-song-duoc-lam-sach-ruot","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T23:20:01Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"TÚI NIÊM PHONG CHỐNG SỐC\n✔️ Đa dạng kích thước.\n✔️ Chống sốc hiệu quả","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_131324_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_131324_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"📦 TÚI NIÊM PHONG CHỐNG SỐC\n✔️ Đa dạng kích thước.\n✔️ Chống sốc hiệu quả Kích thước: 0974 084 193\n📍 Kho : Hà Đông – Hà Nội\n📍Xưởng sản xuất : Bình Nguyên – Phú Thọ","desc":"📦 TÚI NIÊM PHONG CHỐNG SỐC\n✔️ Đa dạng kích thước.\n✔️ Chống sốc hiệu quả","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"tui-niem-phong-chong-soc-da-dang-kich-thuoc-chong-soc-hieu-qua","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T13:13:26Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"Keo Tytan siêu trong** là lựa chọn đáng tham khảo cho những hạng mục cần đường nối tinh tế","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_112011_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_112011_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Bếp nhà bếp","cs":"bep-nha-bep","ci":"fa-box","sum":"💎 **Keo Tytan siêu trong** là lựa chọn đáng tham khảo cho những hạng mục cần đường nối tinh tế","desc":"💎 **Keo Tytan siêu trong** là lựa chọn đáng tham khảo cho những hạng mục cần đường nối tinh tế","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"keo-tytan-sieu-trong-la-lua-chon-dang-tham-khao-cho-nhung-hang-muc-can-duong-noi","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T11:20:13Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"Lạp xưởng tôm Sóc Trăng","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_101617_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_101617_b6e5ebf022b0cbee92a1.jpg"],"p":"155.000 đ","pn":155000,"listPn":155000,"salePn":155000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"#155k/1kg 2 bịch #80k/1 bịch 500gr Được làm từ tôm, 10% mỡ heo với tỉ lệ nạc nhiều ,ít mỡ, giúp Lạp Xưởng giữ được vị ngọt, kết hợp với một ít mỡ để cho miếng lạp xưởng không quá dai, phù hợp mọi người ==> Dùng tôm nguyên chất, cắn vô cảm nhận mùi tôm tươi ngon giữ nguyên vị ngọt tự nhiên đậm đà, ăn lạ miệng ít ngán, thơm thơm rất tuyệt..Nhà làm bảo đảm an toàn,chất lượng.. / Không chất bảo quản v","desc":"#155k/1kg 2 bịch #80k/1 bịch 500gr Được làm từ tôm, 10% mỡ heo với tỉ lệ nạc nhiều ,ít mỡ, giúp Lạp Xưởng giữ được vị ngọt, kết hợp với một ít mỡ để cho miếng lạp xưởng không quá dai, phù hợp mọi người ==> Dùng tôm nguyên chất, cắn vô cảm nhận mùi tôm tươi ngon giữ nguyên vị ngọt tự nhiên đậm đà, ăn lạ miệng ít ngán, thơm thơm rất tuyệt..Nhà làm bảo đảm an toàn,chất lượng.. / Không chất bảo quản vì làm thủ công tại nhà..","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"lap-xuong-tom-soc-trang","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T10:16:17Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"CHUYÊN SẢN XUẤT BĂNG DÍNH 80Y","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_013125_28177376b924507a0935.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260925_013125_28177376b924507a0935.jpg"],"p":"","pn":0,"listPn":0,"salePn":0,"priceMode":"list","c":"Bếp nhà bếp","cs":"bep-nha-bep","ci":"fa-box","sum":"📦 CHUYÊN SẢN XUẤT BĂNG DÍNH 80Y – 100Y\n✅ Đa dạng màu sắc Màu sắc: 0974. 084. 193","desc":"📦 CHUYÊN SẢN XUẤT BĂNG DÍNH 80Y – 100Y\n✅ Đa dạng màu sắc","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"chuyen-san-xuat-bang-dinh-80y","_source":"zalo-products-all-autosync","_added_at":"2026-09-25T01:31:29Z","seller_name":"V Ai Studio","seller_id":"28177376b924507a0935","bot_link":"https://zalo.me/3019064351949097305?uid=28177376b924507a0935","admin_hash":"d8859ecff7"},{"n":"Thùng 6 chai nước mắm nhỉ cá cơm ruột đỏ Làng Chài Xưa chai thủy tinh 500ml \n+ Là nguyên liệu chế biến món ăn.\n\n+ Là gia vị không thể thiếu trong bữa ăn gia đình Việt\n\n+ Đặc sản Phan Thiết (Việt Nam)","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_090252_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_090252_b6e5ebf022b0cbee92a1.jpg"],"p":"295.000 đ","pn":295000,"listPn":295000,"salePn":295000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"+ Là nguyên liệu chế biến món ăn. + Là gia vị không thể thiếu trong bữa ăn gia đình Việt + Đặc sản Phan Thiết (Việt Nam)","desc":"+ Là nguyên liệu chế biến món ăn. + Là gia vị không thể thiếu trong bữa ăn gia đình Việt + Đặc sản Phan Thiết (Việt Nam)","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"thung-6-chai-nuoc-mam-nhi-ca-com-ruot-do-lang-chai-xua-chai-thuy-tinh-500ml--la-","_source":"zalo-products-all-autosync","_added_at":"2026-09-13T09:02:52Z","seller_name":"Nhà Bếp Vuông","seller_id":"b6e5ebf022b0cbee92a1","bot_link":"https://zalo.me/3019064351949097305?uid=b6e5ebf022b0cbee92a1","admin_hash":"dade40b47d"},{"n":"COMBO10 DỪA XIÊM","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_051330_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_051330_b6e5ebf022b0cbee92a1.jpg"],"p":"250.000 đ","pn":250000,"listPn":250000,"salePn":250000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"💫 Đuợc tuyển chọn kỹ từng trái, đảm bảo đạt tiêu chuẩn xuất khẩu . Nước ngọt thanh – cơm dừa thì mềm – uống mát cực đã . Cơm béo ngọt nhẹ 😋 🌱 Hàng nhà em, an tâm dùng mỗi ngày ❤️ 💥 COMBO 10 TRÁI : chỉ 🟰 250k 💫 Giá quá mềm với hàng tiêu chuẩn 💫 lấy bao về uống cả nhà cực hợp ạ! 🥥🔥 ❤️ Hàng sẵn kho . Anh chị nào cần nhắn e ship liền ngen 🥰 📞0️⃣9️⃣3️⃣1️⃣4️⃣1️⃣3️⃣2️⃣3️⃣2️⃣","desc":"💫 Đuợc tuyển chọn kỹ từng trái, đảm bảo đạt tiêu chuẩn xuất khẩu . Nước ngọt thanh – cơm dừa thì mềm – uống mát cực đã . Cơm béo ngọt nhẹ 😋 🌱 Hàng nhà em, an tâm dùng mỗi ngày ❤️ 💥 COMBO 10 TRÁI : chỉ 🟰 250k 💫 Giá quá mềm với hàng tiêu chuẩn 💫 lấy bao về uống cả nhà cực hợp ạ! 🥥🔥 ❤️ Hàng sẵn kho . Anh chị nào cần nhắn e ship liền ngen 🥰 📞0️⃣9️⃣3️⃣1️⃣4️⃣1️⃣3️⃣2️⃣3️⃣2️⃣","specs":{},"feats":[],"sku":"COMBO10","vid":"","mod":"COMBO10","brand":"","slug":"combo10","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T05:13:30Z","seller_name":"Nhà Bếp Vuông","seller_id":"b6e5ebf022b0cbee92a1","bot_link":"https://zalo.me/3019064351949097305?uid=b6e5ebf022b0cbee92a1","admin_hash":"dade40b47d"},{"n":"BÁNH GIÒ QUE MINI TRUYỀN THỐNG","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_065506_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_065506_b6e5ebf022b0cbee92a1.jpg"],"p":"130.000 đ","pn":130000,"listPn":130000,"salePn":130000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"130k / 10 bánh to. Nhân thịt, mộc nhĩ, hành khô đậm đà. Bánh mềm, chấm nước mắm.","desc":"130k / 10 bánh to. Nhân thịt, mộc nhĩ, hành khô đậm đà. Bánh mềm, chấm nước mắm.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"banh-gio-que-mini-truyen-thong","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:10Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"BD-1054HVOW Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260914_030828_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260914_030828_b6e5ebf022b0cbee92a1.jpg"],"p":"7.170.000 đ","pn":7170000,"listPn":7170000,"salePn":7170000,"priceMode":"sale","c":"Điện máy","cs":"dien-may","ci":"fa-box","sum":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW - giá tốt, mua trả chậm","desc":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW - giá tốt, mua trả chậm","specs":{},"feats":[],"sku":"BD-1054HVOW","vid":"","mod":"BD-1054HVOW","brand":"","slug":"bd-1054hvow","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:09Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"Thùng 6 chai nước mắm nhỉ cá cơm ruột đỏ Làng Chài Xưa","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_090252_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_090252_b6e5ebf022b0cbee92a1.jpg"],"p":"295.000 đ","pn":295000,"listPn":295000,"salePn":295000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Nguyên liệu chế biến món ăn. Gia vị không thể thiếu trong bữa ăn gia đình.","desc":"Nguyên liệu chế biến món ăn. Gia vị không thể thiếu trong bữa ăn gia đình.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"thung-6-chai-nuoc-mam-nhi-ca-com-ruot-do-lang-chai-xua","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:08Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"SIRO ATISO ĐỎ","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_100923_d0898d9c44dcad82f4cd.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260913_100923_d0898d9c44dcad82f4cd.jpg"],"p":"129.000 đ","pn":129000,"listPn":129000,"salePn":129000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Mỗi hũ 1kg đậm vị. Công dụng: Thanh lọc, giải độc, hỗ trợ điều trị da liễu, hỗ trợ tiêu hóa.","desc":"Mỗi hũ 1kg đậm vị. Công dụng: Thanh lọc, giải độc, hỗ trợ điều trị da liễu, hỗ trợ tiêu hóa.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"siro-atiso-do","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:07Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"TÚI TOTE DREAM ZONE ĐEO VAI, ĐEO CHÉO","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_090821_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_090821_b6e5ebf022b0cbee92a1.jpg"],"p":"170.000 đ","pn":170000,"listPn":170000,"salePn":170000,"priceMode":"sale","c":"Balo túi xách","cs":"balo-tui-xach","ci":"fa-box","sum":"Mẫu túi tote thiết kế hiện đại với họa tiết dễ thương, kèm móc treo xinh xắn. Kích thước: 42 x 36 x 11 cm","desc":"Mẫu túi tote thiết kế hiện đại với họa tiết dễ thương, kèm móc treo xinh xắn.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"tui-tote-dream-zone-deo-vai-deo-cheo","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:06Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"Combo 300 cái Khẩu Trang 5D Duy Khánh Kháng Khuẩn","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_055841_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_055841_b6e5ebf022b0cbee92a1.jpg"],"p":"159.000 đ","pn":159000,"listPn":159000,"salePn":159000,"priceMode":"sale","c":"Y tế - Khẩu trang","cs":"y-te---khau-trang","ci":"fa-box","sum":"Thương hiệu: Duy Khánh Kiểu dáng: 5D. Giá 159k 1 combo. Giao hàng miễn phí ship toàn quốc. Màu sắc: Đen, Trắng, Kem, Xanh, Hồng, Xám, Mix đủ màu ngẫu nhiên","desc":"Thương hiệu: Duy Khánh Kiểu dáng: 5D. Giá 159k 1 combo. Giao hàng miễn phí ship toàn quốc.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"combo-300-cai-khau-trang-5d-duy-khanh-khang-khuan","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:05Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"NƯỚC DỪA XIÊM TƯƠI","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_052916_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_052916_b6e5ebf022b0cbee92a1.jpg"],"p":"150.000 đ","pn":150000,"listPn":150000,"salePn":150000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Nước dừa xiêm tươi nguyên chất vị ngọt thanh 500ml/chai","desc":"Nước dừa xiêm tươi nguyên chất vị ngọt thanh","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"nuoc-dua-xiem-tuoi","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:04Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"DỪA XIÊM","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_051330_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_051330_b6e5ebf022b0cbee92a1.jpg"],"p":"250.000 đ","pn":250000,"listPn":250000,"salePn":250000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Đuợc tuyển chọn kỹ từng trái, đảm bảo đạt tiêu chuẩn xuất khẩu. Nước ngọt thanh – cơm dừa thì mềm – uống mát cực đã.","desc":"Đuợc tuyển chọn kỹ từng trái, đảm bảo đạt tiêu chuẩn xuất khẩu. Nước ngọt thanh – cơm dừa thì mềm – uống mát cực đã.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"dua-xiem","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:03Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"Trà gạo lứt đậu đen lá dứa hoa nhài Bamboo","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_042530_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_042530_b6e5ebf022b0cbee92a1.jpg"],"p":"189.000 đ","pn":189000,"listPn":189000,"salePn":189000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Công dụng sản phẩm: Giảm cân hiệu quả. Giúp ngăn ngừa bệnh sỏi thận. Giúp xương và răng chắc khoẻ. Lấy một lượng nhỏ cho vào 1 lít nước đun sôi để từ 10-15p.","desc":"Công dụng sản phẩm: Giảm cân hiệu quả. Giúp ngăn ngừa bệnh sỏi thận. Giúp xương và răng chắc khoẻ.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"tra-gao-lut-dau-den-la-dua-hoa-nhai-bamboo","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:02Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"HẠT ĐÁC RIM THƠM","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_035206_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_035206_b6e5ebf022b0cbee92a1.jpg"],"p":"120.000 đ","pn":120000,"listPn":120000,"salePn":120000,"priceMode":"sale","c":"Thực phẩm - Nước uống","cs":"thuc-pham---nuoc-uong","ci":"fa-box","sum":"Rim cùng thơm chín và đường phèn, vị ngọt thanh, thơm dịu. Dùng trực tiếp hoặc ăn cùng sữa chua, chè, trái cây. Khối lượng: 1kg/hộp.","desc":"Rim cùng thơm chín và đường phèn, vị ngọt thanh, thơm dịu. Dùng trực tiếp hoặc ăn cùng sữa chua, chè, trái cây.","specs":{},"feats":[],"sku":"","vid":"","mod":"","brand":"","slug":"hat-dac-rim-thom","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:01Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"A8060-2 BALO DU LỊCH A8060-2","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_010929_b6e5ebf022b0cbee92a1.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260912_010929_b6e5ebf022b0cbee92a1.jpg"],"p":"275.000 đ","pn":275000,"listPn":275000,"salePn":275000,"priceMode":"sale","c":"Balo túi xách","cs":"balo-tui-xach","ci":"fa-box","sum":"Thiết kế tối giản, năng động với nhiều màu phối điểm nhấn nổi bật, phù hợp cho học tập, công việc và du lịch. Kích thước: 61 x 38 x 20cm","desc":"Thiết kế tối giản, năng động với nhiều màu phối điểm nhấn nổi bật, phù hợp cho học tập, công việc và du lịch.","specs":{},"feats":[],"sku":"A8060-2","vid":"","mod":"A8060-2","brand":"","slug":"a8060-2","_source":"zalo-products-all-autosync","_added_at":"2026-09-12T00:00:00Z","seller_name":"Nhà Bếp Vuông","seller_id":"d0898d9c44dcad82f4cd","bot_link":"https://zalo.me/3019064351949097305?uid=d0898d9c44dcad82f4cd","admin_hash":"d04fd2d45b"},{"n":"EPO8390VX EPO8390VX | Eurogold | Giá bát cố định inox 304 Oval EPV8090 (EPO8390VX)","l":"","i":"https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260821_154302_import_a5084af3.jpg","imgs":["https://huggingface.co/datasets/bep40/zalo-products-all/resolve/main/images/20260821_154302_import_a5084af3.jpg"],"p":"3.600.000 đ","pn":3600000,"listPn":3600000,"salePn":3600000,"priceMode":"sale","c":"Bếp nhà bếp","cs":"bep-nha-bep","ci":"fa-box","sum":"4 EPO8390VX Kích thước sản phẩm: W864 x D261 x H(62-194) mm; Khoang tủ: 900 mm; Chất liệu: Inox Oval 304; Dòng sản phẩm: Giá Bát Cố Định Oval; Chiều rộng tủ: 800mm; Giá catalogue: 3.600.000 VNĐ 1 1,620,000đ 1,620,000đ BẢO HÀNH 2 NĂM Kích thước: W864 x D261 x H(62-194) mm\nChất liệu: Inox Oval 304\nDòng sản phẩm: Giá Bát Cố Định Oval\nChiều rộng tủ: 800mm; Giá catalogue: 3.600.000 VNĐ 1 1,620,000đ 1,6","desc":"4 EPO8390VX Kích thước sản phẩm: W864 x D261 x H(62-194) mm; Khoang tủ: 900 mm; Chất liệu: Inox Oval 304; Dòng sản phẩm: Giá Bát Cố Định Oval; Chiều rộng tủ: 800mm; Giá catalogue: 3.600.000 VNĐ 1 1,620,000đ 1,620,000đ BẢO HÀNH 2 NĂM","specs":{},"feats":[],"sku":"EPO8390VX","vid":"","mod":"EPO8390VX","brand":"","slug":"epo8390vx","_source":"zalo-products-all-autosync","_added_at":"2026-08-21T15:43:02Z","seller_name":"","seller_id":"","bot_link":"https://zalo.me/3019064351949097305","admin_hash":""},{"n":"Máy Giặt LG Inverter 9 Kg FB1209S5W","l":"https://dienmaycholon.com/may-giat/may-giat-lg-inverter-9-kg-fb1209s5w?gad_source=1&gad_campaignid=24102390866&gbraid=0AAAABEZumqgYFI10M0KNJMeoBC8OJnKx7&gclid=Cj0KCQjw2OnUBhC2ARIsACKyfaHzwSvdg9wiUOMvvFPjOqq99rka9j_Yx1AX_cDm53gl2fUwjw_-Ca4aAkX2EALw_wcBmay-giat-hitachi-inverter-105-kg-bd-1054hvow?utm_flashsale=1","i":"https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture/Apro/Apro_product_36348/may-giat-lg-inverter-9-kg-fb1209s5w-main-36348.png","p":"Giá niêm yết: 9.790.000đ — Giá KM: 6.390.000đ","pn":6390000,"listPn":9790000,"salePn":6390000,"priceMode":"both","c":"Máy giặt / sấy","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture/Apro/Apro_product_36348/may-giat-lg-inverter-9-kg-fb1209s5w-main-36348.png","https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture//Apro/Apro_product_36348/may-giat-lg-inverter-9-kg-fb1209s5w-main-36348.png"],"sum":"Tư vấn trực tuyến Xem sản phẩm ngay không cần đến trực tiếp siêu thị","desc":"Tư vấn trực tuyến Xem sản phẩm ngay không cần đến trực tiếp siêu thị","specs":{},"feats":["Lồng Giặt","Thép không gỉ","Chương trình giặt","- Vải bông","- Vải bông +","- Đồ hỗn hợp","- Giặt nhanh 30 phút","- Giặt ngừa dị ứng","- Đồ thể thao","- Giặt tay/Đồ len","- Giặt đồ tinh xảo","- Làm sạch lồng giặt","- Giũ + vắt","Bảng điều khiển","Cảm ứng","Ngôn Ngữ","Song ngữ Anh - Việt","Nắp máy","Kính cường lực","Hộc nước giặt"],"sku":"FB1209S5W","vid":"","mod":"FB1209S5W","brand":"LG","slug":"fb1209s5w-may-giat-lg-inverter-9-kg-fb1209s5w","_source":"vai-market-add-product","_source_url":"https://dienmaycholon.com/may-giat/may-giat-lg-inverter-9-kg-fb1209s5w?gad_source=1&gad_campaignid=24102390866&gbraid=0AAAABEZumqgYFI10M0KNJMeoBC8OJnKx7&gclid=Cj0KCQjw2OnUBhC2ARIsACKyfaHzwSvdg9wiUOMvvFPjOqq99rka9j_Yx1AX_cDm53gl2fUwjw_-Ca4aAkX2EALw_wcBmay-giat-hitachi-inverter-105-kg-bd-1054hvow?utm_flashsale=1","_added_at":"2026-09-06T04:59:42.293Z"},{"n":"Tủ Lạnh Funiki 147 Lít HR T6147TDG","l":"https://dienmaycholon.com/tu-lanh/tu-lanh-funiki-147-lit-hr-t6147tdg?gad_source=1&gad_campaignid=24102390866&gbraid=0AAAABEZumqgYFI10M0KNJMeoBC8OJnKx7&gclid=Cj0KCQjw2OnUBhC2ARIsACKyfaEF8CxOc_KCu8J_BI_1QFVEQsHP6DAPtHvG2Aea-UbbVKbI56URTUwaAoqaEALw_wcB","i":"https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture/Apro/Apro_product_33684/tu-lanh-funiki-147-lit-hr-t6147tdg-main-33684.png","p":"Giá niêm yết: 4.800.000đ — Giá KM: 3.490.000đ","pn":3490000,"listPn":4800000,"salePn":3490000,"priceMode":"both","c":"Tủ lạnh","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture/Apro/Apro_product_33684/tu-lanh-funiki-147-lit-hr-t6147tdg-main-33684.png","https://cdn11.dienmaycholon.vn/filewebdmclnew/DMCL21/Picture//Apro/Apro_product_33684/tu-lanh-funiki-147-lit-hr-t6147tdg-main-33684.png"],"sum":"Tư vấn trực tuyến Xem sản phẩm ngay không cần đến trực tiếp siêu thị","desc":"Tư vấn trực tuyến Xem sản phẩm ngay không cần đến trực tiếp siêu thị","specs":{},"feats":["Công nghệ làm lạnh","Gián tiếp","Công nghệ kháng khuẩn, khử mùi","Silver Nano","Tính năng khác","- Hộp đựng rau quả","- Hộp để bơ trên cánh"],"sku":"T6147TDG","vid":"","mod":"T6147TDG","brand":"Funiki","slug":"t6147tdg-tu-lanh-funiki-147-lit-hr-t6147tdg","_source":"vai-market-add-product","_source_url":"https://dienmaycholon.com/tu-lanh/tu-lanh-funiki-147-lit-hr-t6147tdg?gad_source=1&gad_campaignid=24102390866&gbraid=0AAAABEZumqgYFI10M0KNJMeoBC8OJnKx7&gclid=Cj0KCQjw2OnUBhC2ARIsACKyfaEF8CxOc_KCu8J_BI_1QFVEQsHP6DAPtHvG2Aea-UbbVKbI56URTUwaAoqaEALw_wcB","_added_at":"2026-09-06T04:59:39.977Z"},{"n":"Lò vi sóng Toshiba MWP-MM20P(BK) 20 lít","l":"https://www.dienmayxanh.com/lo-vi-song/toshiba-mwp-mm20p-bk-20-lit?srsltid=AfmBOooNJBKp4lqr0DREH7VkAxokY77mK_6rqLQjJ9dbIK0VarsEA30s","i":"https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit---1--1020x570.jpg","p":"Giá niêm yết: 1.990.000đ — Giá KM: 1.690.000đ","pn":1690000,"listPn":1990000,"salePn":1690000,"priceMode":"both","c":"Lò vi sóng","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit---1--1020x570.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit--(2).jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/toshiba-mwp-mm20p-bk-20-lit-chat-lieu-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit--(4).jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-2.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-3.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-4.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-5.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-6.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-7.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-8.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-10.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-9.jpg"],"sum":"Lò vi sóng\nToshiba MWP-MM20P(BK) 20 lít công suất 700W mạnh mẽ, trang bị chuông báo sau khi nấu xong, tiện lợi với chức năng rã đông, hâm nóng,...\nCông suất - Dung tích - Chức năng chính\n- Mẫu\nlò vi sóng Toshiba\nnày có công suất 700W hoạt động ổn định.\n-\nDung tích 20 lít\ncó thể bỏ vừa gà nguyên con khoảng 1 kg.\n- Chức năng chính: rã đông, hâm nóng.\nThiết kế của sản phẩm\n- Khoang lò làm bằng thép phủ sơn chống dính, an toàn cho sức khoẻ và dễ lau chùi.\n- Bảng điều khiển bằng nút vặn dễ tuỳ chỉnh mức công suất, nhiệt độ, dễ dàng sử dụng với ngôn ngữ tiếng Việt - Anh.\nTiện ích - Phụ kiện\n- Hẹn giờ tối đa 35 phút, có thể chủ động thời gian hâm nóng hoặc rã đông, giúp thức ăn không bị cháy khét hay khô.\n- Lò có trang bị\nchuông báo sau khi nấu xong\n, không lo để quên thức ăn trong lò.\n- Khoang lò có đèn giúp chiếu sáng bên trong lò vi sóng.\n- Đi kèm phụ kiện: đĩa xoay và vòng xoay.\nLưu ý sử dụng\n- Không dùng chung ổ điện với các thiết bị khác.\n- Để thêm một cốc nước khi hâm nóng thức ăn khô.\n- Không sử dụng đồ đựng thức ăn bằng kim loại trong lò vi sóng.\nXem thêm:\n13 thứ tuyệt đối không được cho vào lò vi sóng\n.\n- Rút điện trước khi vệ sinh khoang lò, không dùng các chất tẩy rửa mạnh để vệ sinh.\n- Không sử dụng lò vi sóng có cửa bị hỏng hoặc đóng không khít.\nLò vi sóng Toshiba MWP-MM20P(BK) 20 lít\nvới công suất 700W, đáp ứng đủ các nhu cầu làm nóng thức ăn của gia đình, lò còn có chức năng rã đông thuận tiện. Lò có thể tuỳ chỉnh nhiệt độ bằng nút vặn đơn giản, khoang lò bằng thép phủ sơn chống dính bền bỉ,... Nhìn chung, đây là một thiết bị gia dụng không thể thiếu trong gian bếp của mỗi gia đình.\nXem thêm","desc":"Lò vi sóng\nToshiba MWP-MM20P(BK) 20 lít công suất 700W mạnh mẽ, trang bị chuông báo sau khi nấu xong, tiện lợi với chức năng rã đông, hâm nóng,...\nCông suất - Dung tích - Chức năng chính\n- Mẫu\nlò vi sóng Toshiba\nnày có công suất 700W hoạt động ổn định.\n-\nDung tích 20 lít\ncó thể bỏ vừa gà nguyên con khoảng 1 kg.\n- Chức năng chính: rã đông, hâm nóng.\nThiết kế của sản phẩm\n- Khoang lò làm bằng thép phủ sơn chống dính, an toàn cho sức khoẻ và dễ lau chùi.\n- Bảng điều khiển bằng nút vặn dễ tuỳ chỉnh mức công suất, nhiệt độ, dễ dàng sử dụng với ngôn ngữ tiếng Việt - Anh.\nTiện ích - Phụ kiện\n- Hẹn giờ tối đa 35 phút, có thể chủ động thời gian hâm nóng hoặc rã đông, giúp thức ăn không bị cháy khét hay khô.\n- Lò có trang bị\nchuông báo sau khi nấu xong\n, không lo để quên thức ăn trong lò.\n- Khoang lò có đèn giúp chiếu sáng bên trong lò vi sóng.\n- Đi kèm phụ kiện: đĩa xoay và vòng xoay.\nLưu ý sử dụng\n- Không dùng chung ổ điện với các thiết bị khác.\n- Để thêm một cốc nước khi hâm nóng thức ăn khô.\n- Không sử dụng đồ đựng thức ăn bằng kim loại trong lò vi sóng.\nXem thêm:\n13 thứ tuyệt đối không được cho vào lò vi sóng\n.\n- Rút điện trước khi vệ sinh khoang lò, không dùng các chất tẩy rửa mạnh để vệ sinh.\n- Không sử dụng lò vi sóng có cửa bị hỏng hoặc đóng không khít.\nLò vi sóng Toshiba MWP-MM20P(BK) 20 lít\nvới công suất 700W, đáp ứng đủ các nhu cầu làm nóng thức ăn của gia đình, lò còn có chức năng rã đông thuận tiện. Lò có thể tuỳ chỉnh nhiệt độ bằng nút vặn đơn giản, khoang lò bằng thép phủ sơn chống dính bền bỉ,... Nhìn chung, đây là một thiết bị gia dụng không thể thiếu trong gian bếp của mỗi gia đình.\nXem thêm","specs":{"Loại lò":"Lò vi sóng không nướng","Dung tích":"20 lít","Công suất vi sóng":"700W","Chất liệu khoang lò":"Thép phủ sơn chống dính","Thương hiệu của":"Nhật Bản","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2022","Chức năng chính":"Rã đông, hâm","Ngôn ngữ":"Tiếng Việt Tiếng Anh","Bảng điều khiển":"Nút vặn","Tiện ích":"Chuông báo khi nấu xong Hẹn giờ lên tới 35 phút Khoang lò có đèn","Kích thước - Khối lượng":"Ngang 43.4 cm - Cao 25.8 cm - Sâu 35 cm - Nặng 11 kg","Kích thước khoang lò":"Ngang 27.5 cm - Cao 17.4 cm - Sâu 29.5 cm","Hãng":"Toshiba. Xem thông tin hãng"},"feats":["Lò vi sóng Toshiba MWP-MM20P(BK) 20 lít công suất 700W mạnh mẽ, trang bị chuông báo sau khi nấu xong, tiện lợi với chức năng rã đông, hâm nóng,...","- Mẫu lò vi sóng Toshiba này có công suất 700W hoạt động ổn định.","- Dung tích 20 lít có thể bỏ vừa gà nguyên con khoảng 1 kg.","- Chức năng chính: rã đông, hâm nóng.","- Khoang lò làm bằng thép phủ sơn chống dính, an toàn cho sức khoẻ và dễ lau chùi.","- Bảng điều khiển bằng nút vặn dễ tuỳ chỉnh mức công suất, nhiệt độ, dễ dàng sử dụng với ngôn ngữ tiếng Việt - Anh.","- Hẹn giờ tối đa 35 phút, có thể chủ động thời gian hâm nóng hoặc rã đông, giúp thức ăn không bị cháy khét hay khô.","- Lò có trang bị chuông báo sau khi nấu xong , không lo để quên thức ăn trong lò.","- Khoang lò có đèn giúp chiếu sáng bên trong lò vi sóng.","- Đi kèm phụ kiện: đĩa xoay và vòng xoay.","- Không dùng chung ổ điện với các thiết bị khác.","- Để thêm một cốc nước khi hâm nóng thức ăn khô."],"sku":"283212","vid":"","mod":"283212","brand":"vi sóng Toshiba","slug":"283212-lo-vi-song-toshiba-mwp-mm20p-bk-20-lit","_source":"avatar2-add-product","_source_url":"https://www.dienmayxanh.com/lo-vi-song/toshiba-mwp-mm20p-bk-20-lit?srsltid=AfmBOooNJBKp4lqr0DREH7VkAxokY77mK_6rqLQjJ9dbIK0VarsEA30s","_added_at":"2026-10-05T14:43:08.864Z"},{"n":"Máy lạnh Casper Inverter 1 HP QC-09IU36A","l":"https://www.dienmayxanh.com/may-lanh/casper-inverter-1-hp-qc-09iu36a?srsltid=AfmBOoqQ9ZboJ-kIowTFz_lseNn8NKmYw_vPGyDBAaKcBREuz5uJck23","i":"https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/334018-1920x1080.jpg","p":"Giá niêm yết: 8.990.000đ — Giá KM: 7.590.000đ","pn":7590000,"listPn":8990000,"salePn":7590000,"priceMode":"both","c":"Hàng Casper","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/334018-1920x1080.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/1-1020x570-1.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/2-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/slider-1060x570-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/4-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/5-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/6-1020x570.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-1-638731575388494403.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-2-638731575401986689.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-3-638731575409037186.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-4-638731575419946302.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-5-638731575428692989.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-6-638731575439056769.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-7-638733153596915551.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-8-638731575460525267.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-9-638731575469259491.jpg"],"sum":"Máy lạnh Casper Inverter 1 HP QC-09IU36A\nlà lựa chọn lý tưởng cho các không gian dưới 15m² như phòng ngủ, phòng làm việc cá nhân hoặc cửa hàng nhỏ. Với công suất 9.500 BTU, sản phẩm tích hợp công nghệ Inverter tiết kiệm điện, chế độ Turbo làm lạnh nhanh, c\nùng các tính năng như Silk Air, BabyCare mang đến trải nghiệm làm mát dễ chịu, tiết kiệm năng lượng và bảo vệ sức khỏe người dùng.\nThiết kế\nDàn lạnh\n-\nMáy lạnh Casper\nsở hữu thiết kế treo tường hiện đại, tiết kiệm không gian, kết hợp với gam màu trắng thanh lịch giúp sản phẩm dễ dàng hài hòa với nhiều phong cách nội thất.\n- Điểm nhấn độc đáo của thiết kế này là\nmàn hình LED hiển thị nhiệt độ\ntrực quan giúp người dùng dễ dàng quan sát và điều chỉnh vào ban đêm.\nDàn nóng\n- Dàn nóng được trang bị hệ thống\nống dẫn gas bằng đồng mạ vàng, lá tản nhiệt bằng nhôm mạ vàng\nđảm bảo hiệu quả làm lạnh, tăng độ bền cho thiết bị chống chịu trước thời tiết ẩm ướt, sương muối,...\n- Thiết bị sử dụng\ngas R32\nthân thiện với môi trường đồng thời đảm bảo hiệu suất làm lạnh.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh Casper 1 HP\nhoạt động với công suất\n9.500 BTU\n, phù hợp lắp đặt trong không gian vừa phải có diện tích\ndưới 15m².\nVì vậy, thiết bị có thể ứng dụng tại nhiều vị trí trong gia đình như phòng ngủ, phòng đọc sách, phòng quần áo,...\n- Nhờ\ncông nghệ Turbo\nmáy lạnh được trang bị máy nén công nghệ cao, giúp nhiệt độ phòng có thể giảm xuống thấp trong thời gian ngắn, nhanh chóng mang lại không gian mát lạnh và thoải mái cho người dùng.\n-\nCông nghệ Silk Air\nkhuếch tán không khí mát thông qua hàng ngàn lỗ khí siêu nhỏ, tạo luồng khí mềm mại, nhẹ nhàng, không gây buốt lạnh, phù hợp với người lớn tuổi và trẻ nhỏ\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Casper Inverter\ncó chế độ thổi gió được thiết kế\nlên xuống tự động\n, giúp luồng khí lạnh luân chuyển đồng đều khắp không gian, đảm bảo mọi vị trí trong phòng đều được làm mát.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy nén hoạt động linh hoạt theo nhiệt độ phòng, giảm dao động công suất không cần thiết - từ đó tiết kiệm điện hiệu quả và kéo dài tuổi thọ máy.\n-\nChế độ i-Save\ntối ưu hóa đường cong nhiệt độ khi làm lạnh, cho phép máy hoạt động ổn định ở mức năng lượng thấp mà vẫn duy trì cảm giác mát mẻ.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ BabyCare\nđiều chỉnh nhiệt độ nhẹ nhàng, duy trì không gian dễ chịu mà không gây lạnh đột ngột, phù hợp cho gia đình có trẻ em hoặc người cao tuổi.\n-\nCảm biến nhiệt độ thông minh I Feel\nsử dụng cảm biến để đo nhiệt độ tại vị trí người dùng, giúp\nmáy lạnh\nđiều chỉnh chính xác mức nhiệt độ phù hợp với khu vực bạn đang ngồi.\n-\nTự khởi động lại khi có điện\n, giữ nguyên chế độ hoạt động trước khi bị ngắt điện.\n-\nKhóa remote điều khiển\n, đảm bảo an toàn khi sử dụng trong gia đình có trẻ nhỏ.\n-\nCơ chế bảo vệ an toàn kép thông minh\n, phát hiện rò rỉ đảm bảo an toàn tuyệt đối khi sử dụng.\n-\nHẹn giờ bật, tắt máy\nlinh hoạt, phù hợp với lịch trình sinh hoạt của người dùng.\n-\nChức năng\niClean tự động làm sạch dàn lạnh\nngăn ngừa sự hình thành vi khuẩn, nấm mốc phát triển, bảo vệ sức khỏe người dùng và duy trì hiệu suất làm lạnh ổn định lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Casper Inverter 1 HP QC-09IU36A là lựa chọn hoàn hảo cho không gian nhỏ dưới 15m², mang đến khả năng làm lạnh nhanh, tiết kiệm điện và vận hành êm ái. Với các công nghệ hiện đại như Inverter, Silk Air, chế độ BabyCare và iClean, sản phẩm không chỉ đáp ứng nhu cầu làm mát mà còn bảo vệ sức khỏe và nâng cao chất lượng cuộc sống cho người dùng.\nXem thêm","desc":"Máy lạnh Casper Inverter 1 HP QC-09IU36A\nlà lựa chọn lý tưởng cho các không gian dưới 15m² như phòng ngủ, phòng làm việc cá nhân hoặc cửa hàng nhỏ. Với công suất 9.500 BTU, sản phẩm tích hợp công nghệ Inverter tiết kiệm điện, chế độ Turbo làm lạnh nhanh, c\nùng các tính năng như Silk Air, BabyCare mang đến trải nghiệm làm mát dễ chịu, tiết kiệm năng lượng và bảo vệ sức khỏe người dùng.\nThiết kế\nDàn lạnh\n-\nMáy lạnh Casper\nsở hữu thiết kế treo tường hiện đại, tiết kiệm không gian, kết hợp với gam màu trắng thanh lịch giúp sản phẩm dễ dàng hài hòa với nhiều phong cách nội thất.\n- Điểm nhấn độc đáo của thiết kế này là\nmàn hình LED hiển thị nhiệt độ\ntrực quan giúp người dùng dễ dàng quan sát và điều chỉnh vào ban đêm.\nDàn nóng\n- Dàn nóng được trang bị hệ thống\nống dẫn gas bằng đồng mạ vàng, lá tản nhiệt bằng nhôm mạ vàng\nđảm bảo hiệu quả làm lạnh, tăng độ bền cho thiết bị chống chịu trước thời tiết ẩm ướt, sương muối,...\n- Thiết bị sử dụng\ngas R32\nthân thiện với môi trường đồng thời đảm bảo hiệu suất làm lạnh.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh Casper 1 HP\nhoạt động với công suất\n9.500 BTU\n, phù hợp lắp đặt trong không gian vừa phải có diện tích\ndưới 15m².\nVì vậy, thiết bị có thể ứng dụng tại nhiều vị trí trong gia đình như phòng ngủ, phòng đọc sách, phòng quần áo,...\n- Nhờ\ncông nghệ Turbo\nmáy lạnh được trang bị máy nén công nghệ cao, giúp nhiệt độ phòng có thể giảm xuống thấp trong thời gian ngắn, nhanh chóng mang lại không gian mát lạnh và thoải mái cho người dùng.\n-\nCông nghệ Silk Air\nkhuếch tán không khí mát thông qua hàng ngàn lỗ khí siêu nhỏ, tạo luồng khí mềm mại, nhẹ nhàng, không gây buốt lạnh, phù hợp với người lớn tuổi và trẻ nhỏ\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Casper Inverter\ncó chế độ thổi gió được thiết kế\nlên xuống tự động\n, giúp luồng khí lạnh luân chuyển đồng đều khắp không gian, đảm bảo mọi vị trí trong phòng đều được làm mát.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy nén hoạt động linh hoạt theo nhiệt độ phòng, giảm dao động công suất không cần thiết - từ đó tiết kiệm điện hiệu quả và kéo dài tuổi thọ máy.\n-\nChế độ i-Save\ntối ưu hóa đường cong nhiệt độ khi làm lạnh, cho phép máy hoạt động ổn định ở mức năng lượng thấp mà vẫn duy trì cảm giác mát mẻ.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ BabyCare\nđiều chỉnh nhiệt độ nhẹ nhàng, duy trì không gian dễ chịu mà không gây lạnh đột ngột, phù hợp cho gia đình có trẻ em hoặc người cao tuổi.\n-\nCảm biến nhiệt độ thông minh I Feel\nsử dụng cảm biến để đo nhiệt độ tại vị trí người dùng, giúp\nmáy lạnh\nđiều chỉnh chính xác mức nhiệt độ phù hợp với khu vực bạn đang ngồi.\n-\nTự khởi động lại khi có điện\n, giữ nguyên chế độ hoạt động trước khi bị ngắt điện.\n-\nKhóa remote điều khiển\n, đảm bảo an toàn khi sử dụng trong gia đình có trẻ nhỏ.\n-\nCơ chế bảo vệ an toàn kép thông minh\n, phát hiện rò rỉ đảm bảo an toàn tuyệt đối khi sử dụng.\n-\nHẹn giờ bật, tắt máy\nlinh hoạt, phù hợp với lịch trình sinh hoạt của người dùng.\n-\nChức năng\niClean tự động làm sạch dàn lạnh\nngăn ngừa sự hình thành vi khuẩn, nấm mốc phát triển, bảo vệ sức khỏe người dùng và duy trì hiệu suất làm lạnh ổn định lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Casper Inverter 1 HP QC-09IU36A là lựa chọn hoàn hảo cho không gian nhỏ dưới 15m², mang đến khả năng làm lạnh nhanh, tiết kiệm điện và vận hành êm ái. Với các công nghệ hiện đại như Inverter, Silk Air, chế độ BabyCare và iClean, sản phẩm không chỉ đáp ứng nhu cầu làm mát mà còn bảo vệ sức khỏe và nâng cao chất lượng cuộc sống cho người dùng.\nXem thêm","specs":{"Loại máy":"1 chiều (chỉ làm lạnh)","Inverter":"Có Inverter","Công suất làm lạnh":"1 HP - 9.500 BTU","Phạm vi làm lạnh hiệu quả":"Dưới 15m² (từ 30 đến 45m³)","Độ ồn trung bình (được đo trong phòng thí nghiệm)":"Dàn lạnh: 36 dB - Dàn nóng: 52 dB","Dòng sản phẩm":"2025","Sản xuất tại":"Thái Lan","Thời gian bảo hành cục lạnh, cục nóng":"3 năm","Thời gian bảo hành máy nén":"Máy nén 12 năm","Chất liệu dàn tản nhiệt":"Ống dẫn gas bằng Đồng mạ vàng - Lá tản nhiệt bằng Nhôm mạ vàng","Loại Gas":"R-32","Tiêu thụ điện":"1.03 kWh","Nhãn năng lượng":"3 sao (Hiệu suất năng lượng 4.27)","Công nghệ tiết kiệm điện":"Inverter Công nghệ I-Save","Chế độ gió":"Đảo gió lên xuống tự động","Công nghệ làm lạnh nhanh":"Turbo","Tiện ích":"Thiết kế thông minh EasyCare dễ dàng lắp đặt Khóa remote điều khiển Cảm biến nhiệt độ I Feel Cơ chế bảo vệ an toàn kép phát hiện rò rỉ thông minh Chức năng tự động làm sạch iClean Chức năng tự làm sạch dàn lạnh Chế độ ngủ đêm Sleep cho người già, trẻ nhỏ Chế độ BabyCare Màn hình hiển thị nhiệt độ trên dàn lạnh Hẹn giờ bật, tắt máy Tự khởi động lại khi có điện Công nghệ làm lạnh Silk Air","Kích thước dàn lạnh":"Dài 76.8 cm - Cao 28.7 cm - Dày 20 cm","Khối lượng dàn lạnh":"7.5 kg","Kích thước dàn nóng":"Dài 71 cm - Cao 45.5 cm - Dày 27.5 cm","Khối lượng dàn nóng":"16 kg","Chiều dài lắp đặt ống đồng":"Tối thiểu 3m - Tối đa 20m","Chiều cao lắp đặt tối đa giữa cục nóng-lạnh":"5m","Dòng điện vào":"Dàn lạnh","Dòng điện hoạt động":"1 pha","Kích thước ống đồng":"6/10","Số lượng kết nối dàn lạnh tối đa":"1","Hãng":"Casper. Xem thông tin hãng"},"feats":["- Máy lạnh Casper sở hữu thiết kế treo tường hiện đại, tiết kiệm không gian, kết hợp với gam màu trắng thanh lịch giúp sản phẩm dễ dàng hài hòa với nhiều phong cách nội thất.","- Điểm nhấn độc đáo của thiết kế này là màn hình LED hiển thị nhiệt độ trực quan giúp người dùng dễ dàng quan sát và điều chỉnh vào ban đêm.","- Dàn nóng được trang bị hệ thống ống dẫn gas bằng đồng mạ vàng, lá tản nhiệt bằng nhôm mạ vàng đảm bảo hiệu quả làm lạnh, tăng độ bền cho thiết bị chống chịu trước thời tiết ẩm ướt, sương muối,...","- Thiết bị sử dụng gas R32 thân thiện với môi trường đồng thời đảm bảo hiệu suất làm lạnh.","- Công nghệ Silk Air khuếch tán không khí mát thông qua hàng ngàn lỗ khí siêu nhỏ, tạo luồng khí mềm mại, nhẹ nhàng, không gây buốt lạnh, phù hợp với người lớn tuổi và trẻ nhỏ","- Máy lạnh Casper Inverter có chế độ thổi gió được thiết kế lên xuống tự động , giúp luồng khí lạnh luân chuyển đồng đều khắp không gian, đảm bảo mọi vị trí trong phòng đều được làm mát.","- Công nghệ Inverter giúp máy nén hoạt động linh hoạt theo nhiệt độ phòng, giảm dao động công suất không cần thiết - từ đó tiết kiệm điện hiệu quả và kéo dài tuổi thọ máy.","- Chế độ i-Save tối ưu hóa đường cong nhiệt độ khi làm lạnh, cho phép máy hoạt động ổn định ở mức năng lượng thấp mà vẫn duy trì cảm giác mát mẻ.","Xem thêm: Tổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng","- Chế độ BabyCare điều chỉnh nhiệt độ nhẹ nhàng, duy trì không gian dễ chịu mà không gây lạnh đột ngột, phù hợp cho gia đình có trẻ em hoặc người cao tuổi.","- Cảm biến nhiệt độ thông minh I Feel sử dụng cảm biến để đo nhiệt độ tại vị trí người dùng, giúp máy lạnh điều chỉnh chính xác mức nhiệt độ phù hợp với khu vực bạn đang ngồi.","- Tự khởi động lại khi có điện , giữ nguyên chế độ hoạt động trước khi bị ngắt điện."],"sku":"334018","vid":"","mod":"334018","brand":"Casper","slug":"334018-may-lanh-casper-inverter-1-hp-qc-09iu36a","_source":"avatar2-add-product","_source_url":"https://www.dienmayxanh.com/may-lanh/casper-inverter-1-hp-qc-09iu36a?srsltid=AfmBOoqQ9ZboJ-kIowTFz_lseNn8NKmYw_vPGyDBAaKcBREuz5uJck23","_added_at":"2026-10-05T14:43:07.224Z"},{"n":"Bếp Điện Từ Canzy CZI39992C SERI8","l":"https://canzyvietnam.vn/bep-dien-tu-canzy-cz-i39992c-serial-8-0","i":"https://bizweb.dktcdn.net/100/357/739/products/758e2570-49e4-44aa-bd20-b7d006e318ad.jpg","p":"12.980.000đ","pn":12980000,"listPn":12980000,"salePn":12980000,"priceMode":"list","c":"Bếp từ","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/357/739/products/758e2570-49e4-44aa-bd20-b7d006e318ad.jpg","https://bizweb.dktcdn.net/100/357/739/products/gen-n-6-1387979f-8fc6-4b67-adcb-5b8b4cbf877c.jpg"],"sum":"Bếp từ đôi Canzy CZ-I39992C Serial 8.0 là mẫu bếp âm hai vùng nấu dành cho căn bếp hiện đại, kết hợp mặt kính ELCD Platinum Ceramic đen bóng với bo viền nhôm màu sáng. Hai vùng từ vận hành độc lập, điều khiển cảm ứng trượt 9 mức nhiệt và công nghệ Inverter giúp nấu linh hoạt, tiết kiệm điện trong quá trình sử dụng hằng","desc":"Bếp từ đôi Canzy CZ-I39992C Serial 8.0 là mẫu bếp âm hai vùng nấu dành cho căn bếp hiện đại, kết hợp mặt kính ELCD Platinum Ceramic đen bóng với bo viền nhôm màu sáng. Hai vùng từ vận hành độc lập, điều khiển cảm ứng trượt 9 mức nhiệt và công nghệ Inverter giúp nấu linh hoạt, tiết kiệm điện trong quá trình sử dụng hằng","specs":{},"feats":["Số vùng nấu 2 vùng từ","Mặt kính ELCD Platinum Ceramic đen bóng, bo viền nhôm màu sáng","Điều khiển Cảm ứng Slide, 9 cấp độ nấu","Công nghệ Inverter thông minh, tiết kiệm khoảng 30% điện năng","Vùng nấu trái Booster 2.400W","Vùng nấu phải Booster 2.400W","Điện áp 220/240V","Kích thước mặt bếp 730 x 430 mm","Kích thước cắt đá 690 x 390 mm","Chức năng nấu Sôi liu riu, Warm, Stir Fry, Pause, Booster, hẹn giờ","An toàn Tự ngắt khi không có nồi; cảnh báo dư nhiệt; chống tràn; khóa trẻ em; khóa phím; bảo vệ quá nhiệt - quá áp"],"sku":"CZI39992C","vid":"","mod":"CZI39992C","brand":"Canzy","slug":"czi39992c-bep-dien-tu-canzy-czi39992c-seri8","_source":"avatar2-add-product","_source_url":"https://canzyvietnam.vn/bep-dien-tu-canzy-cz-i39992c-serial-8-0","_added_at":"2026-10-05T14:43:00.583Z"},{"n":"Hút Mùi Âm Tủ Canzy CZH1270AT","l":"https://canzyvietnam.vn/hut-mui-am-tu-canzy-cz-h1270at","i":"https://bizweb.dktcdn.net/100/357/739/products/d8a4ae24-299d-442f-8a77-a7aaeae9219b.jpg","p":"5.980.000đ","pn":5980000,"listPn":5980000,"salePn":5980000,"priceMode":"list","c":"Máy hút mùi","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/357/739/products/d8a4ae24-299d-442f-8a77-a7aaeae9219b.jpg","https://bizweb.dktcdn.net/100/357/739/products/3cebb626-dd99-4f8d-ae1e-067ddac165a0.jpg"],"sum":"Canzy CZ H1270AT: Máy hút mùi âm tủ kéo rút – Tinh gọn không gian, tối ưu sức mạnh Canzy CZ-H1270AT là dòng máy hút mùi âm tủ thế hệ mới, được thiết kế đặc biệt cho những căn hộ chung cư hoặc không gian bếp cần sự ngăn nắp tuyệt đối. Với cơ chế hoạt động kéo rút linh hoạt cùng khả năng vận hành siêu êm ái, CZ H1270AT k","desc":"Canzy CZ H1270AT: Máy hút mùi âm tủ kéo rút – Tinh gọn không gian, tối ưu sức mạnh Canzy CZ-H1270AT là dòng máy hút mùi âm tủ thế hệ mới, được thiết kế đặc biệt cho những căn hộ chung cư hoặc không gian bếp cần sự ngăn nắp tuyệt đối. Với cơ chế hoạt động kéo rút linh hoạt cùng khả năng vận hành siêu êm ái, CZ H1270AT k","specs":{"Tiêu chí kỹ thuật":"Thông số chi tiết","Model":"CZ H1270AT","Thương hiệu":"Canzy (Chính hãng)","Kiểu máy":"Máy hút mùi âm tủ kéo rút (Kéo ra bật – Đóng vào tắt)","Chất liệu":"Inox cao cấp – Kính cường lực","Động cơ":"160W (Vận hành ổn định)","Công suất hút":"950 m³/h (Cực mạnh trong phân khúc)","Độ ồn":"≤ 38 dB (Siêu êm ái)","Điều khiển":"3 tốc độ linh hoạt","Hệ thống lọc mỡ":"2 lưới lọc Aluminum 3 lớp (Dễ vệ sinh)","Chế độ khử mùi":"Than hoạt tính hoặc ống thoát Ø120mm","Hệ thống chiếu sáng":"Đèn 2 × 40W (Hỗ trợ nấu nướng)","Tiện ích an toàn":"Lẫy cài Inox chống cháy, hẹn giờ mặc định","Đường kính ống thoát":"Ø120 mm"},"feats":["• Tối ưu diện tích: Toàn bộ thân máy được giấu kín trong tủ bếp, chỉ để lộ phần thanh kéo thanh mảnh, giúp gian bếp trông rộng rãi và chuyên nghiệp hơn.","Động cơ 160W nội lực: Dù thiết kế nhỏ gọn, CZ H1270AT sở hữu công suất hút lên đến 950m3/h, loại bỏ nhanh chóng mùi thức ăn đậm mùi nhất.","Hệ thống khử mùi kép: Tích hợp chế độ khử mùi tại chỗ bằng than hoạt tính hoặc xả trực tiếp qua ống thoát Ø120mm, linh hoạt cho mọi địa hình lắp đặt.","Máy này có hẹn giờ không? Có, CZ H1270AT tích hợp chế độ hẹn giờ mặc định giúp bạn yên tâm để máy tự làm sạch không khí sau khi nấu.","Kéo ra một nửa máy có chạy không? Máy bắt đầu hoạt động ngay khi bạn kéo nhẹ thanh trượt, tuy nhiên nên kéo hết cỡ để diện tích hút khói là lớn nhất."],"sku":"H1270AT","vid":"","mod":"H1270AT","brand":"Canzy","slug":"h1270at-hut-mui-am-tu-canzy-czh1270at","_source":"avatar2-add-product","_source_url":"https://canzyvietnam.vn/hut-mui-am-tu-canzy-cz-h1270at","_added_at":"2026-10-05T14:42:54.993Z"},{"n":"Kệ Gia Vị Nâng Hạ Điện STAR MOVE (401354 - 900mm) - Higold ","l":"https://phukienbepthanhdat.com/ke-gia-vi-nang-ha-dien-star-move-401354-900mm-higold/","i":"https://phukienbepthanhdat.com/wp-content/uploads/2025/10/ke-gia-vi-nang-ha-dien-star-move-1.jpg","p":"21.000.000đ","pn":21000000,"listPn":21000000,"salePn":21000000,"priceMode":"list","c":"Kệ gia vị nâng hạ điện","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://phukienbepthanhdat.com/wp-content/uploads/2025/10/ke-gia-vi-nang-ha-dien-star-move-1.jpg"],"sum":"Đặc điểm nổi bật \nGiá gia vị nâng hạ điện STAR MOVE sử dụng công nghệ cảm biến chạm hiện đại. Chỉ cần chạm nhẹ vào bộ cảm biến, giá gia vị sẽ tự động hạ xuống theo chiều thẳng đứng, giúp tận dụng được những khoang tủ cao. Người dùng có thể dừng giá ở bất kỳ vị trí nào hoặc đưa về trạng thái ban đầu chỉ với một thao tác chạm. Cảm biến hoạt động mượt mà ngay cả khi tay bạn ướt hoặc dính dầu mỡ.\nHệ thống ròng rọc và ray trượt chắc chắn giúp giá vận hành trơn tru. Khi nhận tín hiệu chạm, hệ thống sẽ kéo giá xuống. Trong quá trình di chuyển, nếu gặp vật cản phía dưới, giá sẽ tự động đảo chiều đi lên, đảm bảo an toàn cho người dùng và thiết bị.\nGiá được thiết kế 2 tầng riêng biệt. Tầng trên để các lọ gia vị nhỏ, tầng dưới phù hợp cho các chai lớn hơn, giúp phân loại và sắp xếp gọn gàng, tận dụng hiệu quả không gian tủ bếp trên – nơi thường khó với tới.\nToàn bộ khung và giỏ được làm từ hợp kim nhôm phủ sơn tĩnh điện, có khả năng chống oxy hóa, hạn chế han gỉ, bền bỉ trong môi trường bếp ẩm, đồng thời dễ dàng vệ sinh.\nKết cấu chắc chắn, sản phẩm có khả năng chịu tải lên đến 20kg.\nSản phẩm sử dụng điện áp định mức 100-220V, tương thích với hầu hết hệ thống điện trong gia đình.\nĐèn LED tích hợp trên giá giúp chiếu sáng khu vực lưu trữ, hỗ trợ người dùng dễ dàng nhận biết và lấy đúng chai lọ mình cần ngay cả trong điều kiện thiếu sáng.","desc":"Đặc điểm nổi bật \nGiá gia vị nâng hạ điện STAR MOVE sử dụng công nghệ cảm biến chạm hiện đại. Chỉ cần chạm nhẹ vào bộ cảm biến, giá gia vị sẽ tự động hạ xuống theo chiều thẳng đứng, giúp tận dụng được những khoang tủ cao. Người dùng có thể dừng giá ở bất kỳ vị trí nào hoặc đưa về trạng thái ban đầu chỉ với một thao tác chạm. Cảm biến hoạt động mượt mà ngay cả khi tay bạn ướt hoặc dính dầu mỡ.\nHệ thống ròng rọc và ray trượt chắc chắn giúp giá vận hành trơn tru. Khi nhận tín hiệu chạm, hệ thống sẽ kéo giá xuống. Trong quá trình di chuyển, nếu gặp vật cản phía dưới, giá sẽ tự động đảo chiều đi lên, đảm bảo an toàn cho người dùng và thiết bị.\nGiá được thiết kế 2 tầng riêng biệt. Tầng trên để các lọ gia vị nhỏ, tầng dưới phù hợp cho các chai lớn hơn, giúp phân loại và sắp xếp gọn gàng, tận dụng hiệu quả không gian tủ bếp trên – nơi thường khó với tới.\nToàn bộ khung và giỏ được làm từ hợp kim nhôm phủ sơn tĩnh điện, có khả năng chống oxy hóa, hạn chế han gỉ, bền bỉ trong môi trường bếp ẩm, đồng thời dễ dàng vệ sinh.\nKết cấu chắc chắn, sản phẩm có khả năng chịu tải lên đến 20kg.\nSản phẩm sử dụng điện áp định mức 100-220V, tương thích với hầu hết hệ thống điện trong gia đình.\nĐèn LED tích hợp trên giá giúp chiếu sáng khu vực lưu trữ, hỗ trợ người dùng dễ dàng nhận biết và lấy đúng chai lọ mình cần ngay cả trong điều kiện thiếu sáng.","specs":{"Kích thước (rộng x sâu x cao)":"864 x 263x 690mm","Chất liệu":"Thép cacbon + Hợp kim nhôm","Kích thước phủ bì":"900mm"},"feats":["Giá được thiết kế 2 tầng riêng biệt. Tầng trên để các lọ gia vị nhỏ, tầng dưới phù hợp cho các chai lớn hơn, giúp phân loại và sắp xếp gọn gàng, tận dụng hiệu quả không gian tủ bếp trên – nơi thường khó với tới.","Toàn bộ khung và giỏ được làm từ hợp kim nhôm phủ sơn tĩnh điện, có khả năng chống oxy hóa, hạn chế han gỉ, bền bỉ trong môi trường bếp ẩm, đồng thời dễ dàng vệ sinh.","Kết cấu chắc chắn, sản phẩm có khả năng chịu tải lên đến 20kg.","Sản phẩm sử dụng điện áp định mức 100-220V, tương thích với hầu hết hệ thống điện trong gia đình.","Đèn LED tích hợp trên giá giúp chiếu sáng khu vực lưu trữ, hỗ trợ người dùng dễ dàng nhận biết và lấy đúng chai lọ mình cần ngay cả trong điều kiện thiếu sáng."],"sku":"401354","vid":"","mod":"401354","brand":"Higold","slug":"401354-ke-gia-vi-nang-ha-dien-star-move-401354-900mm-higold","_source":"vai-market-add-product","_source_url":"https://phukienbepthanhdat.com/ke-gia-vi-nang-ha-dien-star-move-401354-900mm-higold/","_added_at":"2026-09-04T10:19:11.557Z"},{"n":"Khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi","l":"https://thienkimhome.com/demax-el988-24k-brass-app-wifi","i":"https://thienkimhome.com/application/upload/products/Demax-SL988-24K-Brass-App-Wifi.jpg","p":"59.990.000đ","pn":59990000,"listPn":59990000,"salePn":59990000,"priceMode":"list","c":"Khóa điện tử","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://thienkimhome.com/application/upload/products/Demax-SL988-24K-Brass-App-Wifi.jpg","https://thienkimhome.com/application/upload/products/kich-thuoc-sl-988-24k.png","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-1.jpg","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-2.jpg","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-3.jpg"],"sum":"Tổng quan  khóa Demax EL988 24K Brass App Wifi \nTrong thị trường khóa thông minh ngày nay, Khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi từ Malaysia nổi bật với thiết kế và tính năng đa dạng, đáp ứng mọi yêu cầu của khách hàng. Với màu sắc Mạ Vàng 24K, khóa này thực sự là một tác phẩm nghệ thuật cho các không gian đại sảnh và biệt thự.\nChất liệu bền bỉ và thiết kế sang trọng \nKhóa cao cấp Brass được chế tạo từ đồng thau nguyên chất với lớp mạ vàng 24K, mang đến vẻ đẹp sang trọng và độ bền cao. Thân khóa làm từ thép SUS 304 chất lượng, giúp khóa chống chịu được va đập và thời tiết khắc nghiệt, bảo vệ tối đa cho ngôi nhà của bạn. \nVới sự kết hợp giữa thiết kế đẳng cấp và chất liệu chất lượng, tạo nên một điểm nhấn độc đáo cho không gian của bạn.\nƯu điểm của khóa \nMở khóa đa phương thức và bảo mật tuyệt đối \nThiết bị có khả năng mở khóa theo nhiều phương thức khác nhau, đảm bảo tính bảo mật tuyệt đối cho ngôi nhà của bạn. Bạn có thể mở khóa bằng nhận diện khuôn mặt FACE ID-3D, mở khóa từ xa thông qua ứng dụng Wifi, sử dụng vân tay, mật mã, thẻ từ, hoặc chìa khóa chống sao chép.\nTiện ích và linh hoạt \nSản phẩm không chỉ hướng đến tính bảo mật mà còn mang lại nhiều tiện ích và linh hoạt cho người dùng. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể dễ dàng quản lý quyền truy cập của gia đình và khách khứa.\nNgoài ra, khóa còn tích hợp nhiều tính năng thông minh như nhận dạng vân tay bằng sinh trắc học FPC từ Thụy Điển, chức năng thoát hiểm từ bên trong, tay nắm đổi chiều Phải - Trái, cảnh báo đột nhập, vô hiệu hóa thẻ bị mất và chức năng cập nhật thông tin. Bạn sẽ luôn được nhắc nhở khi pin yếu, đảm bảo khóa luôn hoạt động hiệu quả.\nKết nối thông minh và dễ dàng sử dụng \nKhóa có thể kết nối với điện thoại thông qua ứng dụng App wifi đơn giản, giúp bạn kiểm soát và điều khiển từ xa một cách dễ dàng. Bạn có thể mở khóa, cập nhật thông tin và nhận thông báo trạng thái của khóa mọi lúc, mọi nơi.\nKhả năng lưu trữ \nKhóa điện tử thông minh Brass App Wifi được trang bị nhiều tính năng hữu ích. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể quản lý quyền truy cập một cách linh hoạt và tiện lợi. Đồng thời, khóa còn hỗ trợ thẻ từ theo máy và chìa khóa chống sao chép, giúp tăng cường tính bảo mật cho ngôi nhà của bạn.\nTính năng độc đáo và thông minh \nKhóa cửa Demax EL988 24K Brass App Wifi mang đến nhiều tính năng độc đáo và thông minh. Với nhận diện vân tay bằng sinh trắc học FPC từ Thụy Điển, khóa đảm bảo độ chính xác và an toàn cao.\nHơn nữa, khóa còn được trang bị chức năng thoát hiểm từ bên trong, giúp bạn dễ dàng ra vào ngôi nhà trong trường hợp khẩn cấp.\nSự đa dạng và phù hợp với không gian \nKhóa đại sảnh 24K từ Malaysia không chỉ chú trọng đến tính năng và bảo mật, mà còn phù hợp với nhiều loại không gian khác nhau. Với kích thước mặt trong và mặt ngoài cùng là 80 x 735mm, khóa này có thể dễ dàng lắp đặt vào cửa đi của các đại sảnh và khóa cửa gỗ đại sảnh biệt thự.\nĐơn giản và thuận tiện trong sử dụng \nTrên đây là những thông tin về khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi, một sản phẩm kết hợp hoàn hảo giữa công nghệ và sang trọng. Với thiết kế đẳng cấp, tính bảo mật cao, tính năng đa dạng và kết nối thông minh, khóa này sẽ mang đến trải nghiệm tuyệt vời cho ngôi nhà của bạn.","desc":"Tổng quan  khóa Demax EL988 24K Brass App Wifi \nTrong thị trường khóa thông minh ngày nay, Khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi từ Malaysia nổi bật với thiết kế và tính năng đa dạng, đáp ứng mọi yêu cầu của khách hàng. Với màu sắc Mạ Vàng 24K, khóa này thực sự là một tác phẩm nghệ thuật cho các không gian đại sảnh và biệt thự.\nChất liệu bền bỉ và thiết kế sang trọng \nKhóa cao cấp Brass được chế tạo từ đồng thau nguyên chất với lớp mạ vàng 24K, mang đến vẻ đẹp sang trọng và độ bền cao. Thân khóa làm từ thép SUS 304 chất lượng, giúp khóa chống chịu được va đập và thời tiết khắc nghiệt, bảo vệ tối đa cho ngôi nhà của bạn. \nVới sự kết hợp giữa thiết kế đẳng cấp và chất liệu chất lượng, tạo nên một điểm nhấn độc đáo cho không gian của bạn.\nƯu điểm của khóa \nMở khóa đa phương thức và bảo mật tuyệt đối \nThiết bị có khả năng mở khóa theo nhiều phương thức khác nhau, đảm bảo tính bảo mật tuyệt đối cho ngôi nhà của bạn. Bạn có thể mở khóa bằng nhận diện khuôn mặt FACE ID-3D, mở khóa từ xa thông qua ứng dụng Wifi, sử dụng vân tay, mật mã, thẻ từ, hoặc chìa khóa chống sao chép.\nTiện ích và linh hoạt \nSản phẩm không chỉ hướng đến tính bảo mật mà còn mang lại nhiều tiện ích và linh hoạt cho người dùng. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể dễ dàng quản lý quyền truy cập của gia đình và khách khứa.\nNgoài ra, khóa còn tích hợp nhiều tính năng thông minh như nhận dạng vân tay bằng sinh trắc học FPC từ Thụy Điển, chức năng thoát hiểm từ bên trong, tay nắm đổi chiều Phải - Trái, cảnh báo đột nhập, vô hiệu hóa thẻ bị mất và chức năng cập nhật thông tin. Bạn sẽ luôn được nhắc nhở khi pin yếu, đảm bảo khóa luôn hoạt động hiệu quả.\nKết nối thông minh và dễ dàng sử dụng \nKhóa có thể kết nối với điện thoại thông qua ứng dụng App wifi đơn giản, giúp bạn kiểm soát và điều khiển từ xa một cách dễ dàng. Bạn có thể mở khóa, cập nhật thông tin và nhận thông báo trạng thái của khóa mọi lúc, mọi nơi.\nKhả năng lưu trữ \nKhóa điện tử thông minh Brass App Wifi được trang bị nhiều tính năng hữu ích. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể quản lý quyền truy cập một cách linh hoạt và tiện lợi. Đồng thời, khóa còn hỗ trợ thẻ từ theo máy và chìa khóa chống sao chép, giúp tăng cường tính bảo mật cho ngôi nhà của bạn.\nTính năng độc đáo và thông minh \nKhóa cửa Demax EL988 24K Brass App Wifi mang đến nhiều tính năng độc đáo và thông minh. Với nhận diện vân tay bằng sinh trắc học FPC từ Thụy Điển, khóa đảm bảo độ chính xác và an toàn cao.\nHơn nữa, khóa còn được trang bị chức năng thoát hiểm từ bên trong, giúp bạn dễ dàng ra vào ngôi nhà trong trường hợp khẩn cấp.\nSự đa dạng và phù hợp với không gian \nKhóa đại sảnh 24K từ Malaysia không chỉ chú trọng đến tính năng và bảo mật, mà còn phù hợp với nhiều loại không gian khác nhau. Với kích thước mặt trong và mặt ngoài cùng là 80 x 735mm, khóa này có thể dễ dàng lắp đặt vào cửa đi của các đại sảnh và khóa cửa gỗ đại sảnh biệt thự.\nĐơn giản và thuận tiện trong sử dụng \nTrên đây là những thông tin về khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi, một sản phẩm kết hợp hoàn hảo giữa công nghệ và sang trọng. Với thiết kế đẳng cấp, tính bảo mật cao, tính năng đa dạng và kết nối thông minh, khóa này sẽ mang đến trải nghiệm tuyệt vời cho ngôi nhà của bạn.","specs":{"Mã sản phẩm":"Mã Mới: EL988 24K Brass Mã cũ: SL988 24K Brass App Wifi","Thương hiệu":"Demax Xem thông tin hãng","Xuất xứ":"Malaysia","Cách mở khoá":"– Mở khóa bằng nhận diện khuôn mặt FACE ID-3D – Mở khóa từ xa bằng App Wifi – Mở khóa bằng vân tay – Mở khóa bằng mật mã – Mở khóa bằng thẻ từ – Chìa khóa chống sao chép","Màu sắc":"Mạ Vàng 24K","Phù hợp cho":"Đại sảnh - biệt thự","Kích thước mặt trong":"80 x 735mm (Rộng x cao)","Kích thước mặt ngoài":"80 x 735mm (Rộng x cao)","Khả năng lưu trữ":"– Số vân tay: 100 – Số thẻ từ (cài đặt, sử dụng): 100 – Nhận dạng khuôn mặt: 100 – Thẻ từ theo máy: 2 – Chìa khóa chống sao chép: 2","Tính năng":"– Nhận dạng vân tay bằng sinh trắc học FPC – Thụy Điển – Chức năng thoát hiểm từ bên trong – Tay nắm đổi chiều Phải – Trái – Cảnh báo đột nhập – Vô hiệu hóa thẻ bị mật – Chức năng cập nhật thông tin – Nhắc nhở pin yếu","Vật liệu":"Đồng thau nguyên chất, mạ vàng 24 K – Thân khóa thép SUS 304","Nguồn điện":"7,4V Lithium (Pin sạc Lithium kép)","Nguồn khẩn cấp":"5V-2A, Micro USB","Độ dày cửa":"40~90 mm","Đố cửa":"> 100 mm","Loại cửa":"Cửa đi","Kết nối điện thoại":"Có","Phụ kiện kèm theo":"– Thẻ từ theo máy: 2 – Chìa khóa chống sao chép: 2"},"feats":["Tổng quan  khóa Demax EL988 24K Brass App Wifi","Chất liệu bền bỉ và thiết kế sang trọng","Ưu điểm của khóa","Mở khóa đa phương thức và bảo mật tuyệt đối","Tiện ích và linh hoạt","Kết nối thông minh và dễ dàng sử dụng","Khả năng lưu trữ","Tính năng độc đáo và thông minh","Sự đa dạng và phù hợp với không gian","Đơn giản và thuận tiện trong sử dụng"],"sku":"EL988","vid":"","mod":"EL988","brand":"Demax","slug":"el988-khoa-dai-sanh-biet-thu-demax-el988-24k-brass-app-wifi","_source":"vai-market-add-product","_source_url":"https://thienkimhome.com/demax-el988-24k-brass-app-wifi","_added_at":"2026-09-04T10:19:08.461Z"},{"n":"Chậu rửa KAFF GRANITE KF - MONDY - 8552S","l":"https://kaff.vn/san-pham/chau-rua-granite-kf-mondy-8552s-5013.html","i":"https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1704662337400.jpg","p":"9.880.000đ","pn":9880000,"listPn":0,"salePn":9880000,"priceMode":"both","c":"Chậu rửa chén","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1704662337400.jpg","https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1751539458342.jpg"],"sum":"Giá bán khuyến mãi 9,880,000đ Chậu rửa GRANITE KF - MONDY - 8552S • Chất liệu: Đá GRANITE • Màu sắc: Đen, trắng, vàng, kem, xám • Độ sâu bồn: 220mm • Kích thước: 850D x 515R mm • Đóng gói: 1 bộ tiêu chuẩn túi PE Foam (kèm siphon) • Bảo hành: 3 năm","desc":"Giá bán khuyến mãi 9,880,000đ Chậu rửa GRANITE KF - MONDY - 8552S • Chất liệu: Đá GRANITE • Màu sắc: Đen, trắng, vàng, kem, xám • Độ sâu bồn: 220mm • Kích thước: 850D x 515R mm • Đóng gói: 1 bộ tiêu chuẩn túi PE Foam (kèm siphon) • Bảo hành: 3 năm","specs":{"Màu sắc":"Đen, trắng, vàng, kem, xám • Độ sâu bồn: 220mm • Kích thước: 850D x 515R mm • Đóng gói: 1 bộ tiêu chuẩn túi PE Foam (kèm siphon) • Bảo hành: 3 năm"},"feats":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"sku":"GRANITE KF - MONDY - 8552S","vid":"","mod":"GRANITE KF - MONDY - 8552S","brand":"KAFF","slug":"granite-kf-mondy-8552s-chau-rua-kaff-granite-kf-mondy-8552s","_source":"vai-market-add-product","_source_url":"https://kaff.vn/san-pham/chau-rua-granite-kf-mondy-8552s-5013.html","_added_at":"2026-09-04T10:19:05.606Z"},{"n":"MÁY RỬA CHÉN KAFF KF-GARDE820 SEMI","l":"https://kaff.vn/san-pham/may-rua-chen-kaff-kf-garde820-semi-4994.html","i":"https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1700107978718.jpg","p":"30.800.000đ","pn":30800000,"listPn":0,"salePn":30800000,"priceMode":"both","c":"MÁY RỬA CHÉN","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1700107978718.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490852905.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490852442.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853426.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853575.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853725.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-173449085368.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853605.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853664.jpg","https://kaff.vn/upload/products/large/may-rua-chen-am-ban-phan-kf-hb805se17-pro-1757658670600.jpg"],"sum":"MÁY RỬA CHÉN KAFF KF-GARDE820 SEMI • Máy rửa chén âm bán phần • Sức chứa 15 bộ đồ ăn Châu Âu • 10 Chương trình rửa tích hợp: Prewash, Mini 14’ (Jet Wash), Quick 30’ 40°C, Eco (Standard Programme), Super 50’ 65°C (Quick Clean), Easy Care 60°C, Dual Pro Wash 60°C, Smart 30°C - 50°C, Smart 50°C - 60°C, Smart 60°C - 70°C. Chức năng đặc biệt: *Delay timer option • Eco Wash - Half load option (with 3 mode), Tablet option, Extra Hygiene option, Extra Drying option, Extra Silent option (Silent Wash), Extra Fast option, Energy Save option, Rinse-aid indicator, Salt indicator, Washing cycle indicators, End of cycle indicator • Chức năng UVON diệt khuẩn (UVON natural tech) • Chức năng ION diệt khuẩn (ION natural tech) • Hệ thống sấy khô Tubo (Drying system) • Khóa trẻ em (Child lock) • Chức năng tạo Ozon • Hệ thống chống Siphon • Điều khiển cảm ứng hiện đại, màn hình Led sang trọng • Chức năng hẹn giờ (Delay time) • Chức năng nâng hạ giàn rửa (Adjustable upper basket) • Vòi phun phụ • Độ ồn cực thấp maximum 42 dB • Tiêu chuẩn tiết kiệm năng lượng châu Âu A+++, chỉ số hiệu quả năng lượng A • Chức năng khóa máy khi có sự cố tác động (ngập nước, va đập, yếu điện, thiếu nước,...) • Chống rò nước từ máy • Hệ thống chuyển hướng điện (Electrical Diverter system) • Đèn báo máy hoạt động và kết thúc chương trình rửa • Chức năng kiểm tra độ cứng và làm mềm nước • Đèn chiếu sáng bên trong (One spot) • Bảo hành 05 năm","desc":"MÁY RỬA CHÉN KAFF KF-GARDE820 SEMI • Máy rửa chén âm bán phần • Sức chứa 15 bộ đồ ăn Châu Âu • 10 Chương trình rửa tích hợp: Prewash, Mini 14’ (Jet Wash), Quick 30’ 40°C, Eco (Standard Programme), Super 50’ 65°C (Quick Clean), Easy Care 60°C, Dual Pro Wash 60°C, Smart 30°C - 50°C, Smart 50°C - 60°C, Smart 60°C - 70°C. Chức năng đặc biệt: *Delay timer option • Eco Wash - Half load option (with 3 mode), Tablet option, Extra Hygiene option, Extra Drying option, Extra Silent option (Silent Wash), Extra Fast option, Energy Save option, Rinse-aid indicator, Salt indicator, Washing cycle indicators, End of cycle indicator • Chức năng UVON diệt khuẩn (UVON natural tech) • Chức năng ION diệt khuẩn (ION natural tech) • Hệ thống sấy khô Tubo (Drying system) • Khóa trẻ em (Child lock) • Chức năng tạo Ozon • Hệ thống chống Siphon • Điều khiển cảm ứng hiện đại, màn hình Led sang trọng • Chức năng hẹn giờ (Delay time) • Chức năng nâng hạ giàn rửa (Adjustable upper basket) • Vòi phun phụ • Độ ồn cực thấp maximum 42 dB • Tiêu chuẩn tiết kiệm năng lượng châu Âu A+++, chỉ số hiệu quả năng lượng A • Chức năng khóa máy khi có sự cố tác động (ngập nước, va đập, yếu điện, thiếu nước,...) • Chống rò nước từ máy • Hệ thống chuyển hướng điện (Electrical Diverter system) • Đèn báo máy hoạt động và kết thúc chương trình rửa • Chức năng kiểm tra độ cứng và làm mềm nước • Đèn chiếu sáng bên trong (One spot) • Bảo hành 05 năm","specs":{},"feats":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"sku":"GARDE820SEMI","vid":"","mod":"GARDE820SEMI","brand":"KAFF","slug":"garde820semi-may-rua-chen-kaff-kf-garde820-semi","_source":"vai-market-add-product","_source_url":"https://kaff.vn/san-pham/may-rua-chen-kaff-kf-garde820-semi-4994.html","_added_at":"2026-09-04T10:19:03.354Z"},{"n":"BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus","l":"https://kaff.vn/san-pham/bep-dien-tu-kaff-kf-ic79h-new-plus-5094.html","i":"https://kaff.vn/upload/products/large/bep-dien-tu-kaff-kf-ic79h-new-plus-170850056341.jpg","p":"21.800.000đ","pn":21800000,"listPn":0,"salePn":21800000,"priceMode":"both","c":"BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://kaff.vn/upload/products/large/bep-dien-tu-kaff-kf-ic79h-new-plus-170850056341.jpg"],"sum":"Giá bán khuyến mãi 21,800,000đ BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus Bếp điện từ kết hợp: 02 từ + 01 điện – Xuất xứ: MALAYSIA Mặt kính Shott Ceran Made in Germany siêu bền, chịu lực chịu sốc nhiệt Đầu đốt EGO Made in Germany Chức năng Booster cực nhanh với bếp từ Bo mạch lGBT SIMENS Made in Germany Công nghệ Half- Bridge gia nhiệt liên tục 10 dải công suất Điều khiển cảm ứng Slider dạng ẩn trực tiếp trên mặt bếp Chế độ hẹn giờ, tiện dụng Chức năng Inverter và chia công suất tiết kiệm điện năng, bảo vệ bếp Bảo hành 05 năm","desc":"Giá bán khuyến mãi 21,800,000đ BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus Bếp điện từ kết hợp: 02 từ + 01 điện – Xuất xứ: MALAYSIA Mặt kính Shott Ceran Made in Germany siêu bền, chịu lực chịu sốc nhiệt Đầu đốt EGO Made in Germany Chức năng Booster cực nhanh với bếp từ Bo mạch lGBT SIMENS Made in Germany Công nghệ Half- Bridge gia nhiệt liên tục 10 dải công suất Điều khiển cảm ứng Slider dạng ẩn trực tiếp trên mặt bếp Chế độ hẹn giờ, tiện dụng Chức năng Inverter và chia công suất tiết kiệm điện năng, bảo vệ bếp Bảo hành 05 năm","specs":{},"feats":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"sku":"KAFF KF - IC79H New Plus","vid":"","mod":"KAFF KF - IC79H New Plus","brand":"KAFF","slug":"kaff-kf-ic79h-new-plus-bep-dien-tu-kaff-kf-ic79h-new-plus","_source":"vai-market-add-product","_source_url":"https://kaff.vn/san-pham/bep-dien-tu-kaff-kf-ic79h-new-plus-5094.html","_added_at":"2026-09-04T10:19:00.584Z"},{"n":"VÒI RỬA NÓNG LẠNH KAFF KF-FC9014","l":"https://kaff.vn/san-pham/voi-rua-nong-lanh-kaff-kf-fc9014-5054.html","i":"https://kaff.vn/upload/products/large/voi-rua-lanh-kaff-kf-fc9014-1704925929991.jpg","p":"4.180.000đ","pn":4180000,"listPn":0,"salePn":4180000,"priceMode":"both","c":"VÒI RỬA CHÉN","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://kaff.vn/upload/products/large/voi-rua-lanh-kaff-kf-fc9014-1704925929991.jpg"],"sum":"VÒI RỬA NÓNG LẠNH KAFF KF-FC9014 • Vòi lạnh • Bảo hành 3 năm","desc":"VÒI RỬA NÓNG LẠNH KAFF KF-FC9014 • Vòi lạnh • Bảo hành 3 năm","specs":{},"feats":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"sku":"KFFC9014","vid":"","mod":"KFFC9014","brand":"KAFF","slug":"kffc9014-voi-rua-nong-lanh-kaff-kf-fc9014","_source":"vai-market-add-product","_source_url":"https://kaff.vn/san-pham/voi-rua-nong-lanh-kaff-kf-fc9014-5054.html","_added_at":"2026-09-04T10:18:58.915Z"},{"n":"MÁY SẤY CHÉN KAFF KF-DR113L09BL","l":"https://kaff.vn/san-pham/may-say-kaff-kf-dr113l09bl-4993.html","i":"https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699435317207.jpg","p":"25.800.000đ","pn":25800000,"listPn":0,"salePn":25800000,"priceMode":"both","c":"MÁY SẤY CHÉN","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699435317207.jpg","https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699499640165.jpg"],"sum":"MÁY SẤY KAFF KF-DR113L09BL • Máy sấy cửa trước hiện đại lồng ngang • 15 chương trình sấy tự động tích hợp (Cotton Extra Dry, Cotton Cupboard Dry, Cotton Iron Dry, Synthetics Cupboard Dry, Synthetics Iron Dry, Delicate, Mix, Baby Care, Towels,Hygiene, Outdoor, Time drying, Refresh, Express, Shirts, Duvet, Sport, Wool refresh) • Khối lượng sấy khô 9 Kg • Công nghệ sấy cưỡng bức trực tiếp hiện đại - HEAT PUMP A++ (AL) • Lồng sấy inox, thân sơn tĩnh điện màu đen cao cấp • Chức năng diệt khuẩn an toàn UVC_TD • Motor Pump và máy nén Compressor motor kiểu PSC hoạt động đảo chiều, không sử dụng chổi than EcoSilence Drive giúp máy sấy hoạt động với đồ ồn thấp và bền bỉ - tiết kiệm năng lượng • Hệ thống cảm biến sấy an toàn Sensor Drying System • Đảo chiều lồng quay lúc sấy giúp sấy đồ khô nhanh hơn, hiệu quả hơn (Two Way Tumbling) • Điều khiển điện tử (Control system Electronic) • Hệ thống phát hiện lỗi khi sử dụng (Failure Detection System) • Khóa trẻ em an toàn (Child lock) • Hiện thị chu trình sấy (Drying cycle indicator) • Chức năng hẹn giờ lên đến 1-23h (Delay time adjustment via button) • Điều chỉnh cường độ sấy (Drying level adjustment via button) • Điều chỉnh chương trình sấy (Drying Target) • Điều chỉnh tốc độ sấy (Spin Speed Selection) • Màn hình hiện thị led màu sáng trắng LEDCOLOR_TD_T) • Hiện thị cảnh báo lọc đầy (Filter full indicator) • Hiện thị tank nước đầy (Water tank full indicator) • Cảnh báo cần làm sạch bình ngưng (Condenser cleaning indicator) • Thời lượng chương trình (phút) - Đầy tải: 208 • Thời lượng chương trình (phút) - Tải một phần: 116 • Thời lượng chương trình (phút) - Tải trọng 70%: 155 • ","desc":"MÁY SẤY KAFF KF-DR113L09BL • Máy sấy cửa trước hiện đại lồng ngang • 15 chương trình sấy tự động tích hợp (Cotton Extra Dry, Cotton Cupboard Dry, Cotton Iron Dry, Synthetics Cupboard Dry, Synthetics Iron Dry, Delicate, Mix, Baby Care, Towels,Hygiene, Outdoor, Time drying, Refresh, Express, Shirts, Duvet, Sport, Wool refresh) • Khối lượng sấy khô 9 Kg • Công nghệ sấy cưỡng bức trực tiếp hiện đại - HEAT PUMP A++ (AL) • Lồng sấy inox, thân sơn tĩnh điện màu đen cao cấp • Chức năng diệt khuẩn an toàn UVC_TD • Motor Pump và máy nén Compressor motor kiểu PSC hoạt động đảo chiều, không sử dụng chổi than EcoSilence Drive giúp máy sấy hoạt động với đồ ồn thấp và bền bỉ - tiết kiệm năng lượng • Hệ thống cảm biến sấy an toàn Sensor Drying System • Đảo chiều lồng quay lúc sấy giúp sấy đồ khô nhanh hơn, hiệu quả hơn (Two Way Tumbling) • Điều khiển điện tử (Control system Electronic) • Hệ thống phát hiện lỗi khi sử dụng (Failure Detection System) • Khóa trẻ em an toàn (Child lock) • Hiện thị chu trình sấy (Drying cycle indicator) • Chức năng hẹn giờ lên đến 1-23h (Delay time adjustment via button) • Điều chỉnh cường độ sấy (Drying level adjustment via button) • Điều chỉnh chương trình sấy (Drying Target) • Điều chỉnh tốc độ sấy (Spin Speed Selection) • Màn hình hiện thị led màu sáng trắng LEDCOLOR_TD_T) • Hiện thị cảnh báo lọc đầy (Filter full indicator) • Hiện thị tank nước đầy (Water tank full indicator) • Cảnh báo cần làm sạch bình ngưng (Condenser cleaning indicator) • Thời lượng chương trình (phút) - Đầy tải: 208 • Thời lượng chương trình (phút) - Tải một phần: 116 • Thời lượng chương trình (phút) - Tải trọng 70%: 155 • ","specs":{"Tiêu thụ năng lượng ở mức tải một phần (kWh/chu kỳ)":"1.19 • Tiêu thụ năng lượng ở mức đầy tải (kWh/chu kỳ): 2.12 • Công suất sấy 1000W • Tiêu thụ năng lượng (kWh/năm): 259 • Tốc độ quay (RPM): 600-800-1000-1200-1400-1600 Vòng • Thời gian sấy (phút): 10 - 30 - 60 - 90 - 120 - 150 • Nút bấm chọn tính năng: + Tắt mở (On/Off) + Chức năng tạm dừng (Start/Pause) + Chức năng chống nhăn quần áo (Anti-crease) + Tín hiệu sấy (Signal) + Đèn cảnh báo (Lamp) • Tiêu chuẩn tiết kiệm năng lượng A+++ theo tiêu chuẩn Châu Âu • Hệ thống SensitiveDrying Sytem giúp quần áo thấm một luồng không khí từ mọi phía khiến quần áo được sấy khô tuyệt đối mà vẫn mềm mại • Độ ồn chỉ 65dB nhờ công nghệ chống rung AntiVibration hiện đại • Chuông báo khi quá trình sấy kết thúc, kiểm soát mọi sự cố có thể gặp cho hệ thống điện, nước và ngưng mọi hoạt động vô cùng an toàn • Nguồn điện 220V-240V/50Hz • Công suất định mức 1000W - 10A • Áp suất nước tiêu chuẩn 0.05 - 1 Mpa • Bình giữ nhiệt an toàn • Cửa máy hoạt động đóng mở bằng khóa điện từ độ mở 180 độ hiệu quả tối đa, kinh tế, bền bỉ và êm ái • Kích thước sản phầm (HxWxD) (mm): 845x596x609 • Gross Weight (Shrink) (Kg) -Glass Door: 46.8 • Gross Weight (Carton) (kg) - Glass Door: 47.8 • Bảo hành 05 năm"},"feats":[],"sku":"KF-DR113L09BL","vid":"","mod":"KF-DR113L09BL","brand":"KAFF","slug":"kf-dr113l09bl-may-say-chen-kaff-kf-dr113l09bl","_source":"vai-market-add-product","_source_url":"https://kaff.vn/san-pham/may-say-kaff-kf-dr113l09bl-4993.html","_added_at":"2026-09-04T10:18:53.515Z"},{"n":"Chậu rửa chén 1 hố Inox 304 hạn chế trầy xước kích thước 76 cm","l":"https://malloca.com/chau-rua-chen-silver-ms7743si","i":"https://bizweb.dktcdn.net/100/567/847/products/ms7743si.jpg","p":"8.250.000đ","pn":8250000,"listPn":0,"salePn":8250000,"priceMode":"both","c":"Chậu rửa","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bizweb.dktcdn.net/100/567/847/products/ms7743si.jpg","https://bizweb.dktcdn.net/100/567/847/products/ms7743gr-si-dc58b1ae-540e-4a5b-9f71-4bbdb6374acd.jpg"],"sum":"Loại sản phẩm: Chậu Rửa Chén\nLoại chậu: Lắp Nổi + Lắp âm\nChất liệu: Inox 304\nThiết kế Chậu: 1 Hố\nKích thước hố xả: 114\nPhụ kiện đi kèm: Thớt kháng khuẩn, 2 rổ Plastic ABS, bộ xả thông minh Z-Style, tiết kiệm không gian","desc":"Loại sản phẩm: Chậu Rửa Chén\nLoại chậu: Lắp Nổi + Lắp âm\nChất liệu: Inox 304\nThiết kế Chậu: 1 Hố\nKích thước hố xả: 114\nPhụ kiện đi kèm: Thớt kháng khuẩn, 2 rổ Plastic ABS, bộ xả thông minh Z-Style, tiết kiệm không gian","specs":{"Loại sản phẩm":"Chậu Rửa Chén","Loại chậu":"Lắp Nổi + Lắp âm","Chất liệu":"Inox 304","Thiết kế Chậu":"1 Hố","Kích thước hố xả":"114","Phụ kiện đi kèm":"Thớt kháng khuẩn, 2 rổ Plastic ABS, bộ xả thông minh Z-Style, tiết kiệm không gian","Chiều rộng sản phẩm (mm)":"760","Chiều sâu sản phẩm (mm)":"430","Chiều cao sản phẩm (mm)":"220","Chiều rộng mặt cắt đá - Lắp nổi (mm)":"736","Chiều sâu mặt cắt đá - Lắp nổi (mm)":"406","Bo góc mặt cắt đá - Lắp nổi (mm)":"R10","Chiều rộng mặt cắt đá - Lắp âm (mm)":"726","Chiều sâu mặt cắt đá - - Lắp âm (mm)":"396","Bo góc mặt cắt đá - Lắp âm (mm)":"R25","Chiều rộng đóng gói (mm)":"845","Chiều sâu đóng gói (mm)":"515","Chiều cao đóng gói (mm)":"280","Mã SAP":"600001525","Rổ lọc rác bằng inox tiện lợi":"Có","Lớp chống ồn và chống ngưng tụ nước dưới đáy chậu":"Có","Bộ xả thông minh ngăn mùi hiệu quả":"Có"},"feats":[],"sku":"MS7743SI","vid":"","mod":"MS7743SI","brand":"Malloca","slug":"ms7743si-chau-rua-chen-1-ho-inox-304-han-che-tray-xuoc-kich-thuoc-76-cm","_source":"vai-market-add-product","_source_url":"https://malloca.com/chau-rua-chen-silver-ms7743si","_added_at":"2026-09-04T10:18:51.980Z"},{"n":"Máy lạnh Comfee Inverter 1 HP CFS-10VDM","l":"","i":"https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614184743353.jpg","p":"Giá niêm yết: 7.990.000đ — Giá KM: 7.290.000đ","pn":7290000,"listPn":7990000,"salePn":7290000,"priceMode":"both","c":"Hàng Comfee","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614184743353.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614214520509.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614238422955.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614272015263.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614305715205.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614341281583.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614354781600.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614368977788.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614384343425.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614398103352.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614413533341.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614430290567.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614445170607.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/13-1020x570.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-1-639078868082613354-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-2-639084780546821892-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-3-639084780556232501-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-5-639084780572901080-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-99-639081358308979326-700x467.jpg"],"sum":"Máy lạnh Comfee Inverter 1 HP CFS‑10VDM mang đến giải pháp sống hiện đại với loạt tính năng AI thông minh. Công suất 1 HP lý tưởng cho phòng dưới 15m², tạo không gian mát lạnh, thoải mái và tiết kiệm điện hiệu quả.\nTích hợp nhiều tính năng AI thông minh\n-\nCông nghệ AI Frost Clean\n: đóng băng bụi bẩn và vi khuẩn ở -10ºC, sau đó rã đông và làm sạch tự động, giúp dàn lạnh luôn sạch sẽ và luồng gió thổi ra trong lành, an toàn cho sức khỏe.\n-\nChế độ Sleep Curve\n: tự động tăng hoặc giảm nhiệt độ theo từng giai đoạn giấc ngủ giúp nhiệt độ phòng luôn cân bằng với thân nhiệt, tránh lạnh buốt, tiết kiệm điện và mang lại giấc ngủ sâu, thoải mái.\n*Hình ảnh chỉ mang tính chất minh họa\n-\nCông nghệ AI Cool\n: cho phép điều khiển bật/tắt, thay đổi nhiệt độ, chuyển chế độ bằng giọng nói qua ứng dụng SmartHome.\n-\nCông nghệ AI Humidity\n: tự động điều chỉnh tốc độ quạt và công suất làm lạnh để cân bằng độ ẩm trong phòng ở mức lý tưởng từ 40% - 70%, giúp không khí luôn trong lành, mát mẻ, mang đến sự thoải mái tối đa mà không cần canh chỉnh thủ công.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nDàn lạnh\n-\nMáy lạnh một chiều\nnày của Comfee sở hữu phong cách thiết kế tối giản với dạng hình hộp chữ nhật, giúp tiết kiệm diện tích và dễ dàng lắp đặt. Toàn bộ thân máy sử dụng tông màu trắng trang nhã, mang lại cảm giác sạch sẽ và hài hòa với đa dạng phong cách nội thất, từ hiện đại đến tối giản.\n- Mặt trước tích hợp\nđèn LED hiển thị nhiệt độ\nrõ ràng, giúp người dùng dễ dàng theo dõi và điều chỉnh ngay cả trong điều kiện thiếu sáng.\n*Hình ảnh chỉ mang tính chất minh họa\nDàn nóng\n- Dàn nóng\nmáy lạnh\nđược thiết kế với kết cấu chắc chắn, có khả năng chịu đựng tốt các tác động từ môi trường như nắng nóng, mưa ẩm hay bụi bẩn.\n- Sử dụng\nống dẫn gas bằng đồng\ngiúp tăng hiệu quả trao đổi nhiệt, từ đó hỗ trợ quá trình làm lạnh nhanh và ổn định hơn. Phần\nlá tản nhiệt bằng nhôm được phủ lớp bảo vệ Golden Coating\ngiúp hạn chế tình trạng ăn mòn, oxy hóa cũng như sự phát triển của nấm mốc, góp phần nâng cao độ bền cho thiết bị.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh 1 HP\nnày có\ncông suất làm lạnh 9.350 BTU\n, hoạt động hiệu quả cho phòng có diện tích dưới 15m² như phòng ngủ hoặc phòng làm việc nhỏ.\n- Máy được trang bị công nghệ làm lạnh hiện đại với\nchế độ Hyper Tech\n, cho phép máy nén tăng tốc nhanh đến tần số cao chỉ trong thời gian ngắn, giúp căn phòng nhanh chóng đạt mức nhiệt mong muốn. Nhờ đó, người dùng có thể cảm nhận luồng không khí mát lạnh gần như ngay sau khi khởi động, mang lại sự thoải mái tức thì.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Comfee\nnày trang bị\ncánh đảo gió lên xuống tự động\n, kết hợp\nđiều chỉnh trái phải bằng tay\ngiúp luồng khí lan tỏa linh hoạt, hơi lạnh được phân bổ đều, làm mát nhanh và hạn chế cảm giác lạnh buốt tại một vị trí.\n- Ngoài ra,\ntính năng Follow Me\ngiúp remote đo nhiệt độ ngay tại vị trí bạn đang ngồi hoặc nằm, thay vì chỉ đo ở dàn lạnh. Nhờ đó, máy sẽ tự điều chỉnh để khu vực xung quanh bạn luôn mát và dễ chịu.\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy duy trì nhiệt độ ổn định, vận hành êm ái và tiết kiệm điện năng, mang đến không gian mát mẻ và thoải mái cho cả gia đình.\n-\nCông nghệ ECO+\ntích hợp thuật toán AI giúp tiết kiệm điện năng hiệu quả nhưng vẫn đảm bảo không khí mát lạnh tối ưu.\nXem thêm:\nVì sao máy lạnh Inverter tiết kiệm hơn hẳn máy lạnh thường?\n*Hình ảnh chỉ mang tính chất minh họa\n-\nChế độ Gear+\nđược nâng cấp với 5 mức (20%, 40%, 60%, 80%, 100%), giúp bạn dễ dàng chọn công suất phù hợp với nhiệt độ phòng, vừa mang lại sự thoải mái, vừa tiết kiệm năng lượng.\n*Hình ảnh chỉ mang tính chất minh họa\nKhả năng lọc không khí\nMáy trang bị\nhệ thống lọc kép Dual Filtration\nvới khả năng loại bỏ bụi mịn, vi khuẩn, các chất độc hại và hạt siêu nhỏ gây dị ứng, đồng thời khử mùi khó chịu trong phòng. Nhờ đó, không gian sống luôn sạch sẽ, trong lành, giúp bảo vệ sức khỏe và giảm nguy cơ kích ứng hô hấp hay dị ứng.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ Hút ẩm\n: giảm độ ẩm dư thừa, mang lại không gian khô ráo, thoáng mát, bảo vệ nội thất và sức khỏe, đặc biệt hữu ích trong mùa mưa ẩm hoặc mùa nồm.\n-\nPCB phủ lớp UV\n: tăng khả năng chống ẩm, bảo vệ bo mạch và nâng cao tuổi thọ thiết bị ngay cả trong điều kiện thời tiết khắc nghiệt.\n-\nĐịnh vị thông minh\n: trong bán kính 15 km, bạn có thể bật/tắt điều hòa hoặc thiết lập phạm vi mong muốn để Comfee chủ động làm mát phòng trước khi bạn trở về nhà.\n- Thiết bị\nhỗ trợ kết nối linh hoạt\nvới nhiều thiết bị thông minh như máy tính bảng, đồng hồ,…đồng thời tương thích với các trợ lý ảo phổ biến như Google Assistant, Apple HomeKit và Maika Assistant, giúp bạn điều khiển từ xa hoặc sử dụng giọng nói tiếng Việt dễ dàng. Ngoài ra, máy còn cho phép chia sẻ quyền điều khiển để các thành viên trong gia đình cùng sử dụng tiện lợi hơn.\nXem thêm:\nHướng dẫn sử dụng các tính năng điều khiển bằng giọng nói trên máy lạnh Comfee\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Comfee Inverter 1 HP CFS-10VDM đáp ứng tốt nhu cầu làm mát hằng ngày cho phòng dưới 15m² nhờ khả năng vận hành êm ái và tiết kiệm điện hiệu quả. Sản phẩm tích hợp các tiện ích thông minh, mang đến trải nghiệm sử dụng tiện lợi và là lựa chọn đáng tin cậy cho lối sống hiện đại.\nXem thêm","desc":"Máy lạnh Comfee Inverter 1 HP CFS‑10VDM mang đến giải pháp sống hiện đại với loạt tính năng AI thông minh. Công suất 1 HP lý tưởng cho phòng dưới 15m², tạo không gian mát lạnh, thoải mái và tiết kiệm điện hiệu quả.\nTích hợp nhiều tính năng AI thông minh\n-\nCông nghệ AI Frost Clean\n: đóng băng bụi bẩn và vi khuẩn ở -10ºC, sau đó rã đông và làm sạch tự động, giúp dàn lạnh luôn sạch sẽ và luồng gió thổi ra trong lành, an toàn cho sức khỏe.\n-\nChế độ Sleep Curve\n: tự động tăng hoặc giảm nhiệt độ theo từng giai đoạn giấc ngủ giúp nhiệt độ phòng luôn cân bằng với thân nhiệt, tránh lạnh buốt, tiết kiệm điện và mang lại giấc ngủ sâu, thoải mái.\n*Hình ảnh chỉ mang tính chất minh họa\n-\nCông nghệ AI Cool\n: cho phép điều khiển bật/tắt, thay đổi nhiệt độ, chuyển chế độ bằng giọng nói qua ứng dụng SmartHome.\n-\nCông nghệ AI Humidity\n: tự động điều chỉnh tốc độ quạt và công suất làm lạnh để cân bằng độ ẩm trong phòng ở mức lý tưởng từ 40% - 70%, giúp không khí luôn trong lành, mát mẻ, mang đến sự thoải mái tối đa mà không cần canh chỉnh thủ công.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nDàn lạnh\n-\nMáy lạnh một chiều\nnày của Comfee sở hữu phong cách thiết kế tối giản với dạng hình hộp chữ nhật, giúp tiết kiệm diện tích và dễ dàng lắp đặt. Toàn bộ thân máy sử dụng tông màu trắng trang nhã, mang lại cảm giác sạch sẽ và hài hòa với đa dạng phong cách nội thất, từ hiện đại đến tối giản.\n- Mặt trước tích hợp\nđèn LED hiển thị nhiệt độ\nrõ ràng, giúp người dùng dễ dàng theo dõi và điều chỉnh ngay cả trong điều kiện thiếu sáng.\n*Hình ảnh chỉ mang tính chất minh họa\nDàn nóng\n- Dàn nóng\nmáy lạnh\nđược thiết kế với kết cấu chắc chắn, có khả năng chịu đựng tốt các tác động từ môi trường như nắng nóng, mưa ẩm hay bụi bẩn.\n- Sử dụng\nống dẫn gas bằng đồng\ngiúp tăng hiệu quả trao đổi nhiệt, từ đó hỗ trợ quá trình làm lạnh nhanh và ổn định hơn. Phần\nlá tản nhiệt bằng nhôm được phủ lớp bảo vệ Golden Coating\ngiúp hạn chế tình trạng ăn mòn, oxy hóa cũng như sự phát triển của nấm mốc, góp phần nâng cao độ bền cho thiết bị.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh 1 HP\nnày có\ncông suất làm lạnh 9.350 BTU\n, hoạt động hiệu quả cho phòng có diện tích dưới 15m² như phòng ngủ hoặc phòng làm việc nhỏ.\n- Máy được trang bị công nghệ làm lạnh hiện đại với\nchế độ Hyper Tech\n, cho phép máy nén tăng tốc nhanh đến tần số cao chỉ trong thời gian ngắn, giúp căn phòng nhanh chóng đạt mức nhiệt mong muốn. Nhờ đó, người dùng có thể cảm nhận luồng không khí mát lạnh gần như ngay sau khi khởi động, mang lại sự thoải mái tức thì.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Comfee\nnày trang bị\ncánh đảo gió lên xuống tự động\n, kết hợp\nđiều chỉnh trái phải bằng tay\ngiúp luồng khí lan tỏa linh hoạt, hơi lạnh được phân bổ đều, làm mát nhanh và hạn chế cảm giác lạnh buốt tại một vị trí.\n- Ngoài ra,\ntính năng Follow Me\ngiúp remote đo nhiệt độ ngay tại vị trí bạn đang ngồi hoặc nằm, thay vì chỉ đo ở dàn lạnh. Nhờ đó, máy sẽ tự điều chỉnh để khu vực xung quanh bạn luôn mát và dễ chịu.\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy duy trì nhiệt độ ổn định, vận hành êm ái và tiết kiệm điện năng, mang đến không gian mát mẻ và thoải mái cho cả gia đình.\n-\nCông nghệ ECO+\ntích hợp thuật toán AI giúp tiết kiệm điện năng hiệu quả nhưng vẫn đảm bảo không khí mát lạnh tối ưu.\nXem thêm:\nVì sao máy lạnh Inverter tiết kiệm hơn hẳn máy lạnh thường?\n*Hình ảnh chỉ mang tính chất minh họa\n-\nChế độ Gear+\nđược nâng cấp với 5 mức (20%, 40%, 60%, 80%, 100%), giúp bạn dễ dàng chọn công suất phù hợp với nhiệt độ phòng, vừa mang lại sự thoải mái, vừa tiết kiệm năng lượng.\n*Hình ảnh chỉ mang tính chất minh họa\nKhả năng lọc không khí\nMáy trang bị\nhệ thống lọc kép Dual Filtration\nvới khả năng loại bỏ bụi mịn, vi khuẩn, các chất độc hại và hạt siêu nhỏ gây dị ứng, đồng thời khử mùi khó chịu trong phòng. Nhờ đó, không gian sống luôn sạch sẽ, trong lành, giúp bảo vệ sức khỏe và giảm nguy cơ kích ứng hô hấp hay dị ứng.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ Hút ẩm\n: giảm độ ẩm dư thừa, mang lại không gian khô ráo, thoáng mát, bảo vệ nội thất và sức khỏe, đặc biệt hữu ích trong mùa mưa ẩm hoặc mùa nồm.\n-\nPCB phủ lớp UV\n: tăng khả năng chống ẩm, bảo vệ bo mạch và nâng cao tuổi thọ thiết bị ngay cả trong điều kiện thời tiết khắc nghiệt.\n-\nĐịnh vị thông minh\n: trong bán kính 15 km, bạn có thể bật/tắt điều hòa hoặc thiết lập phạm vi mong muốn để Comfee chủ động làm mát phòng trước khi bạn trở về nhà.\n- Thiết bị\nhỗ trợ kết nối linh hoạt\nvới nhiều thiết bị thông minh như máy tính bảng, đồng hồ,…đồng thời tương thích với các trợ lý ảo phổ biến như Google Assistant, Apple HomeKit và Maika Assistant, giúp bạn điều khiển từ xa hoặc sử dụng giọng nói tiếng Việt dễ dàng. Ngoài ra, máy còn cho phép chia sẻ quyền điều khiển để các thành viên trong gia đình cùng sử dụng tiện lợi hơn.\nXem thêm:\nHướng dẫn sử dụng các tính năng điều khiển bằng giọng nói trên máy lạnh Comfee\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Comfee Inverter 1 HP CFS-10VDM đáp ứng tốt nhu cầu làm mát hằng ngày cho phòng dưới 15m² nhờ khả năng vận hành êm ái và tiết kiệm điện hiệu quả. Sản phẩm tích hợp các tiện ích thông minh, mang đến trải nghiệm sử dụng tiện lợi và là lựa chọn đáng tin cậy cho lối sống hiện đại.\nXem thêm","specs":{"Loại máy":"1 chiều (chỉ làm lạnh)","Inverter":"Có Inverter","Công suất làm lạnh":"1 HP - 9.350 BTU","Phạm vi làm lạnh hiệu quả":"Dưới 15m² (từ 30 đến 45m³)","Độ ồn trung bình (được đo trong phòng thí nghiệm)":"Dàn lạnh: 40/35.5/32 dB - Dàn nóng: 51 dB","Dòng sản phẩm":"2026","Sản xuất tại":"Thái Lan","Thời gian bảo hành cục lạnh, cục nóng":"3 năm","Thời gian bảo hành máy nén":"Máy nén 5 năm","Chất liệu dàn tản nhiệt":"Ống dẫn gas bằng Đồng - Lá tản nhiệt bằng Nhôm phủ lớp chống ăn mòn Golden Coating","Loại Gas":"R-32","Tiêu thụ điện":"0.83 kWh","Nhãn năng lượng":"5 sao (Hiệu suất năng lượng 5.20)","Công nghệ tiết kiệm điện":"Eco+ Smart Inverter","Lọc bụi, kháng khuẩn, khử mùi":"Công nghệ lọc kép Dual Filtration","Chế độ gió":"Đảo gió lên xuống tự động, trái phải tùy chỉnh tay","Công nghệ làm lạnh nhanh":"Hyper Tech","Tiện ích":"Định vị vị trí thông minh - LBS Remote có đèn nền PCB với lớp phủ UV Kết nối thông minh IOT Kết nối qua ứng dụng SmartHome Cảm biến nhiệt độ Follow Me Chế độ chăm sóc giấc ngủ Sleep Curve Màn hình hiển thị nhiệt độ trên dàn lạnh Chức năng hút ẩm iECO - Quản lý điện năng tiêu thụ qua ứng dụng AI Humidity - Chế độ cân bằng độ ẩm AI Frost Clean - Chế độ làm sạch sâu Tự khởi động lại khi có điện Gear Control Công nghệ AI Cool - điều khiển bằng giọng nói","Kích thước dàn lạnh":"Dài 72.3 cm - Cao 28.6 cm - Dày 19.9 cm","Khối lượng dàn lạnh":"7.2 kg","Kích thước dàn nóng":"Dài 66.8 cm - Cao 46.9 cm - Dày 25.2 cm","Khối lượng dàn nóng":"16.9 kg","Chiều dài lắp đặt ống đồng":"Tối thiểu 3m - Tối đa 15m","Chiều cao lắp đặt tối đa giữa cục nóng-lạnh":"10m","Dòng điện vào":"Dàn nóng hoặc dàn lạnh","Dòng điện hoạt động":"1 pha","Kích thước ống đồng":"6/10","Số lượng kết nối dàn lạnh tối đa":"1","Hãng":"Comfee. Xem thông tin hãng"},"feats":["- Công nghệ AI Frost Clean : đóng băng bụi bẩn và vi khuẩn ở -10ºC, sau đó rã đông và làm sạch tự động, giúp dàn lạnh luôn sạch sẽ và luồng gió thổi ra trong lành, an toàn cho sức khỏe.","- Công nghệ AI Cool : cho phép điều khiển bật/tắt, thay đổi nhiệt độ, chuyển chế độ bằng giọng nói qua ứng dụng SmartHome.","- Mặt trước tích hợp đèn LED hiển thị nhiệt độ rõ ràng, giúp người dùng dễ dàng theo dõi và điều chỉnh ngay cả trong điều kiện thiếu sáng.","- Dàn nóng máy lạnh được thiết kế với kết cấu chắc chắn, có khả năng chịu đựng tốt các tác động từ môi trường như nắng nóng, mưa ẩm hay bụi bẩn.","- Máy lạnh 1 HP này có công suất làm lạnh 9.350 BTU , hoạt động hiệu quả cho phòng có diện tích dưới 15m² như phòng ngủ hoặc phòng làm việc nhỏ.","Xem thêm: Tổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng","- Ngoài ra, tính năng Follow Me giúp remote đo nhiệt độ ngay tại vị trí bạn đang ngồi hoặc nằm, thay vì chỉ đo ở dàn lạnh. Nhờ đó, máy sẽ tự điều chỉnh để khu vực xung quanh bạn luôn mát và dễ chịu.","- Công nghệ Inverter giúp máy duy trì nhiệt độ ổn định, vận hành êm ái và tiết kiệm điện năng, mang đến không gian mát mẻ và thoải mái cho cả gia đình.","- Công nghệ ECO+ tích hợp thuật toán AI giúp tiết kiệm điện năng hiệu quả nhưng vẫn đảm bảo không khí mát lạnh tối ưu.","Xem thêm: Vì sao máy lạnh Inverter tiết kiệm hơn hẳn máy lạnh thường?","- Chế độ Gear+ được nâng cấp với 5 mức (20%, 40%, 60%, 80%, 100%), giúp bạn dễ dàng chọn công suất phù hợp với nhiệt độ phòng, vừa mang lại sự thoải mái, vừa tiết kiệm năng lượng.","- Chế độ Hút ẩm : giảm độ ẩm dư thừa, mang lại không gian khô ráo, thoáng mát, bảo vệ nội thất và sức khỏe, đặc biệt hữu ích trong mùa mưa ẩm hoặc mùa nồm."],"sku":"363374","vid":"","mod":"363374","brand":"Comfee","slug":"363374-may-lanh-comfee-inverter-1-hp-cfs-10vdm","_source":"vai-market-add-product","_source_url":"","_added_at":"2026-09-04T10:18:49.722Z"},{"n":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","l":"","i":"https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806-700x467.jpg","p":"Giá niêm yết: 10.990.000đ — Giá KM: 6.490.000đ","pn":6490000,"listPn":10990000,"salePn":6490000,"priceMode":"both","c":"Máy giặt / sấy","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-638963804276138450-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-638963804285992497-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-99-638962219298592474-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-5-639063368977740536.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-639063369030108820.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-639063369065311055.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-639063369104866518.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-4-639063369150311821.jpg"],"sum":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","desc":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","specs":{"Loại máy giặt":"Cửa trước","Lồng giặt":"Lồng ngang","Khối lượng giặt":"10.5 Kg","Số người sử dụng":"Trên 7 người","Kiểu động cơ":"Truyền động gián tiếp (dây Curoa)","Tốc độ quay vắt tối đa":"1400 vòng/phút","Chất liệu lồng giặt":"Inox","Chất liệu vỏ máy":"Kim loại sơn tĩnh điện","Chất liệu cửa máy":"Nhựa","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2025","Thời gian bảo hành động cơ":"10 năm","Hiệu suất sử dụng điện":"5.7 Wh/kg","Loại Inverter":"Công nghệ Inverter","Chương trình":"Đồ màu Vải mỏng Đồ trẻ em Đồ lót Đồ len Đồ hỗn hợp Đồ cotton Đồ Jeans Áo sơ mi Xả + vắt Vệ sinh lồng giặt Vắt Giặt vệ sinh Giặt tiết kiệm Giặt nhanh Giặt chăn bông","Công nghệ giặt":"Giặt nước nóng Giặt hơi nước","Bảng điều khiển":"Song ngữ Anh - Việt có núm xoay, cảm ứng và màn hình hiển thị","Tiện ích":"Vệ sinh lồng giặt Khóa trẻ em Hẹn giờ giặt Chống nhăn Chỉnh số vòng vắt Chỉnh nhiệt độ nước","Kích thước - Khối lượng":"Cao 85 cm - Ngang 60 cm - Sâu 63.5 cm - Nặng 70 kg","Chiều dài ống cấp nước":"110 cm","Chiều dài ống thoát nước":"180 cm","Hãng":"Hitachi. Xem thông tin hãng"},"feats":["Thiết bị sử dụng kiểu động cơ gián tiếp truyền động dây curoa nên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.","Tiện ích giặt chống nhăn được thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.","Hẹn giờ giặt giúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.","Tùy chỉnh số vòng vắt, nhiệt độ nước cho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.","Vệ sinh lồng giặt bằng nước nóng giúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt."],"sku":"357869","vid":"","mod":"357869","brand":"Hitachi","slug":"357869-may-giat-hitachi-inverter-10-5-kg-bd-1054hvow","_source":"vai-market-add-product","_source_url":"","_added_at":"2026-09-04T10:18:43.947Z"},{"n":"Chậu 1 Hố Mạ Nano BN7546","l":"","i":"https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-1-ho-ma-nano.webp","p":"7.950.000đ","pn":7950000,"listPn":7950000,"salePn":7950000,"priceMode":"list","c":"Chậu rửa bát","cs":"san-pham-them-moi","ci":"fa-box","imgs":["https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-1-ho-ma-nano.webp"],"sum":"Trong thiết kế gian bếp hiện đại, việc lựa chọn một chiếc chậu rửa phù hợp đóng vai trò quan trọng để đảm bảo công năng và tính thẩm mỹ. Chậu 1 hố mạ nano được xem là sự lựa chọn hoàn hảo nhờ đặc tính bền bỉ, thiết kế đẹp và nhiều tính năng đi kèm. Hãy cùng tìm hiểu về những điểm nổi bật của chậu 1 hố mạ nano qua bài viết sau.\nChất liệu Inox 304 Mạ Nano – Bảo Chứng Chất Lượng Chất liệu inox 304 mạ nano của Boss được sử dụng cho chậu 1 hố không chỉ mang lại tính thẩm mỹ cao mà còn đảm bảo độ bền bỉ trước tác nhân oxy hóa, rỉ sét. Lớp mạ nano giúp gia tăng khả năng chống bám bẩn, dễ dàng lau chùi và giữ cho bề mặt chậu luôn sáng bóng như mới.\nKèm Phụ Kiện Tiện Ích Mỗi bộ chậu 1 hố mạ nano đều được trang bị đầy đủ các phụ kiện cao cấp, bao gồm:\nThớt chậu nhỏ : Giúp người dùng tiết kiệm diện tích khi chuẩn bị thức phẩm. Rổ nhỏ : Tiên lợi cho việc rửa rau, hoa quả hay để nước thoát nhanh hơn. Nhờ những phụ kiện đi kèm, chậu 1 hố mạ nano không chỉ đem lại sự tiên nghi mà còn góp phần giãm bớt gánh nặng trong công việc bếp núc.\nĐặc Điểm Kỹ Thuật Vượt Trội Chậu 1 hố mạ nano được thiết kế để phù hợp với nhiều nhu cầu khác nhau. Hai mã sản phẩm phổ biến nhất là BN7546 và BN7848.\n1. Mã BN7546 Kích thước khoét đá: 42 x 72 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm 2. Mã BN7848 Kích thước khoét đá: 47 x 75.5 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm Với độ dày viền đạt 3.0 mm và thùng 1.0 mm, chậu 1 hố mạ nano bảo đảm tính chắc chắn, chống biến dạng trong quá trình sử dụng. Kích thước linh hoạt có thể đầu vừa với nhiều loại bếp từ truyền thống đến hiện đại.\nThiết Kế Hiện Đại – Tính Đa Năng Thiết kế của chậu 1 hố mạ nano được đánh giá cao nhờ tính đơn giản mà tính tế. Tất cả các chi tiết đều được gia công kỹ lưỡng, đáp ứng được các tiêu chuẩn cao nhất trong thiết kế nội thất.\nChậu 1 hố mạ nano\nKhông chỉ phù hợp cho những căn bếp hiện đại, chậu 1 hố còn mang lại khả năng đa dụng, tực hợp nhiều phụ kiện để đáp ứng nhu cầu của từng gia đình.\nLý Do Nên Chọn Chậu 1 Hố Mạ Nano 1. Bền Bỉ Vượt Trội Inox 304 là chất liệu nổi tiếng với độ bền bỉ, khả năng chống oxy hóa cao và không bị ảnh hưởng bởi các chất tẩy rửa mành.\n2. Tính Năng Chống Bám Bẩn Lớp mạ nano giúp dễ dàng lau chùi, ngăn ngừa vi khuẩn và bảo vệ an toàn sức khỏe cho gia đình.\n3. Thiết Kế Linh Hoạt Kích thước đa dạng phù hợp với nhiều loại bếp, từ bếp truyền thống đến hiện đại.\n4. Phụ Kiện Đi Kèm Với thớt chậu và rổ nhỏ, sản phẩm cung cấp đầy đủ tiên nghi cho gian bếp.\nHướng Dẫn Lắp Đặt Chậu 1 Hố Mạ Nano Đọc kỹ hướng dẫn sử dụng và bản vẽ kèm theo. Đo và đánh dấu vị trí khoét đá phù hợp: BN7546: 42 x 72 cm BN7848: 47 x 75.5 cm Lắp chậu và kết nối đáy tháo nước đảm bảo khít chặt. Hoàn thiện bằng cách làm sạch bặng vải mềm. Chậu 1 hố mạ nano không chỉ là một sản phẩm cao cấp với nhiều tính năng tiện ích mà còn mang lại tính thẩm mỹ và bền bỉ cho gian bếp của bạn. Với chất liệu inox 304, thiết kế độc đáo và phụ kiện đi kèm, sản phẩm này xứng đáng là một trong những lựa chọn tốt nhất cho bất kỳ gia đình nào","desc":"Trong thiết kế gian bếp hiện đại, việc lựa chọn một chiếc chậu rửa phù hợp đóng vai trò quan trọng để đảm bảo công năng và tính thẩm mỹ. Chậu 1 hố mạ nano được xem là sự lựa chọn hoàn hảo nhờ đặc tính bền bỉ, thiết kế đẹp và nhiều tính năng đi kèm. Hãy cùng tìm hiểu về những điểm nổi bật của chậu 1 hố mạ nano qua bài viết sau.\nChất liệu Inox 304 Mạ Nano – Bảo Chứng Chất Lượng Chất liệu inox 304 mạ nano của Boss được sử dụng cho chậu 1 hố không chỉ mang lại tính thẩm mỹ cao mà còn đảm bảo độ bền bỉ trước tác nhân oxy hóa, rỉ sét. Lớp mạ nano giúp gia tăng khả năng chống bám bẩn, dễ dàng lau chùi và giữ cho bề mặt chậu luôn sáng bóng như mới.\nKèm Phụ Kiện Tiện Ích Mỗi bộ chậu 1 hố mạ nano đều được trang bị đầy đủ các phụ kiện cao cấp, bao gồm:\nThớt chậu nhỏ : Giúp người dùng tiết kiệm diện tích khi chuẩn bị thức phẩm. Rổ nhỏ : Tiên lợi cho việc rửa rau, hoa quả hay để nước thoát nhanh hơn. Nhờ những phụ kiện đi kèm, chậu 1 hố mạ nano không chỉ đem lại sự tiên nghi mà còn góp phần giãm bớt gánh nặng trong công việc bếp núc.\nĐặc Điểm Kỹ Thuật Vượt Trội Chậu 1 hố mạ nano được thiết kế để phù hợp với nhiều nhu cầu khác nhau. Hai mã sản phẩm phổ biến nhất là BN7546 và BN7848.\n1. Mã BN7546 Kích thước khoét đá: 42 x 72 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm 2. Mã BN7848 Kích thước khoét đá: 47 x 75.5 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm Với độ dày viền đạt 3.0 mm và thùng 1.0 mm, chậu 1 hố mạ nano bảo đảm tính chắc chắn, chống biến dạng trong quá trình sử dụng. Kích thước linh hoạt có thể đầu vừa với nhiều loại bếp từ truyền thống đến hiện đại.\nThiết Kế Hiện Đại – Tính Đa Năng Thiết kế của chậu 1 hố mạ nano được đánh giá cao nhờ tính đơn giản mà tính tế. Tất cả các chi tiết đều được gia công kỹ lưỡng, đáp ứng được các tiêu chuẩn cao nhất trong thiết kế nội thất.\nChậu 1 hố mạ nano\nKhông chỉ phù hợp cho những căn bếp hiện đại, chậu 1 hố còn mang lại khả năng đa dụng, tực hợp nhiều phụ kiện để đáp ứng nhu cầu của từng gia đình.\nLý Do Nên Chọn Chậu 1 Hố Mạ Nano 1. Bền Bỉ Vượt Trội Inox 304 là chất liệu nổi tiếng với độ bền bỉ, khả năng chống oxy hóa cao và không bị ảnh hưởng bởi các chất tẩy rửa mành.\n2. Tính Năng Chống Bám Bẩn Lớp mạ nano giúp dễ dàng lau chùi, ngăn ngừa vi khuẩn và bảo vệ an toàn sức khỏe cho gia đình.\n3. Thiết Kế Linh Hoạt Kích thước đa dạng phù hợp với nhiều loại bếp, từ bếp truyền thống đến hiện đại.\n4. Phụ Kiện Đi Kèm Với thớt chậu và rổ nhỏ, sản phẩm cung cấp đầy đủ tiên nghi cho gian bếp.\nHướng Dẫn Lắp Đặt Chậu 1 Hố Mạ Nano Đọc kỹ hướng dẫn sử dụng và bản vẽ kèm theo. Đo và đánh dấu vị trí khoét đá phù hợp: BN7546: 42 x 72 cm BN7848: 47 x 75.5 cm Lắp chậu và kết nối đáy tháo nước đảm bảo khít chặt. Hoàn thiện bằng cách làm sạch bặng vải mềm. Chậu 1 hố mạ nano không chỉ là một sản phẩm cao cấp với nhiều tính năng tiện ích mà còn mang lại tính thẩm mỹ và bền bỉ cho gian bếp của bạn. Với chất liệu inox 304, thiết kế độc đáo và phụ kiện đi kèm, sản phẩm này xứng đáng là một trong những lựa chọn tốt nhất cho bất kỳ gia đình nào","specs":{"Kích thước (mã BN7546)":"Kích thước khoét đá 42 x 72 cm."},"feats":["Chất liệu cao cấp: Chậu được làm từ inox 304 mạ nano, bền bỉ và chống gỉ sét, phù hợp với mọi không gian bếp hiện đại.","Thiết kế chắc chắn: Độ dày viền 3.0mm và thùng chậu 1.0mm đảm bảo độ bền và khả năng chịu lực cao.","Phụ kiện đi kèm tiện ích: Bao gồm thớt chậu nhỏ và rổ nhỏ, hỗ trợ tối đa trong quá trình sử dụng.","Dễ dàng lắp đặt và vệ sinh: Thiết kế tối ưu hóa tiện ích và đảm bảo vệ sinh tuyệt đối trong không gian bếp"],"sku":"BN7546","vid":"","mod":"BN7546","brand":"Boss","slug":"bn7546-chau-1-ho-ma-nano-bn7546","_source":"vai-market-add-product","_source_url":"","_added_at":"2026-09-04T10:18:39.550Z"},{"n":"Bộ nồi chảo Inox cán rời (OMNI SA424)","l":"","i":"","p":"4.320.000đ","pn":4320000,"listPn":4320000,"salePn":4320000,"priceMode":"list","c":"Nồi chảo inox","cs":"san-pham-them-moi","ci":"fa-box","imgs":[],"sum":"Bộ nồi chảo Inox 304 cán rời, đáy 3 lớp. Tay cầm tháo rời. Sản phẩm mới catalogue Malloca 2026.","sku":"OMNISA424","mod":"OMNI SA424","brand":"Malloca","slug":"bo-noi-chao-inox-can-roi-omni-sa424","_source":"manual_admin_price","_added_at":"2026-09-04T00:25:15"}] \ No newline at end of file diff --git a/public/catalogue/promos.json b/public/catalogue/promos.json deleted file mode 100644 index efa36fb2ed303adb22ea5f9d88e3604d400aceb9..0000000000000000000000000000000000000000 --- a/public/catalogue/promos.json +++ /dev/null @@ -1 +0,0 @@ -{"productEdits":{"283212":{"name":"Lò vi sóng Toshiba MWP-MM20P(BK) 20 lít","description":"Lò vi sóng\nToshiba MWP-MM20P(BK) 20 lít công suất 700W mạnh mẽ, trang bị chuông báo sau khi nấu xong, tiện lợi với chức năng rã đông, hâm nóng,...\nCông suất - Dung tích - Chức năng chính\n- Mẫu\nlò vi sóng Toshiba\nnày có công suất 700W hoạt động ổn định.\n-\nDung tích 20 lít\ncó thể bỏ vừa gà nguyên con khoảng 1 kg.\n- Chức năng chính: rã đông, hâm nóng.\nThiết kế của sản phẩm\n- Khoang lò làm bằng thép phủ sơn chống dính, an toàn cho sức khoẻ và dễ lau chùi.\n- Bảng điều khiển bằng nút vặn dễ tuỳ chỉnh mức công suất, nhiệt độ, dễ dàng sử dụng với ngôn ngữ tiếng Việt - Anh.\nTiện ích - Phụ kiện\n- Hẹn giờ tối đa 35 phút, có thể chủ động thời gian hâm nóng hoặc rã đông, giúp thức ăn không bị cháy khét hay khô.\n- Lò có trang bị\nchuông báo sau khi nấu xong\n, không lo để quên thức ăn trong lò.\n- Khoang lò có đèn giúp chiếu sáng bên trong lò vi sóng.\n- Đi kèm phụ kiện: đĩa xoay và vòng xoay.\nLưu ý sử dụng\n- Không dùng chung ổ điện với các thiết bị khác.\n- Để thêm một cốc nước khi hâm nóng thức ăn khô.\n- Không sử dụng đồ đựng thức ăn bằng kim loại trong lò vi sóng.\nXem thêm:\n13 thứ tuyệt đối không được cho vào lò vi sóng\n.\n- Rút điện trước khi vệ sinh khoang lò, không dùng các chất tẩy rửa mạnh để vệ sinh.\n- Không sử dụng lò vi sóng có cửa bị hỏng hoặc đóng không khít.\nLò vi sóng Toshiba MWP-MM20P(BK) 20 lít\nvới công suất 700W, đáp ứng đủ các nhu cầu làm nóng thức ăn của gia đình, lò còn có chức năng rã đông thuận tiện. Lò có thể tuỳ chỉnh nhiệt độ bằng nút vặn đơn giản, khoang lò bằng thép phủ sơn chống dính bền bỉ,... Nhìn chung, đây là một thiết bị gia dụng không thể thiếu trong gian bếp của mỗi gia đình.\nXem thêm","priceNum":1690000,"listPn":1990000,"salePn":1690000,"priceMode":"both","image":"https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit---1--1020x570.jpg","images":["https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit---1--1020x570.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit--(2).jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/toshiba-mwp-mm20p-bk-20-lit-chat-lieu-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/Slider/vi-vn-toshiba-mwp-mm20p-bk-20-lit--(4).jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-2.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-3.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-4.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-5.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-6.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-7.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-8.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-10.jpg","https://cdn.tgdd.vn/Products/Images/1987/283212/toshiba-mwp-mm20p-bk-20-lit-9.jpg"],"specs":{"Loại lò":"Lò vi sóng không nướng","Dung tích":"20 lít","Công suất vi sóng":"700W","Chất liệu khoang lò":"Thép phủ sơn chống dính","Thương hiệu của":"Nhật Bản","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2022","Chức năng chính":"Rã đông, hâm","Ngôn ngữ":"Tiếng Việt Tiếng Anh","Bảng điều khiển":"Nút vặn","Tiện ích":"Chuông báo khi nấu xong Hẹn giờ lên tới 35 phút Khoang lò có đèn","Kích thước - Khối lượng":"Ngang 43.4 cm - Cao 25.8 cm - Sâu 35 cm - Nặng 11 kg","Kích thước khoang lò":"Ngang 27.5 cm - Cao 17.4 cm - Sâu 29.5 cm","Hãng":"Toshiba. Xem thông tin hãng"},"features":["Lò vi sóng Toshiba MWP-MM20P(BK) 20 lít công suất 700W mạnh mẽ, trang bị chuông báo sau khi nấu xong, tiện lợi với chức năng rã đông, hâm nóng,...","- Mẫu lò vi sóng Toshiba này có công suất 700W hoạt động ổn định.","- Dung tích 20 lít có thể bỏ vừa gà nguyên con khoảng 1 kg.","- Chức năng chính: rã đông, hâm nóng.","- Khoang lò làm bằng thép phủ sơn chống dính, an toàn cho sức khoẻ và dễ lau chùi.","- Bảng điều khiển bằng nút vặn dễ tuỳ chỉnh mức công suất, nhiệt độ, dễ dàng sử dụng với ngôn ngữ tiếng Việt - Anh.","- Hẹn giờ tối đa 35 phút, có thể chủ động thời gian hâm nóng hoặc rã đông, giúp thức ăn không bị cháy khét hay khô.","- Lò có trang bị chuông báo sau khi nấu xong , không lo để quên thức ăn trong lò.","- Khoang lò có đèn giúp chiếu sáng bên trong lò vi sóng.","- Đi kèm phụ kiện: đĩa xoay và vòng xoay.","- Không dùng chung ổ điện với các thiết bị khác.","- Để thêm một cốc nước khi hâm nóng thức ăn khô."],"model":"283212","brand":"vi sóng Toshiba","category":"Lò vi sóng","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"283212-lo-vi-song-toshiba-mwp-mm20p-bk-20-lit","_addedBy":"vai-add-product"},"303204":{"name":"Kệ xoong bản bắt mặt hộc inox 304 - Phụ kiện tủ bếp Higold","description":"Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303204 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303204. Đây là kệ đựng xoong nồi bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm và kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu HIGOLD.\nKệ Xoong Bản được sản xuất theo công nghệ tiên tiến của Đức, đạt tiêu chuẩn chất lượng cao của Châu Âu. Thiết kế của sản phẩm hoàn toàn phù hợp với các loại bếp hiện đại.\nĐiểm nổi bật của Kệ Xoong Bản là các tính năng thông minh giúp sắp xếp gọn gàng các đồ dùng nhà bếp như xoong, nồi, chảo, ấm đun,… ngăn nắp trong hộc tủ. Kệ được trang bị hệ thống ray trượt giảm chấn êm ái, kéo rút nhẹ nhàng.\nKệ Xoong Bản có tác dụng bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều lựa chọn kích thước khác nhau.\nKệ Xoong Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng các vật dụng nhà bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian và là điểm nhấn cho một không gian bếp hoàn hảo.\n","priceNum":2960000,"listPn":0,"salePn":2960000,"priceMode":"both","image":"https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303201.jpg","images":["https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303201.jpg"],"specs":{},"features":["Kệ Xoong Nồi Dạng Bản Inox 304 (303211 – 600mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303311 – 600mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303312 – 700mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303313 – 800mm) – Higold","Kệ Chén Dĩa Dạng Bản Inox 304 (303314 – 900mm) – Higold"],"model":"303204","brand":"Higold","category":"Kệ xoong nồi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"303204-ke-xoong-ban-bat-mat-hoc-inox-304-phu-kien-tu-bep-higold","_addedBy":"vai-add-product"},"303304":{"name":"Kệ chén dĩa bản bắt mặt hộc inox 304 - Phụ kiện tủ bếp Higold 303304","description":"Kệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 (303304 – 900mm) – Higold là sản phẩm thông minh của HIGOLD, sở hữu mã sản phẩm 303304. Đây là kệ để chén đĩa bằng chất liệu inox 304 cao cấp, có kích thước 870 x 425 x 170mm, kích thước phủ bì 900mm. Đây là sản phẩm thuộc  Kệ Chén – Xoong Nồi của thương hiệu.\nKệ Chén Dĩa Bản được sản xuất theo công nghệ hiện đại của Đức, đạt tiêu chuẩn chất lượng Châu Âu. Thiết kế của sản phẩm phù hợp với mọi loại bếp hiện đại.\nĐiểm nổi bật của sản phẩm là các công năng thông minh giúp sắp xếp chén đĩa, đũa muỗng,… ngăn nắp trong hộc tủ. Kệ còn được trang bị hệ thống ray trượt giảm chấn êm ái, đẩy kệ ra vào rất nhẹ nhàng.\nKệ Chén Dĩa Bản giúp bảo vệ các vật dụng bên trong tủ, tránh va đập mạnh và côn trùng làm bẩn. Sản phẩm đem lại sự ngăn nắp, gọn gàng cho không gian bếp với nhiều kích thước đa dạng.\nKệ Chén Dĩa Bản Bắt Mặt Hộc Inox 304 là sản phẩm lý tưởng để sắp xếp gọn gàng đồ đạc trong tủ bếp. Sản phẩm đem lại sự tiện nghi, tối ưu không gian lưu trữ và là điểm nhấn cho một không gian bếp hoàn hảo.\n","priceNum":4140000,"listPn":0,"salePn":4140000,"priceMode":"both","image":"https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303301.jpg","images":["https://phukienbepthanhdat.com/wp-content/uploads/2024/02/303301.jpg"],"specs":{},"features":["Kệ Chén Dĩa Dạng Bản Inox 304 (303311 – 600mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303201 – 600mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303202 – 700mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303203 – 800mm) – Higold","Kệ Xoong Bản Bắt Mặt Hộc Inox 304 (303204 – 900mm) – Higold"],"model":"303304","brand":"Higold","category":"Kệ chén dĩa","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"303304-ke-chen-dia-ban-bat-mat-hoc-inox-304-phu-kien-tu-bep-higold-303304","_addedBy":"vai-add-product"},"334018":{"name":"Máy lạnh Casper Inverter 1 HP QC-09IU36A","description":"Máy lạnh Casper Inverter 1 HP QC-09IU36A\nlà lựa chọn lý tưởng cho các không gian dưới 15m² như phòng ngủ, phòng làm việc cá nhân hoặc cửa hàng nhỏ. Với công suất 9.500 BTU, sản phẩm tích hợp công nghệ Inverter tiết kiệm điện, chế độ Turbo làm lạnh nhanh, c\nùng các tính năng như Silk Air, BabyCare mang đến trải nghiệm làm mát dễ chịu, tiết kiệm năng lượng và bảo vệ sức khỏe người dùng.\nThiết kế\nDàn lạnh\n-\nMáy lạnh Casper\nsở hữu thiết kế treo tường hiện đại, tiết kiệm không gian, kết hợp với gam màu trắng thanh lịch giúp sản phẩm dễ dàng hài hòa với nhiều phong cách nội thất.\n- Điểm nhấn độc đáo của thiết kế này là\nmàn hình LED hiển thị nhiệt độ\ntrực quan giúp người dùng dễ dàng quan sát và điều chỉnh vào ban đêm.\nDàn nóng\n- Dàn nóng được trang bị hệ thống\nống dẫn gas bằng đồng mạ vàng, lá tản nhiệt bằng nhôm mạ vàng\nđảm bảo hiệu quả làm lạnh, tăng độ bền cho thiết bị chống chịu trước thời tiết ẩm ướt, sương muối,...\n- Thiết bị sử dụng\ngas R32\nthân thiện với môi trường đồng thời đảm bảo hiệu suất làm lạnh.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh Casper 1 HP\nhoạt động với công suất\n9.500 BTU\n, phù hợp lắp đặt trong không gian vừa phải có diện tích\ndưới 15m².\nVì vậy, thiết bị có thể ứng dụng tại nhiều vị trí trong gia đình như phòng ngủ, phòng đọc sách, phòng quần áo,...\n- Nhờ\ncông nghệ Turbo\nmáy lạnh được trang bị máy nén công nghệ cao, giúp nhiệt độ phòng có thể giảm xuống thấp trong thời gian ngắn, nhanh chóng mang lại không gian mát lạnh và thoải mái cho người dùng.\n-\nCông nghệ Silk Air\nkhuếch tán không khí mát thông qua hàng ngàn lỗ khí siêu nhỏ, tạo luồng khí mềm mại, nhẹ nhàng, không gây buốt lạnh, phù hợp với người lớn tuổi và trẻ nhỏ\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Casper Inverter\ncó chế độ thổi gió được thiết kế\nlên xuống tự động\n, giúp luồng khí lạnh luân chuyển đồng đều khắp không gian, đảm bảo mọi vị trí trong phòng đều được làm mát.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy nén hoạt động linh hoạt theo nhiệt độ phòng, giảm dao động công suất không cần thiết - từ đó tiết kiệm điện hiệu quả và kéo dài tuổi thọ máy.\n-\nChế độ i-Save\ntối ưu hóa đường cong nhiệt độ khi làm lạnh, cho phép máy hoạt động ổn định ở mức năng lượng thấp mà vẫn duy trì cảm giác mát mẻ.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ BabyCare\nđiều chỉnh nhiệt độ nhẹ nhàng, duy trì không gian dễ chịu mà không gây lạnh đột ngột, phù hợp cho gia đình có trẻ em hoặc người cao tuổi.\n-\nCảm biến nhiệt độ thông minh I Feel\nsử dụng cảm biến để đo nhiệt độ tại vị trí người dùng, giúp\nmáy lạnh\nđiều chỉnh chính xác mức nhiệt độ phù hợp với khu vực bạn đang ngồi.\n-\nTự khởi động lại khi có điện\n, giữ nguyên chế độ hoạt động trước khi bị ngắt điện.\n-\nKhóa remote điều khiển\n, đảm bảo an toàn khi sử dụng trong gia đình có trẻ nhỏ.\n-\nCơ chế bảo vệ an toàn kép thông minh\n, phát hiện rò rỉ đảm bảo an toàn tuyệt đối khi sử dụng.\n-\nHẹn giờ bật, tắt máy\nlinh hoạt, phù hợp với lịch trình sinh hoạt của người dùng.\n-\nChức năng\niClean tự động làm sạch dàn lạnh\nngăn ngừa sự hình thành vi khuẩn, nấm mốc phát triển, bảo vệ sức khỏe người dùng và duy trì hiệu suất làm lạnh ổn định lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Casper Inverter 1 HP QC-09IU36A là lựa chọn hoàn hảo cho không gian nhỏ dưới 15m², mang đến khả năng làm lạnh nhanh, tiết kiệm điện và vận hành êm ái. Với các công nghệ hiện đại như Inverter, Silk Air, chế độ BabyCare và iClean, sản phẩm không chỉ đáp ứng nhu cầu làm mát mà còn bảo vệ sức khỏe và nâng cao chất lượng cuộc sống cho người dùng.\nXem thêm","priceNum":7590000,"listPn":8990000,"salePn":7590000,"priceMode":"both","image":"https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/334018-1920x1080.jpg","images":["https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/334018-1920x1080.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/1-1020x570-1.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/2-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/slider-1060x570-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/4-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/5-1020x570.jpg","https://cdn.tgdd.vn/Products/Images/2002/334018/Slider/6-1020x570.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-1-638731575388494403.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-2-638731575401986689.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-3-638731575409037186.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-4-638731575419946302.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-5-638731575428692989.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-6-638731575439056769.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-7-638733153596915551.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-8-638731575460525267.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/334018/may-lanh-casper-inverter-1-hp-qc-09iu36a-9-638731575469259491.jpg"],"specs":{"Loại máy":"1 chiều (chỉ làm lạnh)","Inverter":"Có Inverter","Công suất làm lạnh":"1 HP - 9.500 BTU","Phạm vi làm lạnh hiệu quả":"Dưới 15m² (từ 30 đến 45m³)","Độ ồn trung bình (được đo trong phòng thí nghiệm)":"Dàn lạnh: 36 dB - Dàn nóng: 52 dB","Dòng sản phẩm":"2025","Sản xuất tại":"Thái Lan","Thời gian bảo hành cục lạnh, cục nóng":"3 năm","Thời gian bảo hành máy nén":"Máy nén 12 năm","Chất liệu dàn tản nhiệt":"Ống dẫn gas bằng Đồng mạ vàng - Lá tản nhiệt bằng Nhôm mạ vàng","Loại Gas":"R-32","Tiêu thụ điện":"1.03 kWh","Nhãn năng lượng":"3 sao (Hiệu suất năng lượng 4.27)","Công nghệ tiết kiệm điện":"Inverter Công nghệ I-Save","Chế độ gió":"Đảo gió lên xuống tự động","Công nghệ làm lạnh nhanh":"Turbo","Tiện ích":"Thiết kế thông minh EasyCare dễ dàng lắp đặt Khóa remote điều khiển Cảm biến nhiệt độ I Feel Cơ chế bảo vệ an toàn kép phát hiện rò rỉ thông minh Chức năng tự động làm sạch iClean Chức năng tự làm sạch dàn lạnh Chế độ ngủ đêm Sleep cho người già, trẻ nhỏ Chế độ BabyCare Màn hình hiển thị nhiệt độ trên dàn lạnh Hẹn giờ bật, tắt máy Tự khởi động lại khi có điện Công nghệ làm lạnh Silk Air","Kích thước dàn lạnh":"Dài 76.8 cm - Cao 28.7 cm - Dày 20 cm","Khối lượng dàn lạnh":"7.5 kg","Kích thước dàn nóng":"Dài 71 cm - Cao 45.5 cm - Dày 27.5 cm","Khối lượng dàn nóng":"16 kg","Chiều dài lắp đặt ống đồng":"Tối thiểu 3m - Tối đa 20m","Chiều cao lắp đặt tối đa giữa cục nóng-lạnh":"5m","Dòng điện vào":"Dàn lạnh","Dòng điện hoạt động":"1 pha","Kích thước ống đồng":"6/10","Số lượng kết nối dàn lạnh tối đa":"1","Hãng":"Casper. Xem thông tin hãng"},"features":["- Máy lạnh Casper sở hữu thiết kế treo tường hiện đại, tiết kiệm không gian, kết hợp với gam màu trắng thanh lịch giúp sản phẩm dễ dàng hài hòa với nhiều phong cách nội thất.","- Điểm nhấn độc đáo của thiết kế này là màn hình LED hiển thị nhiệt độ trực quan giúp người dùng dễ dàng quan sát và điều chỉnh vào ban đêm.","- Dàn nóng được trang bị hệ thống ống dẫn gas bằng đồng mạ vàng, lá tản nhiệt bằng nhôm mạ vàng đảm bảo hiệu quả làm lạnh, tăng độ bền cho thiết bị chống chịu trước thời tiết ẩm ướt, sương muối,...","- Thiết bị sử dụng gas R32 thân thiện với môi trường đồng thời đảm bảo hiệu suất làm lạnh.","- Công nghệ Silk Air khuếch tán không khí mát thông qua hàng ngàn lỗ khí siêu nhỏ, tạo luồng khí mềm mại, nhẹ nhàng, không gây buốt lạnh, phù hợp với người lớn tuổi và trẻ nhỏ","- Máy lạnh Casper Inverter có chế độ thổi gió được thiết kế lên xuống tự động , giúp luồng khí lạnh luân chuyển đồng đều khắp không gian, đảm bảo mọi vị trí trong phòng đều được làm mát.","- Công nghệ Inverter giúp máy nén hoạt động linh hoạt theo nhiệt độ phòng, giảm dao động công suất không cần thiết - từ đó tiết kiệm điện hiệu quả và kéo dài tuổi thọ máy.","- Chế độ i-Save tối ưu hóa đường cong nhiệt độ khi làm lạnh, cho phép máy hoạt động ổn định ở mức năng lượng thấp mà vẫn duy trì cảm giác mát mẻ.","Xem thêm: Tổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng","- Chế độ BabyCare điều chỉnh nhiệt độ nhẹ nhàng, duy trì không gian dễ chịu mà không gây lạnh đột ngột, phù hợp cho gia đình có trẻ em hoặc người cao tuổi.","- Cảm biến nhiệt độ thông minh I Feel sử dụng cảm biến để đo nhiệt độ tại vị trí người dùng, giúp máy lạnh điều chỉnh chính xác mức nhiệt độ phù hợp với khu vực bạn đang ngồi.","- Tự khởi động lại khi có điện , giữ nguyên chế độ hoạt động trước khi bị ngắt điện."],"model":"334018","brand":"Casper","category":"Hàng Casper","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"334018-may-lanh-casper-inverter-1-hp-qc-09iu36a","_addedBy":"vai-add-product"},"357869":{"name":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","description":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","priceNum":6490000,"listPn":10990000,"salePn":6490000,"priceMode":"both","image":"https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806-700x467.jpg","images":["https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-638963804276138450-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-638963804285992497-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-99-638962219298592474-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-5-639063368977740536.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-639063369030108820.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-639063369065311055.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-639063369104866518.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-4-639063369150311821.jpg"],"specs":{"Loại máy giặt":"Cửa trước","Lồng giặt":"Lồng ngang","Khối lượng giặt":"10.5 Kg","Số người sử dụng":"Trên 7 người","Kiểu động cơ":"Truyền động gián tiếp (dây Curoa)","Tốc độ quay vắt tối đa":"1400 vòng/phút","Chất liệu lồng giặt":"Inox","Chất liệu vỏ máy":"Kim loại sơn tĩnh điện","Chất liệu cửa máy":"Nhựa","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2025","Thời gian bảo hành động cơ":"10 năm","Hiệu suất sử dụng điện":"5.7 Wh/kg","Loại Inverter":"Công nghệ Inverter","Chương trình":"Đồ màu Vải mỏng Đồ trẻ em Đồ lót Đồ len Đồ hỗn hợp Đồ cotton Đồ Jeans Áo sơ mi Xả + vắt Vệ sinh lồng giặt Vắt Giặt vệ sinh Giặt tiết kiệm Giặt nhanh Giặt chăn bông","Công nghệ giặt":"Giặt nước nóng Giặt hơi nước","Bảng điều khiển":"Song ngữ Anh - Việt có núm xoay, cảm ứng và màn hình hiển thị","Tiện ích":"Vệ sinh lồng giặt Khóa trẻ em Hẹn giờ giặt Chống nhăn Chỉnh số vòng vắt Chỉnh nhiệt độ nước","Kích thước - Khối lượng":"Cao 85 cm - Ngang 60 cm - Sâu 63.5 cm - Nặng 70 kg","Chiều dài ống cấp nước":"110 cm","Chiều dài ống thoát nước":"180 cm","Hãng":"Hitachi. Xem thông tin hãng"},"features":["Thiết bị sử dụng kiểu động cơ gián tiếp truyền động dây curoa nên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.","Tiện ích giặt chống nhăn được thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.","Hẹn giờ giặt giúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.","Tùy chỉnh số vòng vắt, nhiệt độ nước cho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.","Vệ sinh lồng giặt bằng nước nóng giúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt."],"model":"357869","brand":"Hitachi","category":"Máy giặt / sấy","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"357869-may-giat-hitachi-inverter-10-5-kg-bd-1054hvow","_addedBy":"vai-add-product"},"363374":{"name":"Máy lạnh Comfee Inverter 1 HP CFS-10VDM","description":"Máy lạnh Comfee Inverter 1 HP CFS‑10VDM mang đến giải pháp sống hiện đại với loạt tính năng AI thông minh. Công suất 1 HP lý tưởng cho phòng dưới 15m², tạo không gian mát lạnh, thoải mái và tiết kiệm điện hiệu quả.\nTích hợp nhiều tính năng AI thông minh\n-\nCông nghệ AI Frost Clean\n: đóng băng bụi bẩn và vi khuẩn ở -10ºC, sau đó rã đông và làm sạch tự động, giúp dàn lạnh luôn sạch sẽ và luồng gió thổi ra trong lành, an toàn cho sức khỏe.\n-\nChế độ Sleep Curve\n: tự động tăng hoặc giảm nhiệt độ theo từng giai đoạn giấc ngủ giúp nhiệt độ phòng luôn cân bằng với thân nhiệt, tránh lạnh buốt, tiết kiệm điện và mang lại giấc ngủ sâu, thoải mái.\n*Hình ảnh chỉ mang tính chất minh họa\n-\nCông nghệ AI Cool\n: cho phép điều khiển bật/tắt, thay đổi nhiệt độ, chuyển chế độ bằng giọng nói qua ứng dụng SmartHome.\n-\nCông nghệ AI Humidity\n: tự động điều chỉnh tốc độ quạt và công suất làm lạnh để cân bằng độ ẩm trong phòng ở mức lý tưởng từ 40% - 70%, giúp không khí luôn trong lành, mát mẻ, mang đến sự thoải mái tối đa mà không cần canh chỉnh thủ công.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nDàn lạnh\n-\nMáy lạnh một chiều\nnày của Comfee sở hữu phong cách thiết kế tối giản với dạng hình hộp chữ nhật, giúp tiết kiệm diện tích và dễ dàng lắp đặt. Toàn bộ thân máy sử dụng tông màu trắng trang nhã, mang lại cảm giác sạch sẽ và hài hòa với đa dạng phong cách nội thất, từ hiện đại đến tối giản.\n- Mặt trước tích hợp\nđèn LED hiển thị nhiệt độ\nrõ ràng, giúp người dùng dễ dàng theo dõi và điều chỉnh ngay cả trong điều kiện thiếu sáng.\n*Hình ảnh chỉ mang tính chất minh họa\nDàn nóng\n- Dàn nóng\nmáy lạnh\nđược thiết kế với kết cấu chắc chắn, có khả năng chịu đựng tốt các tác động từ môi trường như nắng nóng, mưa ẩm hay bụi bẩn.\n- Sử dụng\nống dẫn gas bằng đồng\ngiúp tăng hiệu quả trao đổi nhiệt, từ đó hỗ trợ quá trình làm lạnh nhanh và ổn định hơn. Phần\nlá tản nhiệt bằng nhôm được phủ lớp bảo vệ Golden Coating\ngiúp hạn chế tình trạng ăn mòn, oxy hóa cũng như sự phát triển của nấm mốc, góp phần nâng cao độ bền cho thiết bị.\n*Hình ảnh chỉ mang tính chất minh họa\nCông nghệ làm lạnh\n-\nMáy lạnh 1 HP\nnày có\ncông suất làm lạnh 9.350 BTU\n, hoạt động hiệu quả cho phòng có diện tích dưới 15m² như phòng ngủ hoặc phòng làm việc nhỏ.\n- Máy được trang bị công nghệ làm lạnh hiện đại với\nchế độ Hyper Tech\n, cho phép máy nén tăng tốc nhanh đến tần số cao chỉ trong thời gian ngắn, giúp căn phòng nhanh chóng đạt mức nhiệt mong muốn. Nhờ đó, người dùng có thể cảm nhận luồng không khí mát lạnh gần như ngay sau khi khởi động, mang lại sự thoải mái tức thì.\nXem thêm:\nTổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng\n*Hình ảnh chỉ mang tính chất minh họa\nCơ chế thổi gió\n-\nMáy lạnh Comfee\nnày trang bị\ncánh đảo gió lên xuống tự động\n, kết hợp\nđiều chỉnh trái phải bằng tay\ngiúp luồng khí lan tỏa linh hoạt, hơi lạnh được phân bổ đều, làm mát nhanh và hạn chế cảm giác lạnh buốt tại một vị trí.\n- Ngoài ra,\ntính năng Follow Me\ngiúp remote đo nhiệt độ ngay tại vị trí bạn đang ngồi hoặc nằm, thay vì chỉ đo ở dàn lạnh. Nhờ đó, máy sẽ tự điều chỉnh để khu vực xung quanh bạn luôn mát và dễ chịu.\nCông nghệ tiết kiệm điện\n-\nCông nghệ Inverter\ngiúp máy duy trì nhiệt độ ổn định, vận hành êm ái và tiết kiệm điện năng, mang đến không gian mát mẻ và thoải mái cho cả gia đình.\n-\nCông nghệ ECO+\ntích hợp thuật toán AI giúp tiết kiệm điện năng hiệu quả nhưng vẫn đảm bảo không khí mát lạnh tối ưu.\nXem thêm:\nVì sao máy lạnh Inverter tiết kiệm hơn hẳn máy lạnh thường?\n*Hình ảnh chỉ mang tính chất minh họa\n-\nChế độ Gear+\nđược nâng cấp với 5 mức (20%, 40%, 60%, 80%, 100%), giúp bạn dễ dàng chọn công suất phù hợp với nhiệt độ phòng, vừa mang lại sự thoải mái, vừa tiết kiệm năng lượng.\n*Hình ảnh chỉ mang tính chất minh họa\nKhả năng lọc không khí\nMáy trang bị\nhệ thống lọc kép Dual Filtration\nvới khả năng loại bỏ bụi mịn, vi khuẩn, các chất độc hại và hạt siêu nhỏ gây dị ứng, đồng thời khử mùi khó chịu trong phòng. Nhờ đó, không gian sống luôn sạch sẽ, trong lành, giúp bảo vệ sức khỏe và giảm nguy cơ kích ứng hô hấp hay dị ứng.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích\n-\nChế độ Hút ẩm\n: giảm độ ẩm dư thừa, mang lại không gian khô ráo, thoáng mát, bảo vệ nội thất và sức khỏe, đặc biệt hữu ích trong mùa mưa ẩm hoặc mùa nồm.\n-\nPCB phủ lớp UV\n: tăng khả năng chống ẩm, bảo vệ bo mạch và nâng cao tuổi thọ thiết bị ngay cả trong điều kiện thời tiết khắc nghiệt.\n-\nĐịnh vị thông minh\n: trong bán kính 15 km, bạn có thể bật/tắt điều hòa hoặc thiết lập phạm vi mong muốn để Comfee chủ động làm mát phòng trước khi bạn trở về nhà.\n- Thiết bị\nhỗ trợ kết nối linh hoạt\nvới nhiều thiết bị thông minh như máy tính bảng, đồng hồ,…đồng thời tương thích với các trợ lý ảo phổ biến như Google Assistant, Apple HomeKit và Maika Assistant, giúp bạn điều khiển từ xa hoặc sử dụng giọng nói tiếng Việt dễ dàng. Ngoài ra, máy còn cho phép chia sẻ quyền điều khiển để các thành viên trong gia đình cùng sử dụng tiện lợi hơn.\nXem thêm:\nHướng dẫn sử dụng các tính năng điều khiển bằng giọng nói trên máy lạnh Comfee\n*Hình ảnh chỉ mang tính chất minh họa\nMáy lạnh Comfee Inverter 1 HP CFS-10VDM đáp ứng tốt nhu cầu làm mát hằng ngày cho phòng dưới 15m² nhờ khả năng vận hành êm ái và tiết kiệm điện hiệu quả. Sản phẩm tích hợp các tiện ích thông minh, mang đến trải nghiệm sử dụng tiện lợi và là lựa chọn đáng tin cậy cho lối sống hiện đại.\nXem thêm","priceNum":7290000,"listPn":7990000,"salePn":7290000,"priceMode":"both","image":"https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614184743353.jpg","images":["https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614184743353.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614214520509.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614238422955.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614272015263.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614305715205.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614341281583.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614354781600.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614368977788.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614384343425.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614398103352.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614413533341.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614430290567.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/comfee-inverter-1-hp-cfs-10vdm639105614445170607.jpg","https://cdn.tgdd.vn/Products/Images/2002/363374/Slider/13-1020x570.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-1-639078868082613354-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-2-639084780546821892-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-3-639084780556232501-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-5-639084780572901080-700x467.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/2002/363374/comfee-inverter-1-hp-cfs-10vdm-99-639081358308979326-700x467.jpg"],"specs":{"Loại máy":"1 chiều (chỉ làm lạnh)","Inverter":"Có Inverter","Công suất làm lạnh":"1 HP - 9.350 BTU","Phạm vi làm lạnh hiệu quả":"Dưới 15m² (từ 30 đến 45m³)","Độ ồn trung bình (được đo trong phòng thí nghiệm)":"Dàn lạnh: 40/35.5/32 dB - Dàn nóng: 51 dB","Dòng sản phẩm":"2026","Sản xuất tại":"Thái Lan","Thời gian bảo hành cục lạnh, cục nóng":"3 năm","Thời gian bảo hành máy nén":"Máy nén 5 năm","Chất liệu dàn tản nhiệt":"Ống dẫn gas bằng Đồng - Lá tản nhiệt bằng Nhôm phủ lớp chống ăn mòn Golden Coating","Loại Gas":"R-32","Tiêu thụ điện":"0.83 kWh","Nhãn năng lượng":"5 sao (Hiệu suất năng lượng 5.20)","Công nghệ tiết kiệm điện":"Eco+ Smart Inverter","Lọc bụi, kháng khuẩn, khử mùi":"Công nghệ lọc kép Dual Filtration","Chế độ gió":"Đảo gió lên xuống tự động, trái phải tùy chỉnh tay","Công nghệ làm lạnh nhanh":"Hyper Tech","Tiện ích":"Định vị vị trí thông minh - LBS Remote có đèn nền PCB với lớp phủ UV Kết nối thông minh IOT Kết nối qua ứng dụng SmartHome Cảm biến nhiệt độ Follow Me Chế độ chăm sóc giấc ngủ Sleep Curve Màn hình hiển thị nhiệt độ trên dàn lạnh Chức năng hút ẩm iECO - Quản lý điện năng tiêu thụ qua ứng dụng AI Humidity - Chế độ cân bằng độ ẩm AI Frost Clean - Chế độ làm sạch sâu Tự khởi động lại khi có điện Gear Control Công nghệ AI Cool - điều khiển bằng giọng nói","Kích thước dàn lạnh":"Dài 72.3 cm - Cao 28.6 cm - Dày 19.9 cm","Khối lượng dàn lạnh":"7.2 kg","Kích thước dàn nóng":"Dài 66.8 cm - Cao 46.9 cm - Dày 25.2 cm","Khối lượng dàn nóng":"16.9 kg","Chiều dài lắp đặt ống đồng":"Tối thiểu 3m - Tối đa 15m","Chiều cao lắp đặt tối đa giữa cục nóng-lạnh":"10m","Dòng điện vào":"Dàn nóng hoặc dàn lạnh","Dòng điện hoạt động":"1 pha","Kích thước ống đồng":"6/10","Số lượng kết nối dàn lạnh tối đa":"1","Hãng":"Comfee. Xem thông tin hãng"},"features":["- Công nghệ AI Frost Clean : đóng băng bụi bẩn và vi khuẩn ở -10ºC, sau đó rã đông và làm sạch tự động, giúp dàn lạnh luôn sạch sẽ và luồng gió thổi ra trong lành, an toàn cho sức khỏe.","- Công nghệ AI Cool : cho phép điều khiển bật/tắt, thay đổi nhiệt độ, chuyển chế độ bằng giọng nói qua ứng dụng SmartHome.","- Mặt trước tích hợp đèn LED hiển thị nhiệt độ rõ ràng, giúp người dùng dễ dàng theo dõi và điều chỉnh ngay cả trong điều kiện thiếu sáng.","- Dàn nóng máy lạnh được thiết kế với kết cấu chắc chắn, có khả năng chịu đựng tốt các tác động từ môi trường như nắng nóng, mưa ẩm hay bụi bẩn.","- Máy lạnh 1 HP này có công suất làm lạnh 9.350 BTU , hoạt động hiệu quả cho phòng có diện tích dưới 15m² như phòng ngủ hoặc phòng làm việc nhỏ.","Xem thêm: Tổng hợp chứng nhận công nghệ trên máy lạnh từ các hãng","- Ngoài ra, tính năng Follow Me giúp remote đo nhiệt độ ngay tại vị trí bạn đang ngồi hoặc nằm, thay vì chỉ đo ở dàn lạnh. Nhờ đó, máy sẽ tự điều chỉnh để khu vực xung quanh bạn luôn mát và dễ chịu.","- Công nghệ Inverter giúp máy duy trì nhiệt độ ổn định, vận hành êm ái và tiết kiệm điện năng, mang đến không gian mát mẻ và thoải mái cho cả gia đình.","- Công nghệ ECO+ tích hợp thuật toán AI giúp tiết kiệm điện năng hiệu quả nhưng vẫn đảm bảo không khí mát lạnh tối ưu.","Xem thêm: Vì sao máy lạnh Inverter tiết kiệm hơn hẳn máy lạnh thường?","- Chế độ Gear+ được nâng cấp với 5 mức (20%, 40%, 60%, 80%, 100%), giúp bạn dễ dàng chọn công suất phù hợp với nhiệt độ phòng, vừa mang lại sự thoải mái, vừa tiết kiệm năng lượng.","- Chế độ Hút ẩm : giảm độ ẩm dư thừa, mang lại không gian khô ráo, thoáng mát, bảo vệ nội thất và sức khỏe, đặc biệt hữu ích trong mùa mưa ẩm hoặc mùa nồm."],"model":"363374","brand":"Comfee","category":"Hàng Comfee","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"363374-may-lanh-comfee-inverter-1-hp-cfs-10vdm","_addedBy":"vai-add-product"},"401354":{"name":"Kệ Gia Vị Nâng Hạ Điện STAR MOVE (401354 - 900mm) - Higold ","description":"Đặc điểm nổi bật \nGiá gia vị nâng hạ điện STAR MOVE sử dụng công nghệ cảm biến chạm hiện đại. Chỉ cần chạm nhẹ vào bộ cảm biến, giá gia vị sẽ tự động hạ xuống theo chiều thẳng đứng, giúp tận dụng được những khoang tủ cao. Người dùng có thể dừng giá ở bất kỳ vị trí nào hoặc đưa về trạng thái ban đầu chỉ với một thao tác chạm. Cảm biến hoạt động mượt mà ngay cả khi tay bạn ướt hoặc dính dầu mỡ.\nHệ thống ròng rọc và ray trượt chắc chắn giúp giá vận hành trơn tru. Khi nhận tín hiệu chạm, hệ thống sẽ kéo giá xuống. Trong quá trình di chuyển, nếu gặp vật cản phía dưới, giá sẽ tự động đảo chiều đi lên, đảm bảo an toàn cho người dùng và thiết bị.\nGiá được thiết kế 2 tầng riêng biệt. Tầng trên để các lọ gia vị nhỏ, tầng dưới phù hợp cho các chai lớn hơn, giúp phân loại và sắp xếp gọn gàng, tận dụng hiệu quả không gian tủ bếp trên – nơi thường khó với tới.\nToàn bộ khung và giỏ được làm từ hợp kim nhôm phủ sơn tĩnh điện, có khả năng chống oxy hóa, hạn chế han gỉ, bền bỉ trong môi trường bếp ẩm, đồng thời dễ dàng vệ sinh.\nKết cấu chắc chắn, sản phẩm có khả năng chịu tải lên đến 20kg.\nSản phẩm sử dụng điện áp định mức 100-220V, tương thích với hầu hết hệ thống điện trong gia đình.\nĐèn LED tích hợp trên giá giúp chiếu sáng khu vực lưu trữ, hỗ trợ người dùng dễ dàng nhận biết và lấy đúng chai lọ mình cần ngay cả trong điều kiện thiếu sáng.","priceNum":21000000,"listPn":21000000,"salePn":21000000,"priceMode":"list","image":"https://phukienbepthanhdat.com/wp-content/uploads/2025/10/ke-gia-vi-nang-ha-dien-star-move-1.jpg","images":["https://phukienbepthanhdat.com/wp-content/uploads/2025/10/ke-gia-vi-nang-ha-dien-star-move-1.jpg"],"specs":{"Kích thước (rộng x sâu x cao)":"864 x 263x 690mm","Chất liệu":"Thép cacbon + Hợp kim nhôm","Kích thước phủ bì":"900mm"},"features":["Giá được thiết kế 2 tầng riêng biệt. Tầng trên để các lọ gia vị nhỏ, tầng dưới phù hợp cho các chai lớn hơn, giúp phân loại và sắp xếp gọn gàng, tận dụng hiệu quả không gian tủ bếp trên – nơi thường khó với tới.","Toàn bộ khung và giỏ được làm từ hợp kim nhôm phủ sơn tĩnh điện, có khả năng chống oxy hóa, hạn chế han gỉ, bền bỉ trong môi trường bếp ẩm, đồng thời dễ dàng vệ sinh.","Kết cấu chắc chắn, sản phẩm có khả năng chịu tải lên đến 20kg.","Sản phẩm sử dụng điện áp định mức 100-220V, tương thích với hầu hết hệ thống điện trong gia đình.","Đèn LED tích hợp trên giá giúp chiếu sáng khu vực lưu trữ, hỗ trợ người dùng dễ dàng nhận biết và lấy đúng chai lọ mình cần ngay cả trong điều kiện thiếu sáng."],"model":"401354","brand":"Higold","category":"Kệ gia vị nâng hạ điện","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"401354-ke-gia-vi-nang-ha-dien-star-move-401354-900mm-higold","_addedBy":"vai-add-product"},"BN7546":{"name":"Chậu 1 Hố Mạ Nano BN7546","description":"Trong thiết kế gian bếp hiện đại, việc lựa chọn một chiếc chậu rửa phù hợp đóng vai trò quan trọng để đảm bảo công năng và tính thẩm mỹ. Chậu 1 hố mạ nano được xem là sự lựa chọn hoàn hảo nhờ đặc tính bền bỉ, thiết kế đẹp và nhiều tính năng đi kèm. Hãy cùng tìm hiểu về những điểm nổi bật của chậu 1 hố mạ nano qua bài viết sau.\nChất liệu Inox 304 Mạ Nano – Bảo Chứng Chất Lượng Chất liệu inox 304 mạ nano của Boss được sử dụng cho chậu 1 hố không chỉ mang lại tính thẩm mỹ cao mà còn đảm bảo độ bền bỉ trước tác nhân oxy hóa, rỉ sét. Lớp mạ nano giúp gia tăng khả năng chống bám bẩn, dễ dàng lau chùi và giữ cho bề mặt chậu luôn sáng bóng như mới.\nKèm Phụ Kiện Tiện Ích Mỗi bộ chậu 1 hố mạ nano đều được trang bị đầy đủ các phụ kiện cao cấp, bao gồm:\nThớt chậu nhỏ : Giúp người dùng tiết kiệm diện tích khi chuẩn bị thức phẩm. Rổ nhỏ : Tiên lợi cho việc rửa rau, hoa quả hay để nước thoát nhanh hơn. Nhờ những phụ kiện đi kèm, chậu 1 hố mạ nano không chỉ đem lại sự tiên nghi mà còn góp phần giãm bớt gánh nặng trong công việc bếp núc.\nĐặc Điểm Kỹ Thuật Vượt Trội Chậu 1 hố mạ nano được thiết kế để phù hợp với nhiều nhu cầu khác nhau. Hai mã sản phẩm phổ biến nhất là BN7546 và BN7848.\n1. Mã BN7546 Kích thước khoét đá: 42 x 72 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm 2. Mã BN7848 Kích thước khoét đá: 47 x 75.5 cm Độ dày viền: 3.0 mm Độ dày thùng: 1.0 mm Với độ dày viền đạt 3.0 mm và thùng 1.0 mm, chậu 1 hố mạ nano bảo đảm tính chắc chắn, chống biến dạng trong quá trình sử dụng. Kích thước linh hoạt có thể đầu vừa với nhiều loại bếp từ truyền thống đến hiện đại.\nThiết Kế Hiện Đại – Tính Đa Năng Thiết kế của chậu 1 hố mạ nano được đánh giá cao nhờ tính đơn giản mà tính tế. Tất cả các chi tiết đều được gia công kỹ lưỡng, đáp ứng được các tiêu chuẩn cao nhất trong thiết kế nội thất.\nChậu 1 hố mạ nano\nKhông chỉ phù hợp cho những căn bếp hiện đại, chậu 1 hố còn mang lại khả năng đa dụng, tực hợp nhiều phụ kiện để đáp ứng nhu cầu của từng gia đình.\nLý Do Nên Chọn Chậu 1 Hố Mạ Nano 1. Bền Bỉ Vượt Trội Inox 304 là chất liệu nổi tiếng với độ bền bỉ, khả năng chống oxy hóa cao và không bị ảnh hưởng bởi các chất tẩy rửa mành.\n2. Tính Năng Chống Bám Bẩn Lớp mạ nano giúp dễ dàng lau chùi, ngăn ngừa vi khuẩn và bảo vệ an toàn sức khỏe cho gia đình.\n3. Thiết Kế Linh Hoạt Kích thước đa dạng phù hợp với nhiều loại bếp, từ bếp truyền thống đến hiện đại.\n4. Phụ Kiện Đi Kèm Với thớt chậu và rổ nhỏ, sản phẩm cung cấp đầy đủ tiên nghi cho gian bếp.\nHướng Dẫn Lắp Đặt Chậu 1 Hố Mạ Nano Đọc kỹ hướng dẫn sử dụng và bản vẽ kèm theo. Đo và đánh dấu vị trí khoét đá phù hợp: BN7546: 42 x 72 cm BN7848: 47 x 75.5 cm Lắp chậu và kết nối đáy tháo nước đảm bảo khít chặt. Hoàn thiện bằng cách làm sạch bặng vải mềm. Chậu 1 hố mạ nano không chỉ là một sản phẩm cao cấp với nhiều tính năng tiện ích mà còn mang lại tính thẩm mỹ và bền bỉ cho gian bếp của bạn. Với chất liệu inox 304, thiết kế độc đáo và phụ kiện đi kèm, sản phẩm này xứng đáng là một trong những lựa chọn tốt nhất cho bất kỳ gia đình nào","priceNum":7950000,"listPn":7950000,"salePn":7950000,"priceMode":"list","image":"https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-1-ho-ma-nano.webp","images":["https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-1-ho-ma-nano.webp"],"specs":{"Kích thước (mã BN7546)":"Kích thước khoét đá 42 x 72 cm."},"features":["Chất liệu cao cấp: Chậu được làm từ inox 304 mạ nano, bền bỉ và chống gỉ sét, phù hợp với mọi không gian bếp hiện đại.","Thiết kế chắc chắn: Độ dày viền 3.0mm và thùng chậu 1.0mm đảm bảo độ bền và khả năng chịu lực cao.","Phụ kiện đi kèm tiện ích: Bao gồm thớt chậu nhỏ và rổ nhỏ, hỗ trợ tối đa trong quá trình sử dụng.","Dễ dàng lắp đặt và vệ sinh: Thiết kế tối ưu hóa tiện ích và đảm bảo vệ sinh tuyệt đối trong không gian bếp"],"model":"BN7546","brand":"Boss","category":"Chậu rửa bát","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"bn7546-chau-1-ho-ma-nano-bn7546","_addedBy":"vai-add-product"},"MS7743SI":{"name":"Chậu rửa chén 1 hố Inox 304 hạn chế trầy xước kích thước 76 cm","description":"Loại sản phẩm: Chậu Rửa Chén\nLoại chậu: Lắp Nổi + Lắp âm\nChất liệu: Inox 304\nThiết kế Chậu: 1 Hố\nKích thước hố xả: 114\nPhụ kiện đi kèm: Thớt kháng khuẩn, 2 rổ Plastic ABS, bộ xả thông minh Z-Style, tiết kiệm không gian","priceNum":8250000,"listPn":0,"salePn":8250000,"priceMode":"both","image":"https://bizweb.dktcdn.net/100/567/847/products/ms7743si.jpg","images":["https://bizweb.dktcdn.net/100/567/847/products/ms7743si.jpg","https://bizweb.dktcdn.net/100/567/847/products/ms7743gr-si-dc58b1ae-540e-4a5b-9f71-4bbdb6374acd.jpg"],"specs":{"Loại sản phẩm":"Chậu Rửa Chén","Loại chậu":"Lắp Nổi + Lắp âm","Chất liệu":"Inox 304","Thiết kế Chậu":"1 Hố","Kích thước hố xả":"114","Phụ kiện đi kèm":"Thớt kháng khuẩn, 2 rổ Plastic ABS, bộ xả thông minh Z-Style, tiết kiệm không gian","Chiều rộng sản phẩm (mm)":"760","Chiều sâu sản phẩm (mm)":"430","Chiều cao sản phẩm (mm)":"220","Chiều rộng mặt cắt đá - Lắp nổi (mm)":"736","Chiều sâu mặt cắt đá - Lắp nổi (mm)":"406","Bo góc mặt cắt đá - Lắp nổi (mm)":"R10","Chiều rộng mặt cắt đá - Lắp âm (mm)":"726","Chiều sâu mặt cắt đá - - Lắp âm (mm)":"396","Bo góc mặt cắt đá - Lắp âm (mm)":"R25","Chiều rộng đóng gói (mm)":"845","Chiều sâu đóng gói (mm)":"515","Chiều cao đóng gói (mm)":"280","Mã SAP":"600001525","Rổ lọc rác bằng inox tiện lợi":"Có","Lớp chống ồn và chống ngưng tụ nước dưới đáy chậu":"Có","Bộ xả thông minh ngăn mùi hiệu quả":"Có"},"features":[],"model":"MS7743SI","brand":"Malloca","category":"Chậu rửa","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"ms7743si-chau-rua-chen-1-ho-inox-304-han-che-tray-xuoc-kich-thuoc-76-cm","_addedBy":"vai-add-product"},"KF-DR113L09BL":{"name":"MÁY SẤY CHÉN KAFF KF-DR113L09BL","description":"MÁY SẤY KAFF KF-DR113L09BL • Máy sấy cửa trước hiện đại lồng ngang • 15 chương trình sấy tự động tích hợp (Cotton Extra Dry, Cotton Cupboard Dry, Cotton Iron Dry, Synthetics Cupboard Dry, Synthetics Iron Dry, Delicate, Mix, Baby Care, Towels,Hygiene, Outdoor, Time drying, Refresh, Express, Shirts, Duvet, Sport, Wool refresh) • Khối lượng sấy khô 9 Kg • Công nghệ sấy cưỡng bức trực tiếp hiện đại - HEAT PUMP A++ (AL) • Lồng sấy inox, thân sơn tĩnh điện màu đen cao cấp • Chức năng diệt khuẩn an toàn UVC_TD • Motor Pump và máy nén Compressor motor kiểu PSC hoạt động đảo chiều, không sử dụng chổi than EcoSilence Drive giúp máy sấy hoạt động với đồ ồn thấp và bền bỉ - tiết kiệm năng lượng • Hệ thống cảm biến sấy an toàn Sensor Drying System • Đảo chiều lồng quay lúc sấy giúp sấy đồ khô nhanh hơn, hiệu quả hơn (Two Way Tumbling) • Điều khiển điện tử (Control system Electronic) • Hệ thống phát hiện lỗi khi sử dụng (Failure Detection System) • Khóa trẻ em an toàn (Child lock) • Hiện thị chu trình sấy (Drying cycle indicator) • Chức năng hẹn giờ lên đến 1-23h (Delay time adjustment via button) • Điều chỉnh cường độ sấy (Drying level adjustment via button) • Điều chỉnh chương trình sấy (Drying Target) • Điều chỉnh tốc độ sấy (Spin Speed Selection) • Màn hình hiện thị led màu sáng trắng LEDCOLOR_TD_T) • Hiện thị cảnh báo lọc đầy (Filter full indicator) • Hiện thị tank nước đầy (Water tank full indicator) • Cảnh báo cần làm sạch bình ngưng (Condenser cleaning indicator) • Thời lượng chương trình (phút) - Đầy tải: 208 • Thời lượng chương trình (phút) - Tải một phần: 116 • Thời lượng chương trình (phút) - Tải trọng 70%: 155 • ","priceNum":25800000,"listPn":0,"salePn":25800000,"priceMode":"both","image":"https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699435317207.jpg","images":["https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699435317207.jpg","https://kaff.vn/upload/products/large/may-say-kaff-kf-dr113l09bl-1699499640165.jpg"],"specs":{"Tiêu thụ năng lượng ở mức tải một phần (kWh/chu kỳ)":"1.19 • Tiêu thụ năng lượng ở mức đầy tải (kWh/chu kỳ): 2.12 • Công suất sấy 1000W • Tiêu thụ năng lượng (kWh/năm): 259 • Tốc độ quay (RPM): 600-800-1000-1200-1400-1600 Vòng • Thời gian sấy (phút): 10 - 30 - 60 - 90 - 120 - 150 • Nút bấm chọn tính năng: + Tắt mở (On/Off) + Chức năng tạm dừng (Start/Pause) + Chức năng chống nhăn quần áo (Anti-crease) + Tín hiệu sấy (Signal) + Đèn cảnh báo (Lamp) • Tiêu chuẩn tiết kiệm năng lượng A+++ theo tiêu chuẩn Châu Âu • Hệ thống SensitiveDrying Sytem giúp quần áo thấm một luồng không khí từ mọi phía khiến quần áo được sấy khô tuyệt đối mà vẫn mềm mại • Độ ồn chỉ 65dB nhờ công nghệ chống rung AntiVibration hiện đại • Chuông báo khi quá trình sấy kết thúc, kiểm soát mọi sự cố có thể gặp cho hệ thống điện, nước và ngưng mọi hoạt động vô cùng an toàn • Nguồn điện 220V-240V/50Hz • Công suất định mức 1000W - 10A • Áp suất nước tiêu chuẩn 0.05 - 1 Mpa • Bình giữ nhiệt an toàn • Cửa máy hoạt động đóng mở bằng khóa điện từ độ mở 180 độ hiệu quả tối đa, kinh tế, bền bỉ và êm ái • Kích thước sản phầm (HxWxD) (mm): 845x596x609 • Gross Weight (Shrink) (Kg) -Glass Door: 46.8 • Gross Weight (Carton) (kg) - Glass Door: 47.8 • Bảo hành 05 năm"},"features":[],"model":"KF-DR113L09BL","brand":"KAFF","category":"MÁY SẤY CHÉN","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"kf-dr113l09bl-may-say-chen-kaff-kf-dr113l09bl","_addedBy":"vai-add-product"},"KFFC9014":{"name":"VÒI RỬA NÓNG LẠNH KAFF KF-FC9014","description":"VÒI RỬA NÓNG LẠNH KAFF KF-FC9014 • Vòi lạnh • Bảo hành 3 năm","priceNum":4180000,"listPn":0,"salePn":4180000,"priceMode":"both","image":"https://kaff.vn/upload/products/large/voi-rua-lanh-kaff-kf-fc9014-1704925929991.jpg","images":["https://kaff.vn/upload/products/large/voi-rua-lanh-kaff-kf-fc9014-1704925929991.jpg"],"specs":{},"features":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"model":"KFFC9014","brand":"KAFF","category":"VÒI RỬA CHÉN","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"kffc9014-voi-rua-nong-lanh-kaff-kf-fc9014","_addedBy":"vai-add-product"},"KAFF KF - IC79H New Plus":{"name":"BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus","description":"Giá bán khuyến mãi 21,800,000đ BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus Bếp điện từ kết hợp: 02 từ + 01 điện – Xuất xứ: MALAYSIA Mặt kính Shott Ceran Made in Germany siêu bền, chịu lực chịu sốc nhiệt Đầu đốt EGO Made in Germany Chức năng Booster cực nhanh với bếp từ Bo mạch lGBT SIMENS Made in Germany Công nghệ Half- Bridge gia nhiệt liên tục 10 dải công suất Điều khiển cảm ứng Slider dạng ẩn trực tiếp trên mặt bếp Chế độ hẹn giờ, tiện dụng Chức năng Inverter và chia công suất tiết kiệm điện năng, bảo vệ bếp Bảo hành 05 năm","priceNum":21800000,"listPn":0,"salePn":21800000,"priceMode":"both","image":"https://kaff.vn/upload/products/large/bep-dien-tu-kaff-kf-ic79h-new-plus-170850056341.jpg","images":["https://kaff.vn/upload/products/large/bep-dien-tu-kaff-kf-ic79h-new-plus-170850056341.jpg"],"specs":{},"features":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"model":"KAFF KF - IC79H New Plus","brand":"KAFF","category":"BẾP ĐIỆN TỪ KAFF KF - IC79H New Plus","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"kaff-kf-ic79h-new-plus-bep-dien-tu-kaff-kf-ic79h-new-plus","_addedBy":"vai-add-product"},"GARDE820SEMI":{"name":"MÁY RỬA CHÉN KAFF KF-GARDE820 SEMI","description":"MÁY RỬA CHÉN KAFF KF-GARDE820 SEMI • Máy rửa chén âm bán phần • Sức chứa 15 bộ đồ ăn Châu Âu • 10 Chương trình rửa tích hợp: Prewash, Mini 14’ (Jet Wash), Quick 30’ 40°C, Eco (Standard Programme), Super 50’ 65°C (Quick Clean), Easy Care 60°C, Dual Pro Wash 60°C, Smart 30°C - 50°C, Smart 50°C - 60°C, Smart 60°C - 70°C. Chức năng đặc biệt: *Delay timer option • Eco Wash - Half load option (with 3 mode), Tablet option, Extra Hygiene option, Extra Drying option, Extra Silent option (Silent Wash), Extra Fast option, Energy Save option, Rinse-aid indicator, Salt indicator, Washing cycle indicators, End of cycle indicator • Chức năng UVON diệt khuẩn (UVON natural tech) • Chức năng ION diệt khuẩn (ION natural tech) • Hệ thống sấy khô Tubo (Drying system) • Khóa trẻ em (Child lock) • Chức năng tạo Ozon • Hệ thống chống Siphon • Điều khiển cảm ứng hiện đại, màn hình Led sang trọng • Chức năng hẹn giờ (Delay time) • Chức năng nâng hạ giàn rửa (Adjustable upper basket) • Vòi phun phụ • Độ ồn cực thấp maximum 42 dB • Tiêu chuẩn tiết kiệm năng lượng châu Âu A+++, chỉ số hiệu quả năng lượng A • Chức năng khóa máy khi có sự cố tác động (ngập nước, va đập, yếu điện, thiếu nước,...) • Chống rò nước từ máy • Hệ thống chuyển hướng điện (Electrical Diverter system) • Đèn báo máy hoạt động và kết thúc chương trình rửa • Chức năng kiểm tra độ cứng và làm mềm nước • Đèn chiếu sáng bên trong (One spot) • Bảo hành 05 năm","priceNum":30800000,"listPn":0,"salePn":30800000,"priceMode":"both","image":"https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1700107978718.jpg","images":["https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1700107978718.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490852905.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490852442.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853426.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853575.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853725.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-173449085368.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853605.jpg","https://kaff.vn/upload/products/large/may-rua-chen-kaff-kf-garde820-semi-1734490853664.jpg","https://kaff.vn/upload/products/large/may-rua-chen-am-ban-phan-kf-hb805se17-pro-1757658670600.jpg"],"specs":{},"features":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"model":"GARDE820SEMI","brand":"KAFF","category":"MÁY RỬA CHÉN","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"garde820semi-may-rua-chen-kaff-kf-garde820-semi","_addedBy":"vai-add-product"},"GRANITE KF - MONDY - 8552S":{"name":"Chậu rửa KAFF GRANITE KF - MONDY - 8552S","description":"Giá bán khuyến mãi 9,880,000đ Chậu rửa GRANITE KF - MONDY - 8552S • Chất liệu: Đá GRANITE • Màu sắc: Đen, trắng, vàng, kem, xám • Độ sâu bồn: 220mm • Kích thước: 850D x 515R mm • Đóng gói: 1 bộ tiêu chuẩn túi PE Foam (kèm siphon) • Bảo hành: 3 năm","priceNum":9880000,"listPn":0,"salePn":9880000,"priceMode":"both","image":"https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1704662337400.jpg","images":["https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1704662337400.jpg","https://kaff.vn/upload/products/large/chau-rua-granite-kf-mondy-8552s-1751539458342.jpg"],"specs":{"Màu sắc":"Đen, trắng, vàng, kem, xám • Độ sâu bồn: 220mm • Kích thước: 850D x 515R mm • Đóng gói: 1 bộ tiêu chuẩn túi PE Foam (kèm siphon) • Bảo hành: 3 năm"},"features":["icon ĐẶC TÍNH KỸ THUẬT","icon DOWNLOADS"],"model":"GRANITE KF - MONDY - 8552S","brand":"KAFF","category":"Chậu rửa chén","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"granite-kf-mondy-8552s-chau-rua-kaff-granite-kf-mondy-8552s","_addedBy":"vai-add-product"},"EL988":{"name":"Khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi","description":"Tổng quan  khóa Demax EL988 24K Brass App Wifi \nTrong thị trường khóa thông minh ngày nay, Khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi từ Malaysia nổi bật với thiết kế và tính năng đa dạng, đáp ứng mọi yêu cầu của khách hàng. Với màu sắc Mạ Vàng 24K, khóa này thực sự là một tác phẩm nghệ thuật cho các không gian đại sảnh và biệt thự.\nChất liệu bền bỉ và thiết kế sang trọng \nKhóa cao cấp Brass được chế tạo từ đồng thau nguyên chất với lớp mạ vàng 24K, mang đến vẻ đẹp sang trọng và độ bền cao. Thân khóa làm từ thép SUS 304 chất lượng, giúp khóa chống chịu được va đập và thời tiết khắc nghiệt, bảo vệ tối đa cho ngôi nhà của bạn. \nVới sự kết hợp giữa thiết kế đẳng cấp và chất liệu chất lượng, tạo nên một điểm nhấn độc đáo cho không gian của bạn.\nƯu điểm của khóa \nMở khóa đa phương thức và bảo mật tuyệt đối \nThiết bị có khả năng mở khóa theo nhiều phương thức khác nhau, đảm bảo tính bảo mật tuyệt đối cho ngôi nhà của bạn. Bạn có thể mở khóa bằng nhận diện khuôn mặt FACE ID-3D, mở khóa từ xa thông qua ứng dụng Wifi, sử dụng vân tay, mật mã, thẻ từ, hoặc chìa khóa chống sao chép.\nTiện ích và linh hoạt \nSản phẩm không chỉ hướng đến tính bảo mật mà còn mang lại nhiều tiện ích và linh hoạt cho người dùng. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể dễ dàng quản lý quyền truy cập của gia đình và khách khứa.\nNgoài ra, khóa còn tích hợp nhiều tính năng thông minh như nhận dạng vân tay bằng sinh trắc học FPC từ Thụy Điển, chức năng thoát hiểm từ bên trong, tay nắm đổi chiều Phải - Trái, cảnh báo đột nhập, vô hiệu hóa thẻ bị mất và chức năng cập nhật thông tin. Bạn sẽ luôn được nhắc nhở khi pin yếu, đảm bảo khóa luôn hoạt động hiệu quả.\nKết nối thông minh và dễ dàng sử dụng \nKhóa có thể kết nối với điện thoại thông qua ứng dụng App wifi đơn giản, giúp bạn kiểm soát và điều khiển từ xa một cách dễ dàng. Bạn có thể mở khóa, cập nhật thông tin và nhận thông báo trạng thái của khóa mọi lúc, mọi nơi.\nKhả năng lưu trữ \nKhóa điện tử thông minh Brass App Wifi được trang bị nhiều tính năng hữu ích. Với khả năng lưu trữ lên đến 100 dấu vân tay, 100 thẻ từ và 100 khuôn mặt, bạn có thể quản lý quyền truy cập một cách linh hoạt và tiện lợi. Đồng thời, khóa còn hỗ trợ thẻ từ theo máy và chìa khóa chống sao chép, giúp tăng cường tính bảo mật cho ngôi nhà của bạn.\nTính năng độc đáo và thông minh \nKhóa cửa Demax EL988 24K Brass App Wifi mang đến nhiều tính năng độc đáo và thông minh. Với nhận diện vân tay bằng sinh trắc học FPC từ Thụy Điển, khóa đảm bảo độ chính xác và an toàn cao.\nHơn nữa, khóa còn được trang bị chức năng thoát hiểm từ bên trong, giúp bạn dễ dàng ra vào ngôi nhà trong trường hợp khẩn cấp.\nSự đa dạng và phù hợp với không gian \nKhóa đại sảnh 24K từ Malaysia không chỉ chú trọng đến tính năng và bảo mật, mà còn phù hợp với nhiều loại không gian khác nhau. Với kích thước mặt trong và mặt ngoài cùng là 80 x 735mm, khóa này có thể dễ dàng lắp đặt vào cửa đi của các đại sảnh và khóa cửa gỗ đại sảnh biệt thự.\nĐơn giản và thuận tiện trong sử dụng \nTrên đây là những thông tin về khóa đại sảnh biệt thự Demax EL988 24K Brass App Wifi, một sản phẩm kết hợp hoàn hảo giữa công nghệ và sang trọng. Với thiết kế đẳng cấp, tính bảo mật cao, tính năng đa dạng và kết nối thông minh, khóa này sẽ mang đến trải nghiệm tuyệt vời cho ngôi nhà của bạn.","priceNum":59990000,"listPn":59990000,"salePn":59990000,"priceMode":"list","image":"https://thienkimhome.com/application/upload/products/Demax-SL988-24K-Brass-App-Wifi.jpg","images":["https://thienkimhome.com/application/upload/products/Demax-SL988-24K-Brass-App-Wifi.jpg","https://thienkimhome.com/application/upload/products/kich-thuoc-sl-988-24k.png","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-1.jpg","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-2.jpg","https://thienkimhome.com/application/upload/products/sl-988-24k-brass-1-3.jpg"],"specs":{"Mã sản phẩm":"Mã Mới: EL988 24K Brass Mã cũ: SL988 24K Brass App Wifi","Thương hiệu":"Demax Xem thông tin hãng","Xuất xứ":"Malaysia","Cách mở khoá":"– Mở khóa bằng nhận diện khuôn mặt FACE ID-3D – Mở khóa từ xa bằng App Wifi – Mở khóa bằng vân tay – Mở khóa bằng mật mã – Mở khóa bằng thẻ từ – Chìa khóa chống sao chép","Màu sắc":"Mạ Vàng 24K","Phù hợp cho":"Đại sảnh - biệt thự","Kích thước mặt trong":"80 x 735mm (Rộng x cao)","Kích thước mặt ngoài":"80 x 735mm (Rộng x cao)","Khả năng lưu trữ":"– Số vân tay: 100 – Số thẻ từ (cài đặt, sử dụng): 100 – Nhận dạng khuôn mặt: 100 – Thẻ từ theo máy: 2 – Chìa khóa chống sao chép: 2","Tính năng":"– Nhận dạng vân tay bằng sinh trắc học FPC – Thụy Điển – Chức năng thoát hiểm từ bên trong – Tay nắm đổi chiều Phải – Trái – Cảnh báo đột nhập – Vô hiệu hóa thẻ bị mật – Chức năng cập nhật thông tin – Nhắc nhở pin yếu","Vật liệu":"Đồng thau nguyên chất, mạ vàng 24 K – Thân khóa thép SUS 304","Nguồn điện":"7,4V Lithium (Pin sạc Lithium kép)","Nguồn khẩn cấp":"5V-2A, Micro USB","Độ dày cửa":"40~90 mm","Đố cửa":"> 100 mm","Loại cửa":"Cửa đi","Kết nối điện thoại":"Có","Phụ kiện kèm theo":"– Thẻ từ theo máy: 2 – Chìa khóa chống sao chép: 2"},"features":["Tổng quan  khóa Demax EL988 24K Brass App Wifi","Chất liệu bền bỉ và thiết kế sang trọng","Ưu điểm của khóa","Mở khóa đa phương thức và bảo mật tuyệt đối","Tiện ích và linh hoạt","Kết nối thông minh và dễ dàng sử dụng","Khả năng lưu trữ","Tính năng độc đáo và thông minh","Sự đa dạng và phù hợp với không gian","Đơn giản và thuận tiện trong sử dụng"],"model":"EL988","brand":"Demax","category":"Khóa điện tử","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"el988-khoa-dai-sanh-biet-thu-demax-el988-24k-brass-app-wifi","_addedBy":"vai-add-product"},"C1MO90B":{"name":"C1MO90B | Grob | Kệ Đựng Bát Đĩa Mix Oval Inox Sus304 Xước Mờ - cánh/phủ bì 900mm, lọt lòng 564mm","priceNum":4148000,"description":"KỆ ĐỰNG BÁT ĐĨA MIX OVAL INOX SUS304 XƯỚC MỜ","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"564*500*250 mm","Kích thước cánh/phủ bì":"900 mm","Khoang tủ/chiều rộng tủ":"900 mm","Kích thước lọt lòng/thực tế phụ kiện":"900 mm","Quy cách (Rộng x Sâu x Cao)":"R564 * S500 * C250 mm","kich_thuoc":"864 x 500 x 250mm","khoang_tu":"900mm"},"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p48.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p48.jpg"},"C1MO90":{"name":"C1MO90 | Grob | Kệ Đựng Xoong Nồi Mix Oval Inox Sus304 Xước Mờ - cánh/phủ bì 900mm, lọt lòng 564mm","priceNum":4083000,"description":"KỆ ĐỰNG XOONG NỒI MIX OVAL INOX SUS304 XƯỚC MỜ","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"564*500*250 mm","Kích thước cánh/phủ bì":"900 mm","Khoang tủ/chiều rộng tủ":"900 mm","Kích thước lọt lòng/thực tế phụ kiện":"900 mm","Quy cách (Rộng x Sâu x Cao)":"R564 * S500 * C250 mm","kich_thuoc":"864 x 500 x 250mm","khoang_tu":"900mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p47.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p47.jpg"},"H1270AT":{"name":"Hút Mùi Âm Tủ Canzy CZH1270AT","description":"Canzy CZ H1270AT: Máy hút mùi âm tủ kéo rút – Tinh gọn không gian, tối ưu sức mạnh Canzy CZ-H1270AT là dòng máy hút mùi âm tủ thế hệ mới, được thiết kế đặc biệt cho những căn hộ chung cư hoặc không gian bếp cần sự ngăn nắp tuyệt đối. Với cơ chế hoạt động kéo rút linh hoạt cùng khả năng vận hành siêu êm ái, CZ H1270AT k","priceNum":5980000,"listPn":5980000,"salePn":5980000,"priceMode":"list","image":"https://bizweb.dktcdn.net/100/357/739/products/d8a4ae24-299d-442f-8a77-a7aaeae9219b.jpg","images":["https://bizweb.dktcdn.net/100/357/739/products/d8a4ae24-299d-442f-8a77-a7aaeae9219b.jpg","https://bizweb.dktcdn.net/100/357/739/products/3cebb626-dd99-4f8d-ae1e-067ddac165a0.jpg"],"specs":{"Tiêu chí kỹ thuật":"Thông số chi tiết","Model":"CZ H1270AT","Thương hiệu":"Canzy (Chính hãng)","Kiểu máy":"Máy hút mùi âm tủ kéo rút (Kéo ra bật – Đóng vào tắt)","Chất liệu":"Inox cao cấp – Kính cường lực","Động cơ":"160W (Vận hành ổn định)","Công suất hút":"950 m³/h (Cực mạnh trong phân khúc)","Độ ồn":"≤ 38 dB (Siêu êm ái)","Điều khiển":"3 tốc độ linh hoạt","Hệ thống lọc mỡ":"2 lưới lọc Aluminum 3 lớp (Dễ vệ sinh)","Chế độ khử mùi":"Than hoạt tính hoặc ống thoát Ø120mm","Hệ thống chiếu sáng":"Đèn 2 × 40W (Hỗ trợ nấu nướng)","Tiện ích an toàn":"Lẫy cài Inox chống cháy, hẹn giờ mặc định","Đường kính ống thoát":"Ø120 mm"},"features":["• Tối ưu diện tích: Toàn bộ thân máy được giấu kín trong tủ bếp, chỉ để lộ phần thanh kéo thanh mảnh, giúp gian bếp trông rộng rãi và chuyên nghiệp hơn.","Động cơ 160W nội lực: Dù thiết kế nhỏ gọn, CZ H1270AT sở hữu công suất hút lên đến 950m3/h, loại bỏ nhanh chóng mùi thức ăn đậm mùi nhất.","Hệ thống khử mùi kép: Tích hợp chế độ khử mùi tại chỗ bằng than hoạt tính hoặc xả trực tiếp qua ống thoát Ø120mm, linh hoạt cho mọi địa hình lắp đặt.","Máy này có hẹn giờ không? Có, CZ H1270AT tích hợp chế độ hẹn giờ mặc định giúp bạn yên tâm để máy tự làm sạch không khí sau khi nấu.","Kéo ra một nửa máy có chạy không? Máy bắt đầu hoạt động ngay khi bạn kéo nhẹ thanh trượt, tuy nhiên nên kéo hết cỡ để diện tích hút khói là lớn nhất."],"model":"H1270AT","brand":"Canzy","category":"Máy hút mùi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"h1270at-hut-mui-am-tu-canzy-czh1270at","_addedBy":"vai-add-product"},"CZI39992C":{"name":"Bếp Điện Từ Canzy CZI39992C SERI8","description":"Bếp từ đôi Canzy CZ-I39992C Serial 8.0 là mẫu bếp âm hai vùng nấu dành cho căn bếp hiện đại, kết hợp mặt kính ELCD Platinum Ceramic đen bóng với bo viền nhôm màu sáng. Hai vùng từ vận hành độc lập, điều khiển cảm ứng trượt 9 mức nhiệt và công nghệ Inverter giúp nấu linh hoạt, tiết kiệm điện trong quá trình sử dụng hằng","priceNum":12980000,"listPn":12980000,"salePn":12980000,"priceMode":"list","image":"https://bizweb.dktcdn.net/100/357/739/products/758e2570-49e4-44aa-bd20-b7d006e318ad.jpg","images":["https://bizweb.dktcdn.net/100/357/739/products/758e2570-49e4-44aa-bd20-b7d006e318ad.jpg","https://bizweb.dktcdn.net/100/357/739/products/gen-n-6-1387979f-8fc6-4b67-adcb-5b8b4cbf877c.jpg"],"specs":{},"features":["Số vùng nấu 2 vùng từ","Mặt kính ELCD Platinum Ceramic đen bóng, bo viền nhôm màu sáng","Điều khiển Cảm ứng Slide, 9 cấp độ nấu","Công nghệ Inverter thông minh, tiết kiệm khoảng 30% điện năng","Vùng nấu trái Booster 2.400W","Vùng nấu phải Booster 2.400W","Điện áp 220/240V","Kích thước mặt bếp 730 x 430 mm","Kích thước cắt đá 690 x 390 mm","Chức năng nấu Sôi liu riu, Warm, Stir Fry, Pause, Booster, hẹn giờ","An toàn Tự ngắt khi không có nồi; cảnh báo dư nhiệt; chống tràn; khóa trẻ em; khóa phím; bảo vệ quá nhiệt - quá áp"],"model":"CZI39992C","brand":"Canzy","category":"Bếp từ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"czi39992c-bep-dien-tu-canzy-czi39992c-seri8","_addedBy":"vai-add-product"},"BD-1054HVOW":{"name":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","description":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW\ncó khối lượng giặt 10.5 kg thích hợp với gia đình có từ 7 thành viên trở lên. Máy hoạt động êm ái với công nghệ Inverter tiết kiệm điện. Các công nghệ giặt nước nóng và giặt hơi nước hỗ trợ diệt khuẩn giúp quần áo sạch sẽ, tinh tươm một cách dễ dàng, giản đơn.\nCông nghệ giặt hiện đại\nCông nghệ giặt nước nóng\ntrên\nmáy giặt Hitachi\ngiúp làm sạch hiệu quả hơn nhờ sử dụng nước ở nhiệt độ cao để hòa tan vết bẩn và dầu mỡ bám trên sợi vải. Quá trình giặt nước nóng còn hỗ trợ loại bỏ vi khuẩn và tác nhân gây dị ứng, phù hợp cho quần áo trẻ em, đồ lót hoặc người có làn da nhạy cảm, đồng thời giúp quần áo sạch sâu và thơm hơn sau mỗi lần giặt.\nCông nghệ giặt hơi nước\nsử dụng hơi nước nhiệt độ cao thẩm thấu sâu vào sợi vải, giúp diệt khuẩn, loại bỏ tác nhân gây dị ứng và giảm mùi hôi bám trên quần áo. Đồng thời,\ngiặt hơi nước\ncòn hỗ trợ làm mềm sợi vải và giảm nhăn, giúp quần áo dễ ủi hơn sau khi giặt, phù hợp cho gia đình có trẻ nhỏ hoặc người có làn da nhạy cảm.\n*Hình ảnh chỉ mang tính chất minh họa\nTổng quan thiết kế\nMáy giặt cửa trước, lồng ngang\ncó khối lượng giặt\n10.5 kg\nthích hợp với gia đình đông người từ 7 thành viên trở lên. Vỏ máy có chất liệu kim loại sơn tĩnh điện chắc chắn, bên, kết hợp với\nlồng giặt được làm từ chất liệu inox\nnên dễ dàng vệ sinh.\n*Hình ảnh chỉ mang tính chất minh họa\nCửa máy được làm từ nhựa cao cấp mang hiệu quả giúp giảm trọng lượng của máy. Thiết kế cửa mở rộng giúp việc cho và lấy quần áo, chăn mền trở nên dễ dàng hơn. Bảng điều khiển bố trí phía trước, kết hợp\nnúm xoay, cảm ứng và màn hình\ngiúp người dùng dễ dàng thao tác.\n*Hình ảnh chỉ mang tính chất minh họa\nThiết bị sử dụng kiểu\nđộng cơ gián tiếp truyền động dây curoa\nnên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.\nCông nghệ tiết kiệm điện\nMáy giặt Inverter\ngiúp máy giặt điều chỉnh công suất động cơ linh hoạt theo khối lượng và giai đoạn giặt, nhờ đó tiết kiệm điện năng, vận hành êm ái và giảm rung ồn. Đồng thời, công nghệ này còn góp phần duy trì độ bền ổn định cho máy trong quá trình sử dụng lâu dài.\n*Hình ảnh chỉ mang tính chất minh họa\nTiện ích khác\nTiện ích\ngiặt chống nhăn\nđược thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.\nHẹn giờ giặt\ngiúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.\nTùy chỉnh số vòng vắt, nhiệt độ\nnước\ncho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.\nVệ sinh lồng giặt bằng nước nóng\ngiúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt.\n*Hình ảnh chỉ mang tính chất minh họa\nMáy giặt Hitachi Inverter 10.5 kg BD-1054HVOW có khối lượng giặt 10.5 kg phù hợp gia đình đông từ 7 thành viên trở lên. Máy trang bị Inverter vận hành êm, tiết kiệm điện, kết hợp giặt nước nóng và giặt hơi nước giúp diệt khuẩn, sạch sâu mà không bị mất phom dáng.\nXem thêm","priceNum":5990000,"listPn":10990000,"salePn":5990000,"priceMode":"both","image":"https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806.jpg","images":["https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-638963804276138450.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-638963804285992497.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-99-638962219298592474.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-5-639063368977740536.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-639063369030108820.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-2-639063369065311055.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-3-639063369104866518.jpg","https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-4-639063369150311821.jpg"],"specs":{"Loại máy giặt":"Cửa trước","Lồng giặt":"Lồng ngang","Khối lượng giặt":"10.5 Kg","Số người sử dụng":"Trên 7 người","Kiểu động cơ":"Truyền động gián tiếp (dây Curoa)","Tốc độ quay vắt tối đa":"1400 vòng/phút","Chất liệu lồng giặt":"Inox","Chất liệu vỏ máy":"Kim loại sơn tĩnh điện","Chất liệu cửa máy":"Nhựa","Sản xuất tại":"Trung Quốc","Năm ra mắt":"2025","Thời gian bảo hành động cơ":"10 năm","Hiệu suất sử dụng điện":"5.7 Wh/kg","Loại Inverter":"Công nghệ Inverter","Chương trình":"Đồ màu Vải mỏng Đồ trẻ em Đồ lót Đồ len Đồ hỗn hợp Đồ cotton Đồ Jeans Áo sơ mi Xả + vắt Vệ sinh lồng giặt Vắt Giặt vệ sinh Giặt tiết kiệm Giặt nhanh Giặt chăn bông","Công nghệ giặt":"Giặt nước nóng Giặt hơi nước","Bảng điều khiển":"Song ngữ Anh - Việt có núm xoay, cảm ứng và màn hình hiển thị","Tiện ích":"Vệ sinh lồng giặt Khóa trẻ em Hẹn giờ giặt Chống nhăn Chỉnh số vòng vắt Chỉnh nhiệt độ nước","Kích thước - Khối lượng":"Cao 85 cm - Ngang 60 cm - Sâu 63.5 cm - Nặng 70 kg","Chiều dài ống cấp nước":"110 cm","Chiều dài ống thoát nước":"180 cm","Hãng":"Hitachi. Xem thông tin hãng"},"features":["Thiết bị sử dụng kiểu động cơ gián tiếp truyền động dây curoa nên vận hành êm ái; kiểu động cơ này cũng giúp máy điều chỉnh linh hoạt hơn với khối lượng giặt khác nhau.","Tiện ích giặt chống nhăn được thực hiện sau khi vắt quần áo, lồng giặt tiếp tục đảo trộn nhẹ nhàng để quần áo không bị bết dính và tạo nếp.","Hẹn giờ giặt giúp người giặt chủ động thời gian làm sạch quần áo mà không cần phải canh giờ giặt giũ khi bận rộn.","Tùy chỉnh số vòng vắt, nhiệt độ nước cho phép người dùng chủ động gia giảm vòng vắt, nhiệt độ tùy theo chất liệu vải để tránh tình trạng vải bị xơ xù hay quần áo mất phom dáng.","Vệ sinh lồng giặt bằng nước nóng giúp tăng khả năng tiêu diệt vi khuẩn tích tụ, hỗ trợ bảo vệ sức khỏe gia đình khi thường xuyên sử dụng máy giặt."],"model":"BD-1054HVOW","brand":"Hitachi","category":"Máy giặt / sấy","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"bd-1054hvow-may-giat-hitachi-inverter-10-5-kg-bd-1054hvow","_addedBy":"vai-add-product"},"GWE35":{"name":"Giá treo quần âu đôi Garis GWE35","description":"Giá treo quần âu đôi GW35E Thiết kế tiện lợi, chất liệu bền đẹp, tối ưu không gian tủ quần áo. Dễ lắp đặt, hỗ trợ lưu trữ quần âu ngăn nắp và gọn gàng","priceNum":2950000,"listPn":0,"salePn":2950000,"priceMode":"list","image":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C3%B4i%20GW35E.jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C3%B4i%20GW35E.jpg"],"specs":{},"features":["Màu xanh Emerald, tạo nên vẻ đẹp và sự tươi mới cho không gian treo quần áo. Màu sắc này cũng tạo điểm nhấn với sự phong cách cho sản phẩm."],"model":"GWE35","brand":"Garis","category":"Giá treo quần âu đôi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gwe35-gia-treo-quan-au-doi-garis-gwe35","_addedBy":"vai-add-product"},"GWE38":{"name":"Giá treo quần âu đơn cân Garis GWE38","description":"Giá treo quần âu đơn cân GW38E Thiết kế cân đối, bền đẹp, tối ưu hóa không gian tủ. Dễ lắp đặt, giữ quần âu phẳng phiu và ngăn nắp!","priceNum":2484000,"listPn":2484000,"salePn":2484000,"priceMode":"list","image":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C6%A1n%20c%C3%A2n%20GW38E.jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91%C6%A1n%20c%C3%A2n%20GW38E.jpg"],"specs":{},"features":["Màu xanh Emerald, tạo nên vẻ đẹp và sự tươi mới cho không gian treo quần áo. Màu sắc này cũng tạo điểm nhấn và sự phong cách cho sản phẩm."],"model":"GWE38","brand":"Garis","category":"Giá treo quần âu đơn cân ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gwe38-gia-treo-quan-au-don-can-garis-gwe38","_addedBy":"vai-add-product"},"1054HVOW":{"name":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW - giá tốt, mua trả chậm","description":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW giá rẻ chính hãng, mua trả chậm 0% lãi suất, bảo hành chính hãng - Giao hàng tận nơi, lắp đặt nhanh chóng, khuyến mãi hấp dẫn tại Điện máy XANH!","priceNum":7170000,"listPn":9290000,"salePn":7170000,"priceMode":"both","image":"https://cdn.tgdd.vn/2026/09/timerseo/357869.jpg","images":["https://cdn.tgdd.vn/2026/09/timerseo/357869.jpg"],"specs":{},"features":[],"model":"1054HVOW","brand":"Siêu thị Điện Máy XANH","category":"Máy giặt / sấy","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"1054hvow-may-giat-hitachi-inverter-10-5-kg-bd-1054hvow-gia-tot-mua-tra-cham","_addedBy":"vai-add-product"},"GW0470":{"name":"Giá treo quần âu đa năng kết hợp khay đựng đồ Garis GW0470","description":"Giá treo quần âu đa năng GW04 – Thiết kế linh hoạt, chất liệu bền đẹp, phù hợp cho mọi không gian tủ quần áo. Giúp quần âu luôn thẳng phẳng và ngăn nắp.","priceNum":4730400,"listPn":4730400,"salePn":4730400,"priceMode":"list","image":"https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91a%20n%C4%83ng%20GW04%201.jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A2u%20%C4%91a%20n%C4%83ng%20GW04%201.jpg"],"specs":{"Chất liệu":": Khung bằng thép sơn tĩnh điện, nan bằng thép phủ nano","Tải trọng":": 30kg","Màu sắc":": Trắng","Bảo hành":": 24 tháng"},"features":[],"model":"GW0470","brand":"Garis","category":"Giá treo quần âu đa năng","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gw0470-gia-treo-quan-au-da-nang-ket-hop-khay-dung-do-garis-gw0470","_addedBy":"vai-add-product"},"XL.90S2":{"name":"GIÁ BÁT NÂNG HẠ NAN DẸT XL.90S2","description":"ĐẶC TÍNH SẢN PHẨM \nGiá bát đĩa nâng hạ 2 tầng nan Dẹt SUS304\nBề mặt điện hóa xước mờ\nKhung chính bằng Thép Carbon sơn nhiệt màu xám đậm\nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợp\nvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval bằng INOX SUS 304\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT NÂNG HẠ NAN DẸT XL.90S2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":10890000,"listPn":0,"salePn":10890000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2026/09/XL.60.70.80.90S1_2-02.jpg","images":["https://grandx.com.vn/wp-content/uploads/2026/09/XL.60.70.80.90S1_2-02.jpg"],"specs":{"Mã sản phẩm":"XL.90S2","Chất liệu rổ":"SUS304","Chất liệu khung":"Inox 304","Kích thước sản phẩm":"R864*S280*C550","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["ĐẶC TÍNH SẢN PHẨM","Giá bát đĩa nâng hạ 2 tầng nan Dẹt SUS304","Bề mặt điện hóa xước mờ","Khung chính bằng Thép Carbon sơn nhiệt màu xám đậm","Điều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợp","với nhu cầu sử dụng thực tế","2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh","Ống tay cầm hình oval bằng INOX SUS 304","THÔNG SỐ SẢN PHẨM","Mở rộng"],"model":"XL.90S2","brand":"GrandX","category":"Phụ kiện tủ bếp trên","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xl-90s2-gia-bat-nang-ha-nan-det-xl-90s2","_addedBy":"vai-add-product"},"XS.40S2":{"name":"GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S2 - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\n","priceNum":3950000,"listPn":0,"salePn":3950000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2025/01/XS.25S.40S2.png","images":["https://grandx.com.vn/wp-content/uploads/2025/01/XS.25S.40S2.png"],"specs":{"Mã sản phẩm":"XS.40S2","Chất liệu rổ":"SUS304","Chất liệu khung":"INOX 304","Kích thước sản phẩm (mm)":"R335*S485*C450","Chiều rộng tủ (mm)":"400"},"features":["ĐẶC TÍNH SẢN PHẨM","Giá đựng chai lọ gia vị nan dẹt","Chất liệu SUS304","Bề mặt hoàn thiện điện hóa xước mờ","Dùng cho cánh kéo","Hệ chuyển động sử dụng bộ ray âm","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"model":"XS.40S2","brand":"GrandX","category":"Giá dao thớt, gia vị","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xs-40s2-gia-dung-chai-lo-gia-vi-nan-det-xs-40s2-grandx","_addedBy":"vai-add-product"},"XS.40S1":{"name":"GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S1 - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng chai lọ gia vị nan dẹt\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho cánh kéo\nHệ chuyển động sử dụng bộ ray âm\nđộ bền cao.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ ĐỰNG CHAI LỌ GIA VỊ NAN DẸT XS.40S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":3630000,"listPn":0,"salePn":3630000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XS.25S.40S2-PHOI-CANH.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XS.25S.40S2-PHOI-CANH.png"],"specs":{"Mã sản phẩm":"XS.40S1","Chất liệu rổ":"SUS304","Chất liệu khung":"Thép Carbon sơn nhiệt","Kích thước sản phẩm (mm)":"R335*S485*C450","Chiều rộng tủ (mm)":"400"},"features":["ĐẶC TÍNH SẢN PHẨM","Giá đựng chai lọ gia vị nan dẹt","Chất liệu SUS304","Bề mặt hoàn thiện điện hóa xước mờ","Dùng cho cánh kéo","Hệ chuyển động sử dụng bộ ray âm","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"model":"XS.40S1","brand":"GrandX","category":"Giá dao thớt, gia vị","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xs-40s1-gia-dung-chai-lo-gia-vi-nan-det-xs-40s1-grandx","_addedBy":"vai-add-product"},"XS.40T":{"name":"GIÁ GIA VỊ TITANIUM XS.40T - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị Grand X với ngăn kéo thu gọn trong hộc tủ, tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng nhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ TITANIUM XS.40T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":6680000,"listPn":0,"salePn":6680000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-copy.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-copy.png"],"specs":{},"features":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"model":"XS.40T","brand":"GrandX","category":"Giá dao thớt, gia vị","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xs-40t-gia-gia-vi-titanium-xs-40t-grandx","_addedBy":"vai-add-product"},"SUS304":{"name":"GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2 - Grandx","description":"Đặc tính sản phẩm \nGiá bát đĩa nâng hạ 2 tầng nan Oval SUS304\nBề mặt điện hóa xước mờ \nKhung chính bằng INOX SUS304 màu xám đậm \nĐiều chỉnh trợ lực \nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval nâng bằng INOX SUS 304 \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":11100000,"listPn":0,"salePn":11100000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg"],"specs":{"Mã sản phẩm":"XL.90M2","Chất liệu rổ":"SUS304","Chất liệu khung":"INOX 304","Kích thước sản phẩm (mm)":"R864*S280*C550","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["Đặc tính sản phẩm","Giá bát đĩa nâng hạ 2 tầng nan Oval SUS304","Bề mặt điện hóa xước mờ","Khung chính bằng INOX SUS304 màu xám đậm","Điều chỉnh trợ lực","Điều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế","2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh","Ống tay cầm hình oval nâng bằng INOX SUS 304","THÔNG SỐ SẢN PHẨM","Mở rộng"],"model":"SUS304","brand":"GrandX","category":"Phụ kiện tủ bếp trên","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"sus304-gia-bat-dia-nang-ha-nan-oval-sus304-xl-90m2-grandx","_addedBy":"vai-add-product"},"XK.40M2":{"name":"GIÁ DAO THỚT GIA VỊ NAN OVAL XK.40M2 - Grandx","description":"Đặc tính sản phẩm \nGiá dao thớt gia vị nan Oval\nChất liệu SUS304\nBề mặt hoàn thiện điện hóa xước mờ\nDùng cho tủ cánh kéo \nTính năng đột phá \nTích hợp giỏ đựng thìa, dĩa\nKhay đựng nước nhựa cao cấp ABS có viền nhôm 2 mặt chống cong vênh\nHệ chuyển động sử dụng bộ ray âm hoạt động ổn định, độ bền cao \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ DAO THỚT GIA VỊ NAN OVAL XK.40M2” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":5230000,"listPn":0,"salePn":5230000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-5-2.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-5-2.png"],"specs":{"Mã sản phẩm":"XK.40M2","Chất liệu rổ":"SUS304 Oval","Chất liệu khung":"INOX 304 sơn nhiệt","Kích thước sản phẩm (mm)":"R357*S438*C506","Chiều rộng tủ (mm)":"400mm"},"features":["Tích hợp giỏ đựng thìa, dĩa Khay đựng nước nhựa cao cấp ABS có viền nhôm 2 mặt chống cong vênh Hệ chuyển động sử dụng bộ ray âm hoạt động ổn định, độ bền cao"],"model":"XK.40M2","brand":"GrandX","category":"Giá dao thớt, gia vị","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xk-40m2-gia-dao-thot-gia-vi-nan-oval-xk-40m2-grandx","_addedBy":"vai-add-product"},"SMI6ZCS16E":{"name":"MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E","description":"Trang chủ / Sản phẩm / MÁY RỬA CHÉN BOSCH / MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E \nChi tiết sản phẩm\nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E\n33,300,000 ₫ 26,590,000 ₫ \r\nLượt xem : 5154 \r\nMáy Rửa Chén Bosch SMI6ZCS16E- Nhập Khẩu Đức – Bảo Hành 3 Năm\nMÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E số lượng \nMua hàng \nDanh mục: MÁY RỬA CHÉN BOSCH \nTừ khóa: bosch SMI6ZCS16E , máy rửa chén bosch , SMI6ZCS16E \nMô tả \nĐánh giá \nMô tả\nMáy Rửa Chén Bosch SMI6ZCS16E \n* THÔNG TIN KỸ THUẬT: \nMáy rửa bát Bosch SMI6ZCS16E có xuất xứ từ Châu Âu, mang đến bước đột phá cho người dùng những trải nghiệm hoàn toàn mới. Máy được trang bị nhiều công nghệ hiện đại như Sấy Zeolite® (Zeolith) – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo. \nGiàn Max Flex: tải máy rửa chén linh hoạt và thoải mái, có bánh xe chạy êm. \nNgăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn. \nGiá đỡ 3 tầng: Chiều cao có thể điều chỉnh theo 3 mức lên đến 5 cm, ngay cả khi giàn phía trên đã được chất đầy đồ. \nSilence Pro: máy rửa chén cực kỳ yên tĩnh (40 decibel). \nChương trình im lặng: Với chương trình này, tiếng ồn khi vận hành máy rửa chén của bạn sẽ tự động giảm xuống mức độ ồn thấp nhất. \nNgoại hình và thiết kế \nMáy rửa bát Bosch SMI6ZCS16E có thiết kế bán âm, được làm từ chất liệu thép không gỉ, bạn cần ốp thêm tấm gỗ vào mặt trước của máy cho đồng bộ với hệ tủ giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn \nBảng điều khiển của Máy rửa bát Bosch SMI6ZCS16E được đặt ở ngay phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng. \n2 Giàn rửa + 1 ngăn kéo: Hệ thống giàn rửa của Máy rửa bát Bosch SMI6ZCS16E gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn. Máy có sức chứa lên tới 14 bộ chén bát, phù hợp cho gia đình từ 4-6 thành viên. \nKích thước thiết bị: Máy rửa bát Bosch SMI6ZCS16E có kích thước Cao 815-875 x Rộng 598 x Sâu 573 mm với trọng lượng 47 kg. \nKích thước lắp đặt: Cao 815-875 x Rộng 600 x Sâu min 550 mm. \nTính năng và công nghệ \n8 Chương trình rửa \nTùy vào số lượng, chất liệu và độ bẩn của bát đĩa mà người dùng lựa chọn chương trình rửa phù hợp để tối ưu hiệu quả rửa và sấy. Máy rửa bát Bosch SMI6ZCS16E được trang bị 8 chương trình rửa đa dạng: \nRửa tiết kiệm 50°C (Eco) \nRửa tự động 45 – 65°C (Auto 45 – 65°C) \nRửa thông minh (Intelligence) \nRửa chuyên sâu 70°C (Intensive) \nRửa nhanh 60°C (Express) \nRửa ly 40°C  \nRửa yên tĩnh 50°C \nRửa yêu thích/ Rửa tráng (Favourite) \nChương trình rửa đặc biệt: \nRửa nhanh tăng cường (SpeedPerfect Plus) \nSấy tăng cường (ExtraDry) \nĐiều khiển từ xa (Home Connect) \nRửa tăng cường giàn dưới cùng (IntensizeZone) \nZeolith \nVới Công nghệ sấy Zeolith trên Máy rửa bát Bosch SMI6ZCS16E giúp bát đĩa khô hoàn hảo hơn. Đây là một khoáng chất tự nhiên có tác dụng hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm. Quá trình hút hơi ẩm này được lặp đi lặp lại nhiều lần cho đến khi kết thúc quá trình rửa. Nhờ công nghệ Zeolith mà bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn. Bởi sấy Zeolith không sử dụng điện năng để sấy khô. \nFavourite / Rửa tráng \nTính năng Favourite giúp quá trình rửa và sấy bát đĩa trở nên dễ dàng hơn. Đồng thời tận dụng tối đa công dụng mà máy rửa bát mang lại. \nMặc định, chương trình Favourite sẽ là tính năng rửa tráng bát đĩa (PreWash). Khi tùy chọn Favourite, người dùng có thể kết hợp một chương trình cơ bản với một tính năng đặc biệt mà bạn yêu thích. Chẳng hạn như bạn kết hợp rửa Eco 50 độ với sấy hé cửa hiệu quả EfficientDry. Sau đó, bạn có thể lưu lại chương trình kết hợp này bằng cách nhấn giữ nút Favourite trong vòng 3 giây. Và khi cần sử dụng tính năng kết hợp này, người dùng chỉ việc kích hoạt Favourite với một lần chạm để bắt đầu. \nNgoài ra, người dùng cũng có thể tự thiết lập chương trình Favourite ngay trên ứng dụng Home Connect. \nExtra Clean Zone \nMáy rửa bát Bosch SMI6ZCS16E được trang bị hệ thống vòi phun Extra Clean Zone. Đây là hệ thống vòi phun thủy lực giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa. Người dùng cũng có thể chủ động bật tắt thông qua công tắc ON/OFF ngay trên hệ thống. \nMachine Care \nDầu mỡ và các cặn bẩn thức ăn có thể làm tăng sự phát triển của mùi hôi và các loại vi khuẩn, nấm mốc bám bên trong khoang máy. Điều này gây ảnh hưởng không nhỏ đến kết quả làm sạch bát đĩa của máy và sức khỏe con người. Vì vậy, người dùng nên có thói quen thường xuyên vệ sinh máy rửa bát theo định kỳ. \nMachine Care là chương trình vệ sinh tự động buồng máy rửa bát. Khi kích hoạt, tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo. \nChương trình này được sử dụng bằng cách cho chạy không tải (Không bát đĩa, đũa muỗng, thìa dĩa,…) kết hợp với chất tẩy rửa vệ sinh máy đặc biệt. Người dùng chỉ việc kích hoạt Machine Care và chọn Start để bắt đầu mà không cần kết hợp với chương trình nào khác. Thời lượng của tính năng Machine Care là 135 phút. \nNgoài ra, sau 30 chu kỳ rửa, Machine Care sẽ nhắc nhở bạn vệ sinh máy. Hoặc nếu thiết bị không nhắc nhở, chúng tôi khuyên bạn nên thực hiện vệ sinh khoang máy theo định kỳ (sau 30 lần rửa). \nChức năng an toàn \nMáy rửa bát Bosch SMI6ZCS16E được trang bị các tính năng và hệ thống bảo vệ an toàn cho người sử dụng: \nKhóa trẻ em (ChildLock): là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển. \nHệ thống AquaStop: là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài. \nHệ thống chống sét lan truyền: là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan. \nSản phẩm tương tự \nGiảm giá! \nMÁY RỬA CHÉN ĐỂ BÀN BOSCH SKS62E32EU\n21,400,000 ₫ 15,890,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ĐỘC LẬP BOSCH SMS6ZCI00P\n30,790,000 ₫ 24,790,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN ÂM TỦ BOSCH SMV4HCX48E\n30,390,000 ₫ 24,190,000 ₫ \r\nMua hàng \nGiảm giá! \nMÁY RỬA CHÉN BOSCH SMS4HMC25M\n27,990,000 ₫ 18,690,000 ₫ \r\nMua hàng","priceNum":24500000,"listPn":46750000,"salePn":24500000,"priceMode":"both","image":"https://boschs.com.vn/wp-content/uploads/2025/02/fef-Sao-chep.jpg","images":["https://boschs.com.vn/wp-content/uploads/2025/02/fef-Sao-chep.jpg"],"specs":{"Lượt xem":"5154"},"features":["Giàn Max Flex: tải máy rửa chén linh hoạt và thoải mái, có bánh xe chạy êm.","Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn.","Giá đỡ 3 tầng: Chiều cao có thể điều chỉnh theo 3 mức lên đến 5 cm, ngay cả khi giàn phía trên đã được chất đầy đồ.","Silence Pro: máy rửa chén cực kỳ yên tĩnh (40 decibel).","Chương trình im lặng: Với chương trình này, tiếng ồn khi vận hành máy rửa chén của bạn sẽ tự động giảm xuống mức độ ồn thấp nhất."],"model":"SMI6ZCS16E","brand":"BOSCH","category":"Máy rửa chén","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"smi6zcs16e-may-rua-chen-am-tu-bosch-smi6zcs16e","_addedBy":"vai-add-product"},"KR14L":{"name":"THÙNG RÁC TRÒN EUROKING KR.14L","description":"Mã sản phẩm: KR.14L Hãng sản xuất: EUROKING Loại: Thùng rác","priceNum":1100000,"listPn":0,"salePn":1100000,"priceMode":"both","image":"http://ahabep.com/upload/images/thung-rac-tron-euroking-kr-14l.png","images":["http://ahabep.com/upload/images/thung-rac-tron-euroking-kr-14l.png"],"specs":{"THÔNG SỐ SẢN PHẨM VÀ KÍCH THƯỚC LẮP ĐẶT Kích thước sản phẩm":"14 lít W370*D330*H400"},"features":[],"model":"KR14L","brand":"EUROKING","category":"THÙNG ĐỰNG RÁC NHÀ BẾP","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"kr14l-thung-rac-tron-euroking-kr-14l","_addedBy":"vai-add-product"},"XD.80T":{"name":"GIÁ BÁT ĐĨA TITANIUM XD.90T - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng bát đĩa, với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc lưu trữ tối ưu hóa vật liệu, kết cấu và công năng , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc …đáy phủ lớp chống trượt chống va đập đồ. \nGiá bát đĩa GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \n","priceNum":9300000,"listPn":0,"salePn":9300000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png"],"specs":{"Mã sản phẩm":"XD.80T","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R864*S470*C226","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"model":"XD.80T","brand":"GrandX","category":"Giá bát đĩa, Xoong nồi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xd-80t-gia-bat-dia-titanium-xd-90t-grandx","_addedBy":"vai-add-product"},"XPR.450S1":{"name":"Tủ đồ khô cánh mở GrandX XPR.450S","description":"Tủ đồ khô cánh mở XPR.450S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.450S1 \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.450S1 được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.450S1 còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.450S1 nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 415mm , dành riêng cho các khoang tủ rộng 450mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.450S1 được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.450S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.450S1 chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\n","priceNum":13120000,"listPn":0,"salePn":13120000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg","images":["https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg"],"specs":{"Mã sản phẩm":"XPR.450S1","Chất liệu":"INOX SUS 304","Kích thước sản phẩm (mm)":"R385*S500*C(1650-1950)","Kích thước lọt lòng tủ (mm)":"≥ 415","Chiều rộng tủ (mm)":"450","Số tầng rổ":"6 tầng","Tải trọng mỗi tầng":"Tối đa 5kg"},"features":["Khả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.","Bề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.","Khung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp."],"model":"XPR.450S1","brand":"GrandX","category":"Tủ đồ khô","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xpr-450s1-tu-do-kho-canh-mo-grandx-xpr-450s","_addedBy":"vai-add-product"},"XR.G302B":{"name":"THÙNG GẠO MẶT KÍNH NÚT NHẤN XR.G302B - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nThùng gạo mặt kính cường lực cao cấp \nChất liệu vỏ thùng đựng gạo INOX cao cấp \nĐạt các tiêu chuẩn vệ sinh an toàn cho sức khỏe được kiểm tra chứng nhận bởi FDA \nMặt trước kính cường lực \nNhấn nút để lấy gạo dễ dàng \nDung tích chứa tối đa: 25kg \nLắp đặt âm tủ \nKích thước sản phẩm R300*S405*C650 mm \nKích thước khoét âm tủ R264*S410*C630 mm \n","priceNum":2920000,"listPn":0,"salePn":2920000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XR.G302B-1024x683.jpg","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XR.G302B-1024x683.jpg"],"specs":{"Mã sản phẩm":"XR.G302B","Chất liệu":"SUS304 + Kính","Đặc tính sản phẩm":"Màu đen","Kích thước sản phẩm (mm)":"R300*S396*C650","Chiều rộng tủ (mm)":"300","Đơn vị":"Bộ"},"features":["ĐẶC TÍNH SẢN PHẨM","Thùng gạo mặt kính cường lực cao cấp","Chất liệu vỏ thùng đựng gạo INOX cao cấp","Đạt các tiêu chuẩn vệ sinh an toàn cho sức khỏe được kiểm tra chứng nhận bởi FDA","Mặt trước kính cường lực","Nhấn nút để lấy gạo dễ dàng","Dung tích chứa tối đa: 25kg","Lắp đặt âm tủ","Kích thước sản phẩm R300*S405*C650 mm","Kích thước khoét âm tủ R264*S410*C630 mm"],"model":"XR.G302B","brand":"GrandX","category":"Thùng gạo","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xr-g302b-thung-gao-mat-kinh-nut-nhan-xr-g302b-grandx","_addedBy":"vai-add-product"},"XL90M2":{"name":"GIÁ BÁT ĐĨA NÂNG HẠ NAN OVAL SUS304 XL.90M2 - Grandx","description":"Đặc tính sản phẩm \nGiá bát đĩa nâng hạ 2 tầng nan Oval SUS304\nBề mặt điện hóa xước mờ \nKhung chính bằng INOX SUS304 màu xám đậm \nĐiều chỉnh trợ lực \nĐiều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế\n2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh\nỐng tay cầm hình oval nâng bằng INOX SUS 304 \n","priceNum":11100000,"listPn":0,"salePn":11100000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XL.60.70.80.90M1_2-02.jpg"],"specs":{"Mã sản phẩm":"XL.90M2","Chất liệu rổ":"SUS304","Chất liệu khung":"INOX 304","Kích thước sản phẩm (mm)":"R864*S280*C550","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["Đặc tính sản phẩm","Giá bát đĩa nâng hạ 2 tầng nan Oval SUS304","Bề mặt điện hóa xước mờ","Khung chính bằng INOX SUS304 màu xám đậm","Điều chỉnh trợ lực","Điều chỉnh trợ lực theo trọng lượng để đồ khác nhau, phù hợpvới nhu cầu sử dụng thực tế","2 khay đựng nước có viền nhôm cả hai mặt chống cong vênh","Ống tay cầm hình oval nâng bằng INOX SUS 304","THÔNG SỐ SẢN PHẨM","Mở rộng"],"model":"XL90M2","brand":"GrandX","category":"Phụ kiện tủ bếp trên","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xl90m2-gia-bat-dia-nang-ha-nan-oval-sus304-xl-90m2-grandx","_addedBy":"vai-add-product"},"C1830":{"name":"C1830 | Grob | Kệ Đựng Dao Thớt Nan Vuông Inox Xước Mờ Sus304 - cánh/phủ bì 183mm, lọt lòng 165mm","priceNum":3270000,"description":"KỆ ĐỰNG DAO THỚT NAN VUÔNG INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"165*500*530 mm","Kích thước cánh/phủ bì":"183 mm","Khoang tủ/chiều rộng tủ":"183 mm","Kích thước lọt lòng/thực tế phụ kiện":"183 mm","Quy cách (Rộng x Sâu x Cao)":"R165 * S500 * C530 mm","kich_thuoc":"265 x 500 x 530mm","khoang_tu":"300mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p80.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p80.jpg"},"C1830B":{"name":"C1830B | Grob | Kệ Đựng Gia Vị Nan Vuông Inox Xước Mờ Sus304 - cánh/phủ bì 183mm, lọt lòng 165mm","priceNum":3270000,"description":"KỆ ĐỰNG GIA VỊ NAN VUÔNG INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"165*500*530 mm","Kích thước cánh/phủ bì":"183 mm","Khoang tủ/chiều rộng tủ":"183 mm","Kích thước lọt lòng/thực tế phụ kiện":"183 mm","Quy cách (Rộng x Sâu x Cao)":"R165 * S500 * C530 mm","kich_thuoc":"265 x 500 x 530mm","khoang_tu":"300mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p81.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p81.jpg"},"C1MO40":{"name":"C1MO40 | Grob | Kệ Đựng Dao Thớt Mix Oval Inox Sus304 Xước Mờ - cánh/phủ bì 400mm, lọt lòng 365mm","priceNum":4043000,"description":"KỆ ĐỰNG DAO THỚT MIX OVAL INOX SUS304 XƯỚC MỜ","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"365*500*530 mm","Kích thước cánh/phủ bì":"400 mm","Khoang tủ/chiều rộng tủ":"400 mm","Kích thước lọt lòng/thực tế phụ kiện":"400 mm","Quy cách (Rộng x Sâu x Cao)":"R365 * S500 * C530 mm","kich_thuoc":"365 x 500 x 530mm","khoang_tu":"400mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p45.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p45.jpg"},"GW30AR":{"name":"Thanh suốt treo quần áo, hợp kim nhôm Garis GW30AR","description":"Bộ giá treo quần áo cố định GW30.AR – Kiểu dáng chắc chắn, chất liệu cao cấp, tối ưu không gian lưu trữ. Giải pháp tiện lợi cho tủ quần áo hiện đại.","priceNum":939600,"listPn":0,"salePn":939600,"priceMode":"both","image":"https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg","images":["https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg"],"specs":{},"features":[],"model":"GW30AR","brand":"Garis","category":"Bộ giá treo quần áo cố định","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gw30ar-thanh-suot-treo-quan-ao-hop-kim-nhom-garis-gw30ar","_addedBy":"vai-add-product"},"GW30BR":{"name":"Bass suốt treo quần áo, hợp kim nhôm Garis GW30BR","description":"Bộ giá treo quần áo cố định GW30.BR – Kiểu dáng chắc chắn, chất liệu cao cấp, tối ưu không gian lưu trữ. Giải pháp tiện lợi cho tủ quần áo hiện đại.","priceNum":248400,"listPn":0,"salePn":248400,"priceMode":"both","image":"https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg","images":["https://garis.vn/uploaded/B%E1%BB%99%20gi%C3%A1%20treo%20qu%E1%BA%A7n%20%C3%A1o%20c%E1%BB%91%20%C4%91%E1%BB%8Bnh%20GW30_AR%2030_BR.jpg"],"specs":{},"features":[],"model":"GW30BR","brand":"Thanh suốt treo quần áo, hợp kim nhôm GW30AR/GW30BR","category":"Garis","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gw30br-bass-suot-treo-quan-ao-hop-kim-nhom-garis-gw30br","_addedBy":"vai-add-product"},"EL909AG":{"name":"Khóa cửa nhôm Demax EL909AG CNC FACE ID REMOTE APP WIFI","description":"Kích thước khóa: 38x420mm Độ dày cửa: 40~80mm Độ rộng đố cửa: >60mm","priceNum":19800000,"listPn":0,"salePn":19800000,"priceMode":"both","image":"https://bepviet.vn/media/product/10316_909111.png","images":["https://bepviet.vn/media/product/10316_909111.png"],"specs":{"Mã bảo vệ":"[Đổi mã khác]"},"features":[],"model":"EL909AG","brand":"Demax","category":"Khóa cửa nhôm Demax EL909AG CNC FACE ID REMOTE APP WIFI","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"el909ag-khoa-cua-nhom-demax-el909ag-cnc-face-id-remote-app-wifi","_addedBy":"vai-add-product"},"ELG908":{"name":"Khóa cửa cổng sắt chống nước Demax ELG908 AC/GB IP56 APP REMOTE","description":"Khóa cửa cổng sắt chống nước Demax ELG908 AC/GB IP66 APP REMOTE là dòng khóa thông minh cao cấp chuyên dụng cho cửa cổng, nổi bật với khả năng chống nước – chống bụi vượt trội cùng công nghệ mở khóa đa dạng như nhận diện khuôn mặt 3D, tĩnh mạch lòng bàn tay và điều khiển từ xa. Sản phẩm mang đến giải pháp an ninh hiện đại, tiện nghi cho nhà phố, biệt thự và khu vực ngoài trời.\nĐặc điểm nổi bật \nVật liệu cao cấp \nKhóa được chế tạo từ hợp kim nhôm đúc nguyên khối phay CNC chắc chắn, tăng độ bền và khả năng chịu lực\nBảng điều khiển kính cường lực chống trầy xước, chống ố vàng, đảm bảo tính thẩm mỹ lâu dài\nThân khóa thép không gỉ SUS 304 chống ăn mòn, phù hợp môi trường ngoài trời\nThiết kế chuyên dụng cho cửa cổng \nThiết kế chắc chắn, phù hợp lắp đặt cho cửa sắt, cổng ngoài trời\nKiểu dáng hiện đại, màu đen sang trọng, nâng tầm không gian sống\nTính năng mở khóa đa dạng \nMở khóa bằng nhận diện khuôn mặt FACE ID 3D\nMở khóa bằng tĩnh mạch lòng bàn tay\nMở khóa từ xa qua App Wi-Fi (Tuya)\nMở khóa bằng NFC từ smartphone (tùy chọn)\nMở khóa bằng vân tay\nMở khóa bằng thẻ từ\nMở khóa bằng mật mã\nChìa khóa cơ chống sao chép\nMở khóa bằng remote điều khiển từ xa\nChức năng thông minh và an toàn \nChống nước, chống bụi tiêu chuẩn IP66, hoạt động ổn định ngoài trời\nCảnh báo đột nhập, nhắc nhở pin yếu\nVô hiệu hóa thẻ bị mất giúp tăng cường bảo mật\nChế độ thông phòng linh hoạt\nHỗ trợ tự động khóa (Auto Lock)\nCông nghệ sinh trắc học FPC Thụy Điển cho độ chính xác cao\nDung lượng và vận hành \nLưu trữ tối đa 50 khuôn mặt và 50 tĩnh mạch lòng bàn tay\nLưu trữ 100 vân tay và 200 thẻ từ\nThẻ từ kèm theo 2 chiếc, chìa khóa cơ 2 chiếc, remote 2 chiếc\nMật mã động 10 chữ số tăng cường bảo mật\nĐộng cơ DC siêu nhỏ giúp vận hành êm ái, ổn định\nHoạt động tốt trong môi trường từ -20°C đến 60°C\nĐộ ẩm phù hợp từ 15% đến 90%\nThông số kỹ thuật \nKích thước khóa ngoài: 61 x 197 mm\nKích thước khóa trong: 145 x 105 mm\nNguồn cung cấp: Pin sạc Lithium 7.4V – 3200 mAh\nThời gian sử dụng: 3 – 6 tháng/lần sạc\nNguồn điện khẩn cấp: Cổng USB Type-C\nĐộ dày cửa: 40 – 80 mm\nĐộ rộng đố cửa: > 80 mm\nMàu hoàn thiện: Đen\nXuất xứ: Malaysia\nBảo hành: 3 năm","priceNum":15680000,"listPn":0,"salePn":15680000,"priceMode":"both","image":"https://b1.congngheviet.com.vn/file/s2-hc08/khoadientunhapkhau-com-vn/wp-content/uploads/2026/04/image_1775631075773.jpg","images":["https://b1.congngheviet.com.vn/file/s2-hc08/khoadientunhapkhau-com-vn/wp-content/uploads/2026/04/image_1775631075773.jpg"],"specs":{"Bảo hành":"3 năm"},"features":["Malaysia","Chưa có đánh giá nào."],"model":"ELG908","brand":"Demax","category":"Khóa cổng","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"elg908-khoa-cua-cong-sat-chong-nuoc-demax-elg908-ac-gb-ip56-app-remote","_addedBy":"vai-add-product"},"C112660":{"name":"C112660 | Grob | Tủ đồ khô - cánh/phủ bì 112mm, lọt lòng 564mm","priceNum":13200000,"description":"KỆ ĐỰNG TỦ ĐỒ KHÔ NAN DẸT, ĐÁY OVAL, INOX XƯỚC MỜ SUS304\nKÍCH THƯỚC LĐ KHOANG TỦ\n**GC304-645, GC304-260 Nan dẹt, đáy inox sợi tròn\n**Chú ý: Nên sử dụng bản lề thẳng và bản lề cong 1/2 cho cánh tủ","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 12 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"564*535*(600-750) mm","Kích thước cánh/phủ bì":"112 mm","Khoang tủ/chiều rộng tủ":"112 mm","Kích thước lọt lòng/thực tế phụ kiện":"112 mm","Quy cách (Rộng x Sâu x Cao)":"R564 * S535 * C600 mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p84.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p84.jpg"},"C112190F":{"name":"C112190F | Grob | Giá Bát Nâng Hạ Nan Dẹt Inox Mờ Full Sus304 - cánh/phủ bì 112mm, lọt lòng 865mm","priceNum":12826000,"description":"GIÁ BÁT NÂNG HẠ NAN DẸT INOX MỜ FULL SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"865*300*650 mm","Kích thước cánh/phủ bì":"112 mm","Khoang tủ/chiều rộng tủ":"112 mm","Kích thước lọt lòng/thực tế phụ kiện":"112 mm","Quy cách (Rộng x Sâu x Cao)":"R865 * S300 * C650 mm","kich_thuoc":"865 x 300 x 650mm","khoang_tu":"900mm"},"features":[],"images":["https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p96.jpg"],"image":"https://huggingface.co/spaces/bep40/malloca-website/resolve/main/grob_img/grob_p96.jpg"},"GT145A":{"name":"GT145A | Grob | Khay chia thìa dĩa inox - cánh/phủ bì 145mm","priceNum":1555000,"description":"Khay chia thìa dĩa inox Grob GT-145A\nThông số:\n• Xuất xứ: Trung Quốc\n• Thương hiệu: Grob\n• Bảo hành: 24 tháng","specs":{"Xuất xứ":"Trung Quốc","Thương hiệu":"Grob","Bảo hành":"24 tháng","Kích thước cánh/phủ bì":"145 mm","Khoang tủ/chiều rộng tủ":"145 mm","kich_thuoc":"516 x 472 x 64mm","khoang_tu":"500mm","Kích thước lọt lòng/thực tế phụ kiện":"145 mm"},"features":[],"images":["https://thuanphathome.vn/uploads/grob/khay-chia-thia-dia/GT145A/GT-145A.slide.jpg"],"image":"https://thuanphathome.vn/uploads/grob/khay-chia-thia-dia/GT145A/GT-145A.slide.jpg"},"XPR.600S1":{"name":"Tủ đồ khô cánh mở GrandX XPR.600S","description":"Tủ đồ khô cánh mở XPR.600S – Giải pháp lưu trữ tinh tế cho căn bếp hiện đại \nGiới thiệu về tủ đồ khô cánh mở XPR.600S \nTrong xu hướng thiết kế bếp hiện đại, tủ đồ khô cánh mở XPR.600S được xem là một trong những lựa chọn hoàn hảo giúp tối ưu không gian, nâng tầm tiện nghi và thẩm mỹ cho căn bếp. Sản phẩm thuộc dòng Sirius Series cao cấp, được sản xuất từ Inox SUS304 chống gỉ sét tuyệt đối, mang lại độ bền vượt trội theo thời gian.\nKhông chỉ đáp ứng nhu cầu lưu trữ thực phẩm khô, gia vị hay đồ uống, tủ đồ khô XPR.600S còn được đánh giá cao về thiết kế tinh tế, khả năng chịu tải tốt và cơ chế vận hành mượt mà, phù hợp cho cả tủ bếp mở bên trái hoặc bên phải.\nXem thêm các tủ đồ khô Grandx khác tại đây: https://grandx.com.vn/danh-muc-san-pham/phu-kien-noi-that/phu-kien-tu-do-kho \nMở rộng \nThu gọn \nChất liệu cao cấp – Bền đẹp theo thời gian \nĐiểm nổi bật nhất của tủ đồ khô cánh mở XPR.600S nằm ở chất liệu Inox SUS304 xước mờ – dòng thép không gỉ cao cấp thường được sử dụng trong thiết bị y tế và công nghiệp thực phẩm.\nKhả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.\nBề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.\nKhung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp.\nMở rộng \nThu gọn \nThiết kế 6 tầng nan dẹt – Lưu trữ tối đa \nTủ được chia thành 6 tầng nan dẹt SUS304 giúp người dùng sắp xếp thực phẩm, chai lọ, hộp đồ khô một cách khoa học.\nChiều cao lắp đặt linh hoạt: từ 1650mm đến 1950mm, phù hợp với nhiều kiểu tủ bếp.\nChiều rộng lọt lòng tủ 564 mm , dành riêng cho các khoang tủ rộng 600mm.\nTải trọng mỗi rổ lên đến 5kg , đảm bảo chịu lực tốt ngay cả khi để nhiều chai lọ hoặc hộp nặng.\nMỗi tầng rổ đều có thanh chắn ngang chắc chắn, hạn chế rơi đổ khi đóng mở cửa.\nNhờ cơ cấu trượt thông minh, toàn bộ hệ rổ được kéo ra đồng thời khi mở cửa, giúp người dùng dễ dàng quan sát và lấy đồ chỉ trong một thao tác .\nMở rộng \nThu gọn \nTối ưu công năng – Dễ lắp đặt, dễ sử dụng \nTủ đồ khô XPR.600S được thiết kế đa năng hai chiều , có thể lắp cánh bên trái hoặc bên phải tùy theo hướng mở của tủ bếp. Cơ cấu trượt bi giảm chấn cho thao tác đóng mở nhẹ nhàng, êm ái và không gây tiếng ồn.\nNgoài ra, sản phẩm có thể điều chỉnh chiều cao linh hoạt trong khoảng 1650–1950mm, giúp phù hợp với mọi mẫu tủ tiêu chuẩn châu Âu và Việt Nam .\nVì sao nên chọn tủ đồ khô cánh mở XPR.600S? \nTiết kiệm diện tích , mang đến không gian lưu trữ lớn trong một khoang tủ hẹp.\nThẩm mỹ cao , phù hợp với mọi phong cách bếp từ cổ điển đến hiện đại.\nAn toàn và bền bỉ , không gỉ sét, chịu lực tốt, dễ bảo trì.\nCông nghệ Ý , đảm bảo tiêu chuẩn chất lượng châu Âu.\nMở rộng \nThu gọn \nKết luận \nNếu bạn đang tìm kiếm một giải pháp lưu trữ thông minh, hiện đại và sang trọng cho căn bếp, tủ đồ khô cánh mở XPR.600S chính là lựa chọn hoàn hảo. Với chất liệu inox cao cấp, thiết kế tinh tế và độ bền vượt trội, sản phẩm không chỉ mang lại sự tiện nghi mà còn khẳng định gu thẩm mỹ đẳng cấp cho gia chủ.\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “TỦ ĐỒ KHÔ CÁNH MỞ XPR.600S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":14850000,"listPn":0,"salePn":14850000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg","images":["https://grandx.com.vn/wp-content/uploads/2025/10/XPR.450S_600S-1500x1000-1.jpg"],"specs":{"Mã sản phẩm":"XPR.600S1","Chất liệu":"INOX SUS 304","Kích thước sản phẩm (mm)":"R530*S500*C(1650-1950)","Kích thước lọt lòng tủ (mm)":"≥ 564","Chiều rộng tủ (mm)":"600","Số tầng rổ":"6 tầng","Tải trọng mỗi tầng":"Tối đa 5kg"},"features":["Khả năng chống oxy hóa , kháng ăn mòn , chịu được môi trường ẩm của gian bếp.","Bề mặt xử lý bằng công nghệ điện hóa bóng , tạo độ sáng tự nhiên, hạn chế bám bẩn và dễ dàng lau chùi.","Khung tủ được làm từ thép Carbon sơn tĩnh điện màu xám , vừa chắc chắn vừa tạo điểm nhấn sang trọng cho không gian bếp."],"model":"XPR.600S1","brand":"GrandX","category":"Tủ đồ khô","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xpr-600s1-tu-do-kho-canh-mo-grandx-xpr-600s","_addedBy":"vai-add-product"},"XC27080S1":{"name":"MÂM XOAY 3/4 -270° XC.270.80S1 - Grandx","description":"Đặc tính sản phẩm \nKệ góc mâm xoay góc mở 3/4 -270° \nChất liệu SUS304 nan dẹt\nBề mặt hoàn thiện điện hóa xước mờ \nKhung thép Carbon sơn nhiệt\nHệ chuyển động trục nhẹ nhàng êm ái\nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “MÂM XOAY 3/4 -270° XC.270.80S1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":3810000,"listPn":0,"salePn":3810000,"priceMode":"sale","image":"https://grandx.com.vn/wp-content/uploads/2025/03/XC.270.80S.png","images":["https://grandx.com.vn/wp-content/uploads/2025/03/XC.270.80S.png"],"specs":{"Tên sản phẩm":"Mâm xoay 3/4 -270° XC.270.80S1","Kích thước sản phẩm":"R710*S800-900*C(600-800)","Đơn vị":"Bộ","Chiều rộng tủ":"800","Khoảng mở cánh":"≥ 370mm","Chiều sâu tủ":"≥530mm","Chiều cao":"620-800mm","Lưu ý":"Để thuận tện cho việc sử dụng quý khách nên thiết kế khoảng hở chiều rộng cánh ≥ 400mm"},"features":["Đặc tính sản phẩm","Kệ góc mâm xoay góc mở 3/4 -270°","Chất liệu SUS304 nan dẹt","Bề mặt hoàn thiện điện hóa xước mờ","Khung thép Carbon sơn nhiệt","Hệ chuyển động trục nhẹ nhàng êm ái","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"model":"XC27080S1","brand":"GrandX","category":"Kệ góc, mâm xoay liên hoàn","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xc27080s1-mam-xoay-3-4-270-xc-270-80s1-grandx","_addedBy":"vai-add-product"},"XS.40MT":{"name":"GIÁ GIA VỊ 3 TẦNG ĐỘC LẬP TITANIUM XS.40MT - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng gia vị 3 tầng Grand X với 02 ngăn kéo trên thu gọn trong hộc tủ treo vào tủ độc lập tạo 1 không gian hoàn hảo, đáp ứng nhu cầu lưu trữ các lọ gia vị, chai dầu và các vật dụng\nnhà bếp có kích thước khác nhau, giúp cho việc lưu trữ gọn gàng, ngăn nắp. \nNgăn kéo dưới cùng hỗ trợ lưu trữ được hầu hết các loại gia vị và chai lọ giúp ngăn nắp, gọn gàng cho không gian bếp \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp\ncho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ GIA VỊ 3 TẦNG ĐỘC LẬP TITANIUM XS.40MT” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":11130000,"listPn":0,"salePn":11130000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XS.40MT-1024x683.jpg","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XS.40MT-1024x683.jpg"],"specs":{"Mã sản phẩm":"XS.40MT","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R364*S447*C548","Kích thước lọt lòng tủ (mm)":"364","Chiều rộng tủ (mm)":"400"},"features":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"model":"XS.40MT","brand":"GrandX","category":"Giá dao thớt, gia vị","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xs-40mt-gia-gia-vi-3-tang-doc-lap-titanium-xs-40mt-grandx","_addedBy":"vai-add-product"},"XD.90T":{"name":"GIÁ BÁT ĐĨA TITANIUM XD.90T - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng bát đĩa, với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc lưu trữ tối ưu hóa vật liệu, kết cấu và công năng , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc …đáy phủ lớp chống trượt chống va đập đồ. \nGiá bát đĩa GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ BÁT ĐĨA TITANIUM XD.90T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":9300000,"listPn":0,"salePn":9300000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-6.png"],"specs":{"Mã sản phẩm":"XD.90T","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R864*S470*C226","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"model":"XD.90T","brand":"GrandX","category":"Giá bát đĩa, Xoong nồi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xd-90t-gia-bat-dia-titanium-xd-90t-grandx","_addedBy":"vai-add-product"},"XP.90T":{"name":"GIÁ XOONG NỒI TITANIUM XP.90T - Grandx","description":"ĐẶC TÍNH SẢN PHẨM \nGiá đựng xoong nồi với thiết kế phong cách tối giản, sang trọng và độc đáo nhất với việc tối ưu hóa vật liệu, kết cấu và công năng lưu trữ , đáp ứng nhu cầu sắp xếp các vật dụng bát đũa, thìa, cốc … đáy phủ lớp chống trượt chống va đập đồ. \nGiá xoong nồi GrandX sử dụng thiết kế hộc kéo con bên trong ngăn kéo để phù hợp công năng, linh hoạt về lưu trữ tối ưu hóa về không gian , bố cục lưu trữ đồ dùng. \nChất liệu hệ Nhôm Alloy hàng không cao cấp bề mặt được xử lý công nghệ Fluoro Carbon tiên tiến, tăng độ bền và thẩm mỹ. \nHệ ray giảm chấn làm bằng Thép chất lượng cao , tải trọng lên đến 45kg , đạt các tiêu chuẩn khắt khe nhất SGS 8000 của Châu Âu . Sản phẩm được thiết kế các thanh trượt trợ lực giúp cho người dùng trải nghiệm kéo đẩy nhẹ nhàng và êm ái nhất. \nMở rộng \nThu gọn \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “GIÁ XOONG NỒI TITANIUM XP.90T” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":6100000,"listPn":0,"salePn":6100000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-7.png","images":["https://grandx.com.vn/wp-content/uploads/2024/12/Artboard-1-7.png"],"specs":{"Mã sản phẩm":"XP.90T","Chất liệu":"Hợp kim Nhôm Alloy hàng không/ Fluoro Carbon","Kích thước sản phẩm (mm)":"R864*S470*C226","Kích thước lọt lòng tủ (mm)":"864","Chiều rộng tủ (mm)":"900"},"features":["ĐẶC TÍNH SẢN PHẨM","Mở rộng","Thu gọn","THÔNG SỐ SẢN PHẨM","HƯỚNG DẪN NHANH","Đánh giá","Đánh giá của bạn *","Xếp hạng…"],"model":"XP.90T","brand":"GrandX","category":"Giá bát đĩa, Xoong nồi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xp-90t-gia-xoong-noi-titanium-xp-90t-grandx","_addedBy":"vai-add-product"},"XTP900":{"name":"KHAY CHIA THÌA NĨA ĐA NĂNG CHẤT LIỆU NHỰA PP CAO CẤP XT.P900 / XT.P900-1 - Grandx","description":"Đặc tính sản phẩm \nKhay chia thìa nĩa\nChất liệu nhựa cao cấp PP chịu nhiệt\nĐạt các têu chuẩn vệ sinh an toàn cho sức khỏe được\nkiểm tra chứng nhận bởi FDA\nKích thước sản phẩm đa dạng, dễ lắp đặt, dễ vệ sinh \nTHÔNG SỐ SẢN PHẨM\nMở rộng \nThu gọn \nHƯỚNG DẪN NHANH\nĐánh giá \nChưa có đánh giá nào.\nHãy là người đầu tiên nhận xét “KHAY CHIA THÌA NĨA ĐA NĂNG CHẤT LIỆU NHỰA PP CAO CẤP XT.P900 / XT.P900-1” Hủy Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu * \nĐánh giá của bạn * \nXếp hạng… \nRất tốt \nTốt \nTrung bình \nKhông tệ \nRất tệ \nNhận xét của bạn * \nTên \nEmail \nLưu tên của tôi, email, và trang web trong trình duyệt này cho lần bình luận kế tiếp của tôi.","priceNum":940000,"listPn":0,"salePn":940000,"priceMode":"both","image":"https://grandx.com.vn/wp-content/uploads/2024/12/XT.P600.P900-2.jpg","images":["https://grandx.com.vn/wp-content/uploads/2024/12/XT.P600.P900-2.jpg"],"specs":{"Tên sản phẩm":"Khay chia thìa dĩa đa năng chất liệu nhựa PP cao cấp XT.P900 / XT.P900-1","Chất liệu":"PP","Đặc tính sản phẩm":"Màu Dark Grey","Kích thước sản phẩm (mm)":"W850*D490*H55","Chiều rộng tủ (mm)":"900","Đơn vị":"Cái"},"features":["Đặc tính sản phẩm","Khay chia thìa nĩa","Chất liệu nhựa cao cấp PP chịu nhiệt","Đạt các têu chuẩn vệ sinh an toàn cho sức khỏe được","kiểm tra chứng nhận bởi FDA","Kích thước sản phẩm đa dạng, dễ lắp đặt, dễ vệ sinh","THÔNG SỐ SẢN PHẨM","Mở rộng","Thu gọn","HƯỚNG DẪN NHANH"],"model":"XTP900","brand":"GrandX","category":"Khay chia thìa, dĩa","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"xtp900-khay-chia-thia-nia-da-nang-chat-lieu-nhua-pp-cao-cap-xt-p900-xt-p900-1-grandx","_addedBy":"vai-add-product"},"rau-c-u-s-n-thu-":{"name":"Rau câu sơn thuỷ","description":"Rau câu sơn thuỷ","priceNum":40000,"salePn":40000,"priceMode":"sale","specs":{"Đơn vị":"hộp"},"model":"rau-c-u-s-n-thu-","category":"Thực phẩm - Nước uống","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"san-pham","_addedBy":"vai-add-product","_bulk":true},"rau-cau-son-thuy":{"name":"Rau câu sơn thuỷ","description":"Rau câu sơn thuỷ","priceNum":40000,"salePn":40000,"priceMode":"sale","specs":{"Đơn vị":"hộp"},"model":"rau-cau-son-thuy","category":"Thực phẩm - Nước uống","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"rau-cau-son-thuy","_addedBy":"vai-add-product","_bulk":true},"banh-bong-tuyet-trung-muoi":{"name":"Bánh bông tuyết trứng muối","description":"Bánh bông tuyết trứng muối","priceNum":50000,"salePn":50000,"priceMode":"sale","specs":{"Đơn vị":"gr"},"model":"banh-bong-tuyet-trung-muoi","category":"Thực phẩm - Nước uống","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"banh-bong-tuyet-trung-muoi","_addedBy":"vai-add-product","_bulk":true},"banh-ngoi-hanh-nhan":{"name":"Bánh ngói hạnh nhân","description":"Bánh ngói hạnh nhân","priceNum":70000,"salePn":70000,"priceMode":"sale","specs":{"Đơn vị":"gr"},"model":"banh-ngoi-hanh-nhan","category":"Thực phẩm - Nước uống","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"banh-ngoi-hanh-nhan","_addedBy":"vai-add-product","_bulk":true},"banh-pho-mai-nhat":{"name":"Bánh PHÔ MAI nhật","description":"Bánh PHÔ MAI nhật","priceNum":115000,"salePn":115000,"priceMode":"sale","specs":{"Đơn vị":"bánh"},"model":"banh-pho-mai-nhat","category":"Thực phẩm - Nước uống","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"banh-pho-mai-nhat","_addedBy":"vai-add-product","_bulk":true},"HB CG26F":{"name":"KHÓA CỬA ĐIỆN TỬ HUBERT HB CG26F","description":"Description\nKHÓA CỬA THÔNG MINH HUBERT HB CG26F – CÔNG NGHỆ HIỆN ĐẠI, AN TOÀN TUYỆT ĐỐI \nTrong thời đại công nghệ 4.0, khóa cửa thông minh trở thành lựa chọn tối ưu cho những ai đề cao tính bảo mật, tiện lợi và hiện đại trong không gian sống. Hubert HB CG26F là dòng khóa điện tử cao cấp tích hợp nhiều công nghệ tiên tiến, đặc biệt là nhận diện khuôn mặt 3D , mang lại trải nghiệm sử dụng an toàn và đẳng cấp cho gia đình và doanh nghiệp.\nNHỮNG TÍNH NĂNG NỔI BẬT CỦA HUBERT HB CG26F \nCông nghệ mở khóa hiện đại – bảo mật tối ưu \nNhận diện khuôn mặt 3D : \nMở khóa siêu tốc chỉ trong 0,5 giây. Khả năng hoạt động chính xác trong điều kiện thiếu sáng và chống giả mạo khuôn mặt.\nMở khóa từ xa qua WiFi : Kết nối qua ứng dụng Wishome  \ncho phép mở khóa và theo dõi lịch sử sử dụng ngay trên điện thoại.\nCảm biến vân tay FPC Thụy Điển : Nhận diện chính xác, bảo mật cao, thời gian phản hồi chỉ 0,5 giây.\nMật khẩu bảo mật cao : Hỗ trợ mã số dài tới 32 ký tự, có chức năng xáo trộn số để chống nhìn trộm.\nThẻ từ: Quét nhanh, tiện lợi, phù hợp cho người già và trẻ nhỏ\nChìa khóa cơ chống sao chép : Dự phòng trong trường hợp khẩn cấp, đảm bảo an toàn cao hơn\nAn toàn vượt trội \nCảnh báo xâm nhập : Kích hoạt còi báo động khi có hành vi phá khóa hoặc nhập sai mã/vân tay nhiều lần.\nChế độ bảo mật riêng tư : Có thể khóa từ bên trong để đảm bảo an toàn tuyệt đối khi cần thiết.\nPin sạc lithium 5000mAh : Dung lượng lớn, tiết kiệm năng lượng, có thể sử dụng trong thời gian dài mà không cần thay pin thường xuyên.\nCamera hiển thị hình ảnh : Cho phép quan sát trực tiếp người đang đứng trước cửa, tăng cường bảo vệ và nhận diện.\nFace ID 3D siêu nhanh : Nhận diện chính xác, kể cả khi có thay đổi nhẹ trên khuôn mặt.\nChống cháy nổ – chống giật : Trang bị bo mạch chống chập điện, đảm bảo an toàn tuyệt đối trong điều kiện khí hậu nóng ẩm tại Việt Nam.\nTHÔNG SỐ KỸ THUẬT","priceNum":6000000,"listPn":0,"salePn":6000000,"priceMode":"both","image":"data:image/jpeg;base64,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m5t795vCLwheeKDm5t8d5vCLwheeKG04ANWObm3v1Og3hF4QvPFBzc2+O83hH4QvPFDacAGrHNzb37zeEXhC88UHNzb37zeEXhC88UNpwAasc3NvfvN4ReELzxQc3NvjvN4ReELzxQ2nABqxzc29+83hF4QvPFD60n9vylNymEOEtKU/+Y3vixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+373osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLFl4NSWO75OVrjZaVrQpyqE3lzDkFXRVadnm1Slyi1xxuU7QDkAAAAAAAAAAAAAAAAdV51pT8mceOS32ReeznHyyg9kHfWVfWDxnV+yDz2c4+WOL0Uu6joQyd6tRMnwh871TjUVG9smCbPjv021c3Lon2BT+sHWfCVTPZ1ESfDJd10/OFybNfm22H7ftPjCm0/OFxbNXm3WH7ftPjiIE32yPumsRfbFD5qiKbR66QXFtlfdN4i+2KHzVEUyn11MX32G/XkXnmkX57TM/nJx6EXOhvq3ZdH0xisT+YYeevkXHmj357TM/nKg9EpKmtEuU/TG5/ijIfzzYOcVArtf2u8OmLGSVFcYepczJGdYK9cYyjgh6fpaYnD2SbxrczhypkImNNmTsS8nRtHLq9nkyl9UbkEFd3fpsLihGu71jeZfcCTRpHE+qnOPEqoNUuG1a9v1YrK95nfN+GOnXi2eQv8Ax7oRdai5eeVr26jnnpa+nClueZz+MfDnkcjHlXXPz1p+nD889Tf07/xFMc8CvbH45vn9Np/KHKLiVutP00WhsmyS10bUWGUI14yvNor03rEUTrKfFGo/Nxb06o9BvIkMGpSbv2Zx8mWiicVDtDw8Qc9OC4eK9Jc9PWkpUv6Qco9ZAABcV9+zj/omX56LBFffs4/6Jl+eiwQAUxiR90Vg16y5PmiYucUviR90Vgz6y5PmiYC59ynaFFXPiHi5OXncVs4Rx8CdGy27PmieVqqYz56slvijZLIbiqaRkuNrm69TuBewpS9cGpeWuiYuGycQX1qL3C1RZTyTVsVajpIlDFTVSzdaW0zVJqfip3ACdYa3s2xGsGFvlk2UQRmGpHe9z8pOvnk/lExEds+14myrVirSgkKox0K1SZNE/PoRMuSgkQCnNlnzMXn51XH/AFs5FTx33YK355vf9mERbGyz5mLz86rj/rZyKnjvuwVvzze/7MIgLXx2pu3fg4b/AOfCfMHguPcp2hTuPH2zYOf5QEv6ufC3utANVdvX7B2L+cB/kRtQl1pMafYzS3RlJcF+xSJlbNsdrzGhXVT8CUlnblFFddLtpIJl0im7I6ivaG4iXngPoAAAwl5fajN+1rj5Iw6eGvmd2p7SMPm5R08U5csLYE890qrnqxWRSSp6KspwEye6MMxa0fzDtyJgzq0PVgzRa1P3WmQpQGbAAAV8n5uLj800vnSgsEV8n5uLj800vnSgsEAAAAdKS+x738mf4o8gtn5ndmGxMMtoPFVFO4MI4+45yHboUJWpbWdrSNSc0Tk88x1s9KGryNwnqR7E7lK9KtBjqwkXWPrG1jUN6Gru1Q0y5a13d3d3Op1emA86sVsUcWYi9tqN1h3ckyZuwcWSmk4Y7q6kXFuElt9umpadWlC9r8XcCP47yuG0tsb4ht8NMcbwxJYc8UDXfU8uqvVgqo6JuJoqqk3K17vtD05JGRzeqhko5GlVqUKpWidOHSnUpXt7g+BbehSMTMCRDUrU9aGMjREtC1rTqVrTc3AGp2ze3vew9rbFLBmVxKum74NnAxk43NPvKrqouFzUz0Kag/O27b0Ivihs5qqxDWp5DFBkVwbQpurU06dJSvn0/hG3hWLIj0z4rNOjk9KFMtQtMxqU6lK188HTFk9Mmd0gmpVsbOSpi0rUpu3Td6lQGj2POGi99bbdmWXEXhN2YiphlKGI5gV6Nly0TeF4lM3UIXsv0RVGEW0ddcMnsyYj4v3rOUgnrC6IiTkamcqpvXBXGkzKvQtOErweCPTczBiZ6V+ZmnVyUtSUWqWmaha9Wm71dwfCsDDmRTbmim9UkjZiEqkXKSvbpTc3KVAeUmG8vc0VsvtsTGNwXLEt8Q8SHLLEK7mdFFpFvCtiqJo1pXqpFJu1L6kdmCXu60T47YmbNl2Xle8JHW9CwcPdr2irhw2bGc0VekaVPQtFtEuY3qR6rliYtBhWOKyQK1NWtTJUTLkrWvV3abm4OWcZGsUKtWbVFJGu7upkToUtd3q9KnSAaJ2xcWAymDF+mj9sPE2St9NzC1fTyrxwZxGL1W6ygsZLdJrH66WnUG9EVp1jm1SLapNAmQ5uUcuXsh+C29CkZHYkh2pWylaGOjREtCmrTqVrTc3KjKUKWlNylKUoA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1XfW1fWDxtW+yzz2c5+WOPZVXjUR5BXba8pZF6TdtTaFUnjJ84puV7nUUOQ/vZheilkbdddqIbO9U4mT7623RCZ30cW32XhBJjzxFXwlUwIq+FB1E+oLl2avNusP2/afHFNJ9QW/s4K//GOx/b9p8cTvsJ3ti/dMYiezkPmqIpVPrqAuHbNV/wCc/iD7PQ+aoik98EIpwzkJ/GLwiXoP5Fx5o9+e0zP5yoPSHcp1NweankV6qbjEnEOidc5SxDPMf/PKD0sGKX88t7otrAx4xNt19XQpHXC9KUp+DXrynYfpEHyiWbm4HJZWbTqk1T4SDTt+rF0+SKxbFPbtniptylSWimDhSlKdVSqFN1SopS4LmbW8x1lq5lj9ZJ3QvRSzu3nd6NttN2u4ZY31sSgo+tVVllFla6iqqmcxx3ZeQczbo0o5VzmP1KdxTuB8BG68Od2vbH4H6AVH5H6HYYRknMKZIuMXkDdy2SMoYbT7KOwDiVjpdaEnfULKWvZjfKo8cukqpOXlPSm+71a+qAY/Yo2Kbp2oLlSl54juLsCMW3XsnQuWruv7WQ7da9mbsR7cWLY1s4dWuys6zohtGQ8WlRJo3SJloSnbr+MLKsm28ObVj7Js+MTj4iMRK2aII06RCduvbEnAAAYCeuaFtZEjqaf0ZpqG0yZimr/QAjv7OP8AomX56LBFJdFGwUsZlHtboS0udclN3Ir+2vWicdF3Dn91Cfva30QE1FL4kfdFYM+suT5omJn0XcOf3UJ+9rfREAxfWfoTeH2MEDGO52Ptl07rIt2CeZ0do6bHRMsmnXl0IppGy/jqAvQcblO1QVC22nsE1S5F73SYn9KetF2tS+7IJVEYt4XzZM8ZiPbjg5uxJJobvuc4CagOqksm5S1W6qZyd0WuYdoBTmyz5mLz86rj/rZyKnjvuwVvzze/7MIj6YIbTGBmHWFsmpd+KFvsjoXHPKKNzOiVX4b9Y6dNMnqBgMAHr3F/G8+J0YyPzKSlpOdXc062hRVmixZMin7NYySDhZWheCSihCALm2h3zOIkcKJOTckbNGd+NN8OFj5Sp5mLwhN03rzF/lGIkZWQ2j5V1Z9nvl2uGrBc6E5ON1sp55Ts2TI5P+j+nLdnyCdkYS/aXhE5/APEONOzK7qW3n6qaeTNXUKioahierFeXRjRaMgmxwkwiuljDNlmqVZKajy1UQiWOXc0mxky5auzk6lPQy8OvYgM28Zx9/3nE4W2Q0q3suwXyLqbVQTytjum3TbRqVadWpFMqivc5SF8/g7ACpLQvLCyy7ebW5ZRX5o9slUiKLSOcHMY1eqatcnTOMpXGCOrTSTtC71f4Ic9Pj1AWOOuoomklrK1yUTED6IVzrfWeE1xKp9tRdBP+bU4xL6Lue/EzVvtNK3bXb11V49NfdVekT85ypySo/vZen3RuxAfJSXSxImkp9c+jZNsud+pOFeCSUep9Ran/Z0eqWvZKcLsC5s5a0rN3dI1uUtDsbdKXcYN1CZV35v2yeleQWnYE8/lG7DLjY6P6JR27o6O9bPY5TRzQtMnNI/nLnp6R3BfP5Xciaztz25aKCbmeeJsklK6aZqlNWmbtdKgCQAIN0Z8L/3Vpe8rfRDoz4X/ALq0veVvogOun5uLj800vnSgsEUclipYimLys1zxJbw53EmuvRFbLq76UNl5AuNg8aSseg/aLaqC5M5T07IoDvAAAAAAAAAADgcgAAAAA4HIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKoxR2e8NcWVKO7liTJSBeLo+bH01ql/Gbzxa443KdoBqLcPkfFiyNN2BvWdj/AFKhUli/FECuXyNKSefYTEZupu8rfbOpfiGG6cze9oW2pvaZuFkyW9KqrwvcjrQ2ItizSm9Y2545VdXkpUVymN/EYB5yXL5GBiwRXcjJ2Gep+rPUv+6KqnvI39pdBXcZ22k4qn2VHBOF/OHs8ADwWk9jraKhVVFFMM5lXT5WkhWoj8bZGNNozzI1oWHcJroQVIvHkSjjmrQ+py+SP6CKlLXqlpX+IdTekeiejqjZKhqdQ1CU3afxgPETypW2/jpckldtx2O4aPZVQm/HMgdNCla6ennyV9aJOl5E3tOO3SaD+atxJHslqvj1oUv4yULwh65O8TcPWB9Fe7o0p+0VWlfijIQ9z25cdD1hpds7onyypqcIv8QCm9krZbt3ZeshaEZvjyU5MGI5lpFXqqnTLuUIX1JfOGwQ43KdocgNGtrryPqT2gsVUsZLMvhCGljsSR7pq/b1XQUInyDErSvB6QoqvkOl/wAy5O5uPGmNTL52lGn8YPVncp1NwY99Jx8O1UdSDpNsgn2ax8pQHmyz8hgiiU/xhja6U9ZFEL/vCY295DvgpHU/xzf91vPUJmQTp8mN0uith9qaPPfH+6rufyiSsJRhJNiO410m6QPyTpHzFAahQfkU+ydEK6rqEnpL2VLLF+JWgse2thDZRtKqa0ZgtArKJ8k7ohl6/wA/dGwoAIfb+GeH9ppZLdsqDjCdpqwISv8ANEuImmmWhE0ylLTqUpTcpQfoYCYui3bcpuzUu2Z0PySnU4Rv0QGe3KDkRFpidh8/PooXdG1U9UrQvxhKwH7H4USSVpuKpEPSndFpUfsAGG53Irmnza3i335ob21slN3Sz5twZPebT9qo+4oPruUEVlMQbOhVatZC6GKRyF4Zaqbpi+5ASXebT9qo+4oPpQhC0y0IWlKU3NylPOEdi72tScc71hrgj3i3pRFd038gkgDHuIeKdJ6blg2Vr+NItf8AyEUksGcLZZNROUw/gnJVOVUzNOn9BROwAU6psq4HqLb5ZWZSOW9MYOlW1f8AVmoOurs0W45R3lS/sQeZ1eLWjeep7vdUncbmfd3Bbp3STZI6rhUhCE5ZjcEpRHFcTsP2x9Fa6o4tfyu7T+UBjILAvB+3YUkBD4cW82jkSZaI0YpVLWvb3a0Exi4qLhGabCLjm7RuSu6VNJOhC0r2x+Iidhp1HVh5Fu7T7tFTNlGVAfkxCHLUhy0MU1NytK03aVoMMwtyAiEKt4yIatU611KkRRoUteluedTtDNjgB+CIIp9bRIX+AtKD6DFSczDwSe+5iRbtE+7WUyjBI4nYfqq1QpdMdu+v3KfygJUoomklrK106Jisypr4rvCqKlWSs9upupkpwebJ/POb/s3ap6J63lWM3ctZRrqJ1SXbq8k5eEUxR2iEImWhCEKUpaUpSlKblKUAU7fOPVo4e3I6tp9wCQ0bv56tVWhSk3SnMkimTc4ap8nSpTLyuqPynj/Z7Mz6KxIZ8w5aLrmctq0M5KRDRbrHW1CF3MpSOUswzF2YKWZeEwtK3E3VWo/0N9tKKmK2dHQ60dQm7umMXsfWkGOPs/2O5bPmMieUeKSce+jXTtd4dRdZFyRBM+Y9e0m0QKXudwB2HWNeEzLT33IKJmWVMnVGrFXMiZNwVLjOBwOOUKn+kUTC2Za27ui052E01W6pzkpWqeStDkNkOUxdzpdMogU1YGE8dLyL6blyNnsk43wqWr2u7m32i66ROw4xumJDZErhzFNlY207gbnpIPFnmTW3TVUWPqHpTMAn28mf7UR97oPsUpSFoUhaFpTpUpSm5Sg5AAAAAAEZfYgWdHn0nVzxySn41c39A7kPckFPF3YaWbuKbnJIp0y/ogM0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApm+buui5LkPh7YqlUVS0/xk/L0zp/vRDdjXuzedmKUvTqYxLZduitGi7qvoZDKCqdn5pltZ/dr3jJCYeHcuT9lWnL/wB4B1FrDwnw2it9Xe6364p1TGoYx6m9QmXpjAqlwLusm9U2DyNIpwCuaIVyU1OpmOTdyfpCF0SkryjJDE2bS1F3Uo4ZlTOpw00KKlSbJIlPwS1qdchKH9D3T7vCMIhMy6tuOyTrRw7bmb6qiCzWmYqhk83SrQ565y8Dz8ub9OmUL9tuduDDG4WVmXVMKSUM/wAhI2RW6e9j7mWlK19Kz5SbvY5idiemW8hrC0JS9MMHcWqmYiBE2D2JUrXptU3vFGRLXzyoqZsnrUe5F74fS6lw2Tbs86rx8lFtXZ/XKIlrUBmnDpJqko7crUTTIXOcx+SUopZZ1IYsncyr2VUirLbdQqldKixfTD1P1Kep7Hg9lyZbjg+WQsZVgjXcrIrJMz1p5xTG3a/+Bal/SEWxugLBZ7P68PfEs/jociLep12H1xRXNukoT9IBLULCwzh2qCq6UeVJbIgiuov01q9hw93hjC3ThPbJXKKtuzdIOaPw2lCuMpz6fcdl/IKjxVjsBVsH8LkLhu2ZbwKSifMV2jWtVFy5eFqZhKcSGuDi20Nh64m7jlULnRbI8ymyNa72VLmPpahvxnzALHw0u6QfqvbPungTsRwz15O+kupqU9V1c38JDdmLLFS3235g4j2tdDSmUzh8Vu69URQxW39LlP3gotoBFLxuxpZsG5knCdVjlpotkqdVZfsE/wDjuTCumllOrmSNf2Kk9VNEhddJEymm1bJdvKfkfx8Luu5LlL8SSuLFG3badG+okEd+VL3R1DG/8mxif58wpnagn3V7YuReDK79wzteIiFbkuCqHSMs3SKY2T+Z/OATjot7JvNDne58Ind6xubq2n7vkjMOrMdW4jz/AOFk9U7dQuqohQ+q3co/75fx04VOx7k2qmKOJWBluSUNA4eWdb09aa7IppJsZjUjghvZXXMwt3Zfmndh4tzOCjOUXe2tKRaVy27r9MyLZQqZsnuT0J/m6gNlrPuxneMGlLNk6kMami4Sr6CrTlk/47ZRKhUdhpVt3FG4rZS+s10SvEidycmXd/1blMn+ZFuAK0xKvR/HvG1oWpWppySrnrXlUaI06p6k7o27XL605uwHWtvBmFR/xldi68zKKddUcqGrSpv/ADHXsBrzdv26rge0zqJPlWyFe5Imsdt/Q2N7tTuh+7u2kMGrNmXduXBejZq/Z9NdGiZz1IbuOB2QCQyGE9kSaekaFTLXu6dIQc1LhwVkUlt8rPrQVU49I1anqz9USvY09T2XT7LlU7jbtzoRztCHwb0X1CfXkiujxe53CZTdUXXhNfymO+DBLilmJGzpXVbLlLyaOUfRSfizgLcSXSdpkVSWzkULmKYnJMUdsVtglJrP7IQaLm6cWsqwLu+cUqm6QvvZiF/RElvyWUt+zpydJ1yNjnTsnripGygK7uS4JrEaXkLYtuSrGQUfU1JGSIfLq6fXKUN6V1SbvZVKfsSVzQRK7sNINKhLas9xPMq9JKUeSDdg2d/iQqqcuoT+LKLItzD2PmMKjWe7dOW6D/iHSyKvDVQIvkqXP6sidc/rzCubzw3ZYckdX9csu1pBR/1S/XJHIrOVia2mjHoEOXKmgVPKXcL0wFoyWENqz7AjppHmiHKhCqbqdd2pTfj3OUOnaVyXHC3AWwb0d1UVN9jH+701PUH7uvcm8/KYpvVfGytqTBK96USjr3bsl/SZHiD/AMteD/OHZxsKkva7W645ZPWjFCOmy5PfCGLX9EBbIxcxMtLfi3EzKrUSbM0dRY/aH3Zrb8aoOqeiEKoK4xxVUVYwcFTkSUjur+qokissQnuyFARs0XMYmrK3Pfj1WOtpNT6njqV3Nz+GvZm/H53ofdGsZrhtZKbRNFOHSMTt13eEMZdrZVBGPiY9I9U2zR04Ry0zbiqeiinX+Vep/wBAee+Ku0BiLI4inrBT7mMY2w+XaQqCR9wqFEzZM5vTN3LwzecA3rmMOGKT3f1gyFYucjktaiKdctDl7RaeeXc4HciSYcXqpd7JdlJJVby8XxDtOvJrXsT/APH4xV2A16SmIVqW3fT1HK/fLfVNEi8EyxzrIuaU7ilSkSWp60TNwhSCxxjVGvSLONHBViU9ZqfHQqAtwQm/bzLaMcQ6CVXD9+vvRih5xj+ec/qS/wBnbE2FRv6N53G8qCtdRGGj0KlJ6tTWVzfzCgOgysart82l77UczEm6qZaqZ6FoRol2e7Q5uAThdQv/ALhl6sMIpRWsK05nLODcBJNNSlamN2iVrwTjI4wkkDYb3CSJpTmiSOVOiXczVryekanZF7oV5csC9g7EjlYaaUUIZ2wrRA5iK7n1SjSlW9aFzFOYnDJ2wGQLFzVhpHuqx1HascRY3NCKXpTlENkPuZez/H/xS27fm2lywrabja7rdwnqJ17Iv4h2qkZv2aqG5Q6audFTcp59eCYV7guZaPNcttr9bjJEhyfioqgVQ/8APzALS3KV6tKdIVJfl6y6sgezbXd0bOUktaSfV6jVLl7lDdvT3eF6ovZV6VuCjLLdwJLIue+bwWom1WXM8er185NM27k930gGVsGzbDkE3BiR6z1ZBxxi69d2pz93Qu7wB+7khsFnr49svZWHZy1DkRohRwWixD9gXINWcSts9KNSaNcCklo4tDn384kW5KqKafFk7KvYdMa7RlzzNF3l2OHyir7mo0fKLKVzGMrnWOeh+6AelUNLT2G9xIWdcj1R5DyB9Ng8NymxuwTrXuOx9TuF7vpXANck7th8SsH447Y5VHB48h2roq1D7q9MqJ6GzF4CpamKfL60XhackrOW1DTivLfMEnR6flClMAyqqyaSdVVTaZCco1RVCryZxTdq1aLKs7aS4CVacGryvYKm9Tu8Mifn7lM/LylkGLL07e0lWyNa0rJLpMTVp55VD8Mv8OmU5f0hI7bi0IiGbMk6Uppp0qbpdU9eEYBDJuNwjw2bIK3O8ZRxV+IIs5rWmb1PSH0fYaQEyROWttWrJeieduqhXLwu6IfqjVS+7ElcXNoS74Gl5XMiyhlTvXZE0DVbt2yafTTJwuWbsOCLg2L3LpS1rpbOpeef0azW4jSYTORZEuinxfDAWbZt1zCsopZ90FoWTbEzIK8nfaRMuevri6hf5SG7PpWSKtxNoWHlIC70OLO3kUqKH/FU9CKf6gziv6JBaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6y6KK6CiK3TIpwDCn8B5Cka0lcN5ehE3sUuclSeeYvI+JRP3QugVViNh1KPZMl72Q4q1nUC8NHkkeE7k1ewP6oBXl6WQ8s57RVuY9YVPhNFKpVUKQyZzqpJKEp2NV60UqbpqKq0TpXkimH5jSJFbfioU8udVqdqilTjFCVyZD1Lk5Z8hd3N3VTjZZDG8kWlzLxCth4yW3ch91Pcoev8J+L/wBYMcXFGzkHFDYc2YZ3JLbu5RFsWpqcHL0jJ9LsS+iU6oDm7ikw9wXgbOJShpmrJo1IQnVO5Sy1JT9Yy0/jMLas6DrbVqwsGb/q5g2ae9k3BXdlWBOy9x0vzERTdfI0zMGFeEm2p3Zu7P8AF4XdbouQBXuMUSrL2LIb1SznY1I7SKTlGyV4W5+hmEPxJusrrAReZjrKRu9YiKJFIrLqUNXg8Lcp6jjBeNSlrTcqWlaV6W5Wgpx9alz4bSjiYspvWTiXB860VTdqdCn73um4RPU9j2PcgINiVckm0wuw7eUwHRl1HqyWeIM1McsSbJwcpCcgSDECfk2mOVhxrXB5GXRcIU1Z4yGasd1zdKRTqFy/7wlJMdrWbkonLMl2rinKRrTLue/aY6b3E2duk28cPINdZU/UeqJmImn/AAqHLkp/FqAObrXrdeKVu241rmJEK0fPD9wRM5FvlCNi/pKdwLfEFsGxS2g3VePVt+S76mdy47dPOJTtFE6AVDiNuW7iDbF5VTrvY1N4rV9XSuYn8w7mvrqE7YqractKZt+84PH2zYM0+wTaHibjYp8KrmNUKfp0y9jpmN/IQbKXLb8ddUQ4gpZLM1XJuVNTq0r5x6V7YrVq8vrDAvM24GB52DrTKm7QJU1NztKEKUxifwUKYvrQGivOhs8UlObdMSpbmV1zmHzLrzQ3PStXNl3fVDaTZotKcmbynMf7xgzQDFaPJFQUcrwat41MpcinT9QQonnPhgdv/mhzmR+/u73o31M3utT+aO47e3vieWkbAR6kFCUplO7WTMXNTtJkNlMf+CpSl9cA7OHStbnv25byKQhW1KbxRru9nXcqr/qyNaeu1e0LeGAtq3o61odCJiksiCJMpaV6pq93X8Yz4CpLNW51sTbjtx7TcJIuKvmp+6Iqc6/yp3JP82n3YydwYCYR3XKKz9w2NFvpB1011lCbhjVHcxAsc12tknjJbeUux3Ds3H4uyIb1IjjLE6etY1GOIcI4RUJ/01NMx01P4FCFyfy6YCv8XNiLD29kWa9mVLbLlDgKFbJbqSxfVFFgWraEDs94PEtlg9KZNoketXK9evOVOmdU34vojtKY7205LowjRw7X7FNOmev+p1B0Glr3NiJNtpu/W9WMKThN4uvSOv8AltzqE7LL5/ZdyAkeEUUrFWMwTVSORV1U7wxT04VM58xd31WnlEiuyDrc1rS8AVXIaUYOGlDdzqEyjPUKWlNyhaUp+KgblO0ArjB+4aTtrUbOeLfMzn3yh2RDVMap/wCfmL+iKY8kAuJyxwxi7eacmbkdxU2Xg1IkXUynFs3VZc5FzprxsA2V2r9fs6cErr1dDecbq+u4PJ5Q6DnFu2XrFSNxDtdRsoXpmQctukev4tTpU/RMYB5dMGC8tKIRsdw3DtUrZPc7tQ2Qend9NiR1m21hDEV1HlSNGJC16daJJkybtf0Cm9zUQV5aWDc1cbK4cPsKqrzbNzvpqoglUpE1e7qUvE1/SMLcsKyX7aVPdl4qEdTaye6QvKKzJ3BTdmbk5jepoAsRBFFBBNFHpET4BRXGNbVWsAynkafYd7rLeobKEURVP/ERWhv0RZ46blu2fIKtnCNFUlaaZ0z04JqAIrPXRI9DmQum0ozmlKEYnXaNaU6ai+XrY8oL2t28LcuNWOveDWYyzytVlEFKbla1UU1M5B6XqQ944Wu1KQbNaZto/UTpwnLf1FaeiE/Hyv4R1py+8ILjds5K6LWSXlWfWTOGyVVEjdoutlNX3ICJ7FMbiDbNhSFnX5ai8WjHu98RyjgtKGWKryi/8d0LAbrc9OM6LprxjS3G6lVD05OZTiSJ/wAtVTj4Pr7u29v8V2RAqotDcp+7IZNOhf4y/F/lKJpZVmMrMi6s0TVVXWU1Ha5+Uup3X8HqQEvFRXGrS0sXmFwL03I+bQI1OfuV081Nz3CtDfxHFuiN3ZarG7og8W9ploauqkuTlIq9icoCLX5PUazUPGsXrdhIuW7h1vh0tkSKgQyOoWtPRK5zF4ArK3rIRhrhOs3xAg0qRdaKtHB3JDkfHORTLnJqcHR7DKJTvu5bLMWIvS1+bsW03aN5BJvnpQtermIXMYnndjUdyuJGHKlNNvaaq61OojSONu/+CYCRWbc8VSy1JkxqUM3XdUc0TW1aHcprmIpRNTssynxh08E2qq0NKXSt0+bshqo+rQTIVEin6VSnP+kMA3te6MRjJIy0fW27bTru1ZkpkWV6e7lpSnILu+fyv4BcDJk3YN0mTZGiSSRNNNMnJKUB3hrNNWWpdNp3xgKR1SMeuVCrM3FS8E9N8UWS9fu5afyK9wNmRBL5sEt0kTk41bec2z+t3HUzeoU7ovTr/KA0I8opjtrKU5mxOXzz80a8L+aPq72MMc4633ZCQsc7WcHSUIkg9pU3Zd0Uo3TTv+/bZpvO57QdOjJ/9JaUqoQ38ZC7v+rHK2J10Sm4ztayZFZb01RFUhS/xqlT/wDMBrvhBhxfuGuHStuXOnRrMTTw/MyLTPmUTUUSolqnMU3S4wpDfoHG5sNGow0PGxCNeLYIEQL61MmUQm07DfN5Q943i6o+ll68SQnW2Za9XL+P1X9AsncoAg2K0eZzZrhVJKp6xqhHlal5dCE5dSeqyZhnbalUZuDbySKtD0VT3T5O6GcqUpqVKYtK0r1aVoKlNFTOGkgo6hWi7y3FeMMgjumUbU7gpezJ3NS8Knn5uCWga6XVjA9wnxtxFdLXRPqncUOi2jSxNVGqbs6RNNStc/DoUgs3YskHsxa1zSz655SaO4md0y0g1qjWh9FPkcKotRniVYUibWcmbpKbu6fOnQxqevLThF/SKOm6xQj1CFjrHYVkn5q7tCNiFOXd9VRM2Uv+cMUB88S1eeGZgrRR4dVpAh1tzsCEOVVT/UkUJ/n0u7FqiubMtV7EruLouVXVmpCunlLXgt0q7ldKnbrXcpUxvxU7igsYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXauK9vookcaTsyht/5m2lw097bupn/jpT34gsQVxI4SQD+Sn5ZN7IN151FNA5klNyiOQ+Y2nTzs+5xndAOyyxIsaTZxaz2XZoGl0SKNUFjUrWvHaXVr6vgj9Td5srduWMtktsyKq8rm0FWyJNPgcI/ZdoYVrgNbTVgWPI6eVKRPQLWtS9Iu/N+dLg+mCYTlpMbhk4yXWWcIqxe+CpaZsvXiZTgOm1xEsp0moshcbSpE9WpuFWmXTLqrfzOEJUiqkqimqlXdIpwiilHez3GN49CNiZZ4oirJtXr1RyalVNNMmmZMm4Xs+zF5UpSlNylKdIBX9w4sWlac9W37gfGarUiTyxD1JwTFIbJpk7avqR8W+MNtq1jFaFXISUhObqdT04RU9LV09zutMphl5SxYOWuPnjlW1HSxW5EE01SlMUmQ+pQ5S91nEPRwPhiTkY6rJu1m0XH7zIiqbd/6JvXtdwc1fXAJE9xBspvb0Rdb1VHmVMqFKg4XJQmWuUx8x931o+UfifbPNhnEuy1jDv2ibtCjimnU9FV1EUi7nncj+cUFsLYKQtmEteaqeSZwKhF0t85a0VomSqZCqdLp8Aw6h8HowzeiLmXfKmK0aMEjKHoY5Um7kyxKZtztGygO1CYlM5263sOmdBq2bLbySMof6oVdcI25Qnc5U1PciaxskzlGJJKNWou3X4ZDk7IVehgVCNHqkojcsvv5Ryk4I5zF1CnTMv2WXp8F0oXp9oWDatutrSttjbrZwdVNknokUP0zVAdG57raWwRsRyg4dOn59Fq0bUpVVQ2XdN0jVyjrqXxbtTNW0g5Uj3kgmc6LV7wFK5M3nV3S9iYfW6rRb3bVi5q+XYvYxxvhs5b03DlNky16tBGZPBCJmpRtMy9xTDhw2y0oZVQtd3cQWR6XB6XBXNX+IBm2uIGGT5YiDCdilVl+t13S7vW9Xz/UcIdtLEOyVEW6xbiYbjh1vdHhdMy2XPk3O6yCPOcErUXSo1XUXqQ+9s9C1pStSNmxm1C/xkVN/IP1D4NW5Cbx0XCyiscosskrlTKatTt9HdNUpadgAmEFccDcaS/MaTSeaB9BeqdeEU/4xnhA7Ew2icPqSXMx+4dKSVUqqmcUL1UyZCcgtBPAEKcX7Ft7hNbaLV85XROVFwo3Qqqk1OolnLqG9bl90OrCYm2ZcsMyfxzlJdB8qkgdGtSVq2MpmylVJm4HJH6UshdvPPp2LuV5HtpNcjp60TInUp1SEKnnpnL0qZSFzetGFb4JRTdJm3byjlGrNrGtyKJEKWpjMjL1TPXt7u+a+4ATFlcFnOI5eajJGNO2YZt8rpVpUqXb3dwY6PxFtt9GqTDyq8U0RynKrJE0CqlU5NS1OMXaGEkTbULPwL6Rdyqdx5d975rwus0R6VaeoLuj4q4XSjhk1bK3q9WWilyKxyhm6VSpUTIZPcNTLw+Aqan8NAE4g52KuKMJJwzxJ2yXzZFka7pTDMiNWnbbSz7cbQEbwkW3JUN1TVUPmOb+cJKAr+ZxUgYCafwzyHlaLR8erKLKFRLpb3KXMc+fMOZLEG0KW4ncDN7FSCR1SI9N0nyq5c9M9eyKQw7Nx4fs7gdy7xd4ZPmrb60DX1KanVMIzOYFQkwdStJNVEh1c9CkL0su9SNjU3O3lLugJJc97xtj0YkXiJBzzQXK1RMxQoYplD8gvKHZYXpb8g7Qj0V6aztRWjYlenVUqVN056bnYlPwPXDsTNooSzSIa0X0yREg2eJZfPol1CiPWfhklalxknaTbp0ik3dtGzZUpaUSK4clWP1PVgLIFc39c0nFSUFEs5drDoyW+yqyrshDJomTKQxUuEbLun3Te9GFjDoOmTSRb0QdtEFk6V3aEUpQ25UBTpMXLgjph62esEZmKodq1I+bH3CmWUj989JPuDZf5w6knjW0nUE2dus45o6cEZOCvVnCNW6NVG++apHObg5twuQTvEuUraFtUkIhi0oqrING9V1k6VSaUUOVAzhT8RExX9yXdB21EZFZOElNJo6mEXDYqKKL4yBipkaVKXq148Bl0McikM0IW0lzMXCaBzmorSilKqslnhCUSy9pKpP0iiR2DiZS+pB+zowQRrHtWTgyrd1Rcpt8Ez0LyexGMtO+WFyXo8sKQiGhlmqBlVHKRqbiiqVCoq7hew3Dn3BLbZse37Mo55hNlCmdmIdydRWqhjZeR0zVAS0Q65r5j7XesIpaOkXjqQTVO3RZJUUrUqeXPu5jF7oTEQu47BhLsuSNnJxmk7LGt1kyIrJ0MTdUycLd/RAd/nttM1HyS03HkPG8N4Q6xczb8p2umCV0We4VYIN5qLOq/JnbFoqTMqX1HbEFXwOQWnZScVuWRUdO+s1OalaIm30VynubvVy5cnT7EdqmEjVW6mF2updyq4aUb65DFLQjhVvn0jUp51K6xv5AGbm8S4CCk1YpVq7cuk3SSFUW6VDmOdVEyxNzp+pMM5b9wMLpYElIheirZTMSlTFymoYhtwxTUEZuLDasxPc8sdLqM32/GjwhqJlNQpkkVkeSb1C5hn7VtdtaMRzNbLnWqZQ7hZdXpnVVUNumOannAJKOBjZaQLFRzqQMlVSjZA61Sk5RsohrXF60HLlds2XcKKJqNU9zJyqrImWob+JMps/aygMvz720e4JO3VXlE3MUzo+c1PwSESry65/U9l66g+nP7ZFG5HVLritA5zkIffRcpjeeX+cUVJc8Rhg6ZSU0efkEpGXKozcr0UVUKWkghkpRQnUNTIYlcpe4IPq9tKxHztsmXEVTdctXa7lU1CZnLdy3JuUKfLlJxaG7u8oBf+5Tqbg5EJYYlWGqWiLW5WNd7J8nPXgl4NO16ovuiiRRcqwmmqchHrJuG5+QdOoDKCnoDHSHnDt0DRKjTf8ApHZajgptRJRwVLdrl5Bs5i8EXCK+jMJLOhoNtCxbGqKbZ03d6paFoqqokvrEzG8+mcBzDXFh1fqrpOLo1kKoIkdGqZnUuZLMamamcvT4ZTDE2tinbT635GfQiyR8cxOVGlUy0WUrwjE3FEU+Gmbg8mokFt4fQNqLJrR6q5dONJEE1Dbu6iQ51d3+eYRaUwLjnaLtROdk1ZBWqJkV1zlNl0NbSJWlKcItddTpm7QCVxuIdqy7ttHRkjvtVykVclUm5zEoRQuoTMfcyk4vuhNBXVp4YRdpO2SsK/fpIooEbrtaqU03GmlokMcvrfi0FigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAONynaHIAA43KdocgA43KdocgADjcp2qBuU7VByADjcp2qBuU7Q5ABxuU7VByAAONynaDcoOQAcblOruBuU7VByADjcp2hyAAOK0pXpVpQNynaHIAONynaDcp2hyADjcp2hyAAONynaDcp2hyADjcoG5TtUHIAA43KDkAHwOkm5JVNRMpiV6pTU3aVGM52reqgVvWIZVRS3chKolyl/wCNygzQ43KdoBjiRcc2dGdoNESrq7uorQtKG6fTqMjuU7QblO0OQAcblO0OQAcblO0G5TtUHIAONynaDcp2hyAD51KU1K0rSlaV6Vd0VzD4LWZBmZb3IuWrNu9ap1qflUcmzHr/ABUqen6ZhZQ43KdoBW7TBu2WLojoizgxk6sakpU3SpVqTKlu9sdcuCNq733prvaNKN9PR1eLqfe50dXL28huoLQ3KdoNynaAVxK4MWhMoqpKkVyOFDL7pTbnCqVvTd/g+pU/5RJ7Zttha0Q2iGBMqLfPubpKcLdNm84SDcp2g3KdoByONynaHIAONylerSgblO0OQAcblN3d3ByAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//Z","images":["data:image/jpeg;base64,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m5t795vCLwheeKDm5t8d5vCLwheeKG04ANWObm3v1Og3hF4QvPFBzc2+O83hH4QvPFDacAGrHNzb37zeEXhC88UHNzb37zeEXhC88UNpwAasc3NvfvN4ReELzxQc3NvjvN4ReELzxQ2nABqxzc29+83hF4QvPFD60n9vylNymEOEtKU/+Y3vixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+373osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLDm/t+d6LCXwjfeLG0QANXeb+353osJfCN94sOb+353osJfCN94sbRAA1d5v7fneiwl8I33iw5v7fneiwl8I33ixtEADV3m/t+d6LCXwjfeLFl4NSWO75OVrjZaVrQpyqE3lzDkFXRVadnm1Slyi1xxuU7QDkAAAAAAAAAAAAAAAAdV51pT8mceOS32ReeznHyyg9kHfWVfWDxnV+yDz2c4+WOL0Uu6joQyd6tRMnwh871TjUVG9smCbPjv021c3Lon2BT+sHWfCVTPZ1ESfDJd10/OFybNfm22H7ftPjCm0/OFxbNXm3WH7ftPjiIE32yPumsRfbFD5qiKbR66QXFtlfdN4i+2KHzVEUyn11MX32G/XkXnmkX57TM/nJx6EXOhvq3ZdH0xisT+YYeevkXHmj357TM/nKg9EpKmtEuU/TG5/ijIfzzYOcVArtf2u8OmLGSVFcYepczJGdYK9cYyjgh6fpaYnD2SbxrczhypkImNNmTsS8nRtHLq9nkyl9UbkEFd3fpsLihGu71jeZfcCTRpHE+qnOPEqoNUuG1a9v1YrK95nfN+GOnXi2eQv8Ax7oRdai5eeVr26jnnpa+nClueZz+MfDnkcjHlXXPz1p+nD889Tf07/xFMc8CvbH45vn9Np/KHKLiVutP00WhsmyS10bUWGUI14yv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"],"specs":{"Công nghệ di chuyển":"AIVI 3D + LSD","Điều khiển qua App":"Ecovacs Home","Dòng":"Lau hút đồng thời","Dung tích hộp nước":"240ml","Dung tích Hộp rác":"470ml","Dung lượng PIN":"5200mAh","Hạng mục":"Chi tiết","Lưu trữ":"100 vân tay, 100 thẻ từ, 100 mã số, 30 khuôn mặt","Chất liệu":"Hợp kim nhôm + ABS cao cấp","Kích thước cửa phù hợp":"Độ dày từ 40–90mm, độ rộng đố cửa tối thiểu 80mm","Ruột khóa":"Chuẩn 6068 – độ bền cao, chống cắt phá"},"features":["Description","KHÓA CỬA THÔNG MINH HUBERT HB CG26F – CÔNG NGHỆ HIỆN ĐẠI, AN TOÀN TUYỆT ĐỐI","NHỮNG TÍNH NĂNG NỔI BẬT CỦA HUBERT HB CG26F","Công nghệ mở khóa hiện đại – bảo mật tối ưu","Nhận diện khuôn mặt 3D :","Mở khóa từ xa qua WiFi : Kết nối qua ứng dụng Wishome","Thẻ từ: Quét nhanh, tiện lợi, phù hợp cho người già và trẻ nhỏ","Chìa khóa cơ chống sao chép : Dự phòng trong trường hợp khẩn cấp, đảm bảo an toàn cao hơn","An toàn vượt trội","THÔNG SỐ KỸ THUẬT"],"model":"HB CG26F","brand":"Hubert","category":"Khóa vân tay","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"hb-cg26f-khoa-cua-dien-tu-hubert-hb-cg26f","_addedBy":"vai-add-product"},"BV101":{"name":"Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 Chính Hãng","description":"Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 là một thiết bị nhà bếp tối giản nhưng sở hữu hiệu năng vận hành ấn tượng và bền bỉ. Được chế tác từ chất liệu inox 304 mờ cao cấp kết hợp kiểu dáng cổ tròn mềm mại, dòng vòi cố định này mang lại sự vững chãi cùng tính linh hoạt tối đa cho bồn rửa bát. Đây chắc chắn là giải pháp tinh tế, dễ sử dụng giúp công việc nội trợ hằng ngày của gia đình bạn trở nên nhẹ nhàng hơn bao giờ hết.\nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nThông Số Kỹ Thuật Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nChất liệu cấu tạo: Inox 304 mờ cao cấp\nChức năng chính: Thân vòi cố định, cổ tròn xoay hướng 360 độ mượt mà\nChế độ nước: 2 đường nước Nóng và Lạnh liên hoàn\nChiều cao tổng thể từ chân vòi: 355 mm\nChiều cao từ mặt đá đến đầu xả nước: 250 mm\nKhoảng cách vươn vòi (Từ tâm thân vòi đến đầu vòi): 200 mm\nChiều cao phần bầu vòi cố định: 90 mm\nKích thước: Chân đế Ø50 mm / Thân dưới Ø45 mm / Thân trên Ø25 mm\nKích thước vòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \nĐặc Điểm Nổi Bật Của Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 \nVòi Boss rửa bát cố định cổ tròn xoay 360 độ BV101 \n1. Chất liệu Inox 304 mờ cao cấp \nSản phẩm được làm hoàn toàn từ chất liệu inox 304 mờ thượng hạng, đem lại độ bền vượt trội, chịu nhiệt tốt từ đường nước nóng và không lo hoen rỉ.\nBề mặt inox mờ có khả năng chống bám bẩn, hạn chế tối đa các vệt ố của nước cứng hay cặn dầu mỡ, giúp việc vệ sinh, lau chùi vòi nước bồn rửa bát hằng ngày trở nên cực kỳ đơn giản.\n2. Thiết kế cố định bền vững kết hợp tính năng xoay 360 độ linh hoạt \nCấu trúc cố định cứng cáp: Khác biệt với dòng dây rút, mẫu vòi rửa chén Boss mã BV101 sở hữu kết cấu thân cố định vững vàng, cho cảm giác sử dụng đầm tay, bền bỉ lâu dài và không lo các lỗi hỏng vặt.\nXoay hướng đa chiều: Cổ vòi tròn cong mềm mại có khả năng xoay 360 độ cực kỳ trơn tru, giúp bạn dễ dàng dẫn nước đến mọi góc của chậu rửa hoặc xoay gọn vòi sang một bên khi cần đặt các loại xoong nồi lớn vào bồn.\n3. Tích hợp 2 đường nước nóng lạnh tiện dụng \nDòng vòi rửa bát này tích hợp sẵn hai đường nước nóng và lạnh đáp ứng mọi nhu cầu sinh hoạt:\nNước nóng: Giúp rửa trôi dầu mỡ bám trên bát đĩa nhanh chóng, đồng thời hỗ trợ khử khuẩn đồ dùng nhà bếp một cách an toàn.\nNước lạnh: Tiện lợi cho công việc sơ chế thực phẩm, rửa dọn thông thường hằng ngày.\nHướng Dẫn Sử Dụng Và Lưu Ý Lắp Đặt Để Tăng Tuổi Thọ Vòi \nXả sạch đường ống trước khi lắp: Mở van cho nước chảy tự do từ 1 – 2 phút trước khi lắp vòi để đẩy sạch các loại cát sỏi, cặn bẩn xây dựng ra ngoài, tránh làm nghẹt lưới lọc đầu vòi.\nVệ sinh vòi đúng cách: Chỉ lau chùi thân vòi bằng khăn mềm ẩm hoặc nước rửa chén pha loãng. Tuyệt đối không dùng bùi nhùi sắt hoặc chất tẩy rửa có tính axit mạnh chà xát lên vòi để tránh gây trầy xước bề mặt inox mờ.\nThao tác gạt nước nhẹ nhàng: Gạt cần điều chỉnh lượng nước và nhiệt độ nóng lạnh với lực vừa phải, giúp lõi chia nước bên trong vòi vận hành êm ái, bền bỉ qua năm tháng.\nĐặt Mua Vòi Boss Cố Định Cổ Tròn Xoay 360 Độ BV101 Chính Hãng Tại Đâu? \nVòi Boss Cố Định Cổ Tronfn Xoay 360 Độ BV101 hiện đang được phân phối chính hãng tại hệ thống của Vật tư tổng hợp giá sỉ , cam kết bảo đảm đầy đủ mọi quyền lợi tiêu dùng từ nhà sản xuất cùng chính sách độc quyền Bảo hành gỉ vĩnh viễn.\nLiên hệ ngay Hotline hoặc chat trực tiếp để được tư vấn kích thước chậu rửa phù hợp, nhận thông tin ưu đãi tốt nhất và hỗ trợ kỹ thuật lắp đặt nhanh chóng ngay hôm nay!","priceNum":1740000,"listPn":0,"salePn":1740000,"priceMode":"both","image":"https://vattutonghopgiasi.com/wp-content/uploads/2026/07/voi-boss-co-dinh-co-tron-xoay-360-do-bv101-2.jpg","images":["https://vattutonghopgiasi.com/wp-content/uploads/2026/07/voi-boss-co-dinh-co-tron-xoay-360-do-bv101-2.jpg"],"specs":{},"features":["Sản phẩm được làm hoàn toàn từ chất liệu inox 304 mờ thượng hạng, đem lại độ bền vượt trội, chịu nhiệt tốt từ đường nước nóng và không lo hoen rỉ.","Bề mặt inox mờ có khả năng chống bám bẩn, hạn chế tối đa các vệt ố của nước cứng hay cặn dầu mỡ, giúp việc vệ sinh, lau chùi vòi nước bồn rửa bát hằng ngày trở nên cực kỳ đơn giản.","Cấu trúc cố định cứng cáp: Khác biệt với dòng dây rút, mẫu vòi rửa chén Boss mã BV101 sở hữu kết cấu thân cố định vững vàng, cho cảm giác sử dụng đầm tay, bền bỉ lâu dài và không lo các lỗi hỏng vặt.","Xoay hướng đa chiều: Cổ vòi tròn cong mềm mại có khả năng xoay 360 độ cực kỳ trơn tru, giúp bạn dễ dàng dẫn nước đến mọi góc của chậu rửa hoặc xoay gọn vòi sang một bên khi cần đặt các loại xoong nồi lớn vào bồn.","Dòng vòi rửa bát này tích hợp sẵn hai đường nước nóng và lạnh đáp ứng mọi nhu cầu sinh hoạt: Nước nóng: Giúp rửa trôi dầu mỡ bám trên bát đĩa nhanh chóng, đồng thời hỗ trợ khử khuẩn đồ dùng nhà bếp một cách an toàn.","Nước lạnh: Tiện lợi cho công việc sơ chế thực phẩm, rửa dọn thông thường hằng ngày.","Xả sạch đường ống trước khi lắp: Mở van cho nước chảy tự do từ 1 – 2 phút trước khi lắp vòi để đẩy sạch các loại cát sỏi, cặn bẩn xây dựng ra ngoài, tránh làm nghẹt lưới lọc đầu vòi.","Vệ sinh vòi đúng cách: Chỉ lau chùi thân vòi bằng khăn mềm ẩm hoặc nước rửa chén pha loãng. Tuyệt đối không dùng bùi nhùi sắt hoặc chất tẩy rửa có tính axit mạnh chà xát lên vòi để tránh gây trầy xước bề mặt inox mờ."],"model":"BV101","brand":"Boss","category":"Chậu rửa, Vòi rửa","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"bv101-voi-boss-co-dinh-co-tron-xoay-360-do-bv101-chinh-hang","_addedBy":"vai-add-product"},"BA7545":{"name":"Chậu Đúc 1 Hố Âm Bàn BA7545 - Boss Việt Nam","priceNum":5720000,"description":"Chậu Đúc 1 Hố Âm Bàn là một trong những sản phẩm đang được ưa chuộng trên thị trường hiện nay, nhờ vào thiết kế tinh tế, chất liệu bền bỉ và tính năng vượt trội. Được chế tạo từ inox 304 chất lượng cao, sản phẩm này không chỉ mang đến sự hiện đại, sang trọng cho không gian bếp, mà còn đảm bảo độ bền theo thời gian. Nếu bạn đang tìm kiếm một sản phẩm bếp tiện lợi và thẩm mỹ, Chậu Đúc 1 Hố Âm Bàn chính là lựa chọn lý tưởng. \n1. Chất Liệu Inox 304 Cao Cấp \nChậu Đúc 1 Hố Âm Bàn của Boss được làm từ inox 304, một loại inox phổ biến trong ngành sản xuất đồ dùng bếp cao cấp. Với tính năng chống ăn mòn, chống oxi hóa và bền bỉ trong môi trường ẩm ướt, inox 304 giúp sản phẩm không chỉ giữ được vẻ đẹp sáng bóng mà còn có tuổi thọ lâu dài. Bề mặt inox mịn màng, dễ dàng vệ sinh, giúp chậu luôn sạch sẽ và không bị bám bẩn. \n2. Thiết Kế Đúc Âm Bàn Tinh Tế \nMột trong những ưu điểm nổi bật của Chậu Đúc 1 Hố Âm Bàn chính là thiết kế khoét âm bàn, tạo ra một không gian bếp gọn gàng và hiện đại. Việc lắp đặt chậu âm bàn không chỉ tiết kiệm diện tích mà còn dễ dàng trong việc vệ sinh, không bị bụi bẩn bám vào các đường viền như các loại chậu truyền thống. Thiết kế này mang đến sự sang trọng, nâng tầm không gian bếp của bạn. \n3. Các Kích Thước Phù Hợp Với Mọi Không Gian \nChậu Đúc 1 Hố Âm Bàn có nhiều kích thước khác nhau, giúp bạn dễ dàng lựa chọn sao cho phù hợp với không gian bếp của mình. Ba loại kích thước phổ biến của chậu đúc âm bàn bao gồm: \nChậu đúc 1 hố âm bàn \nBA6845 : Kích thước khoét đá 64 x 41 cm, phù hợp với không gian bếp có diện tích vừa phải. \nBA7545 : Kích thước khoét đá 71 x 41 cm, là lựa chọn lý tưởng cho những căn bếp rộng rãi, mang đến sự thoải mái trong việc sử dụng. \nBA7845 : Kích thước khoét đá 74 x 41 cm, với không gian rộng rãi hơn, mang đến sự tiện lợi cho việc nấu nướng và vệ sinh. \nMỗi kích thước đều được thiết kế để đảm bảo tính thẩm mỹ và công năng, giúp bạn lựa chọn được sản phẩm phù hợp nhất với nhu cầu sử dụng. \n4. Độ Dày Vượt Trội \nChậu Đúc 1 Hố Âm Bàn có độ dày viền 3.0mm và dày thùng 1.0mm, mang lại độ bền cao và khả năng chống va đập hiệu quả. Với thiết kế này, chậu có thể chịu được lực tác động mạnh mà không bị biến dạng, giúp sản phẩm duy trì hình dáng hoàn hảo suốt thời gian sử dụng. Độ dày của inox cũng giúp chậu không bị móp méo, đồng thời giữ được tính thẩm mỹ và độ bền lâu dài. \n5. Dễ Dàng Vệ Sinh Và Bảo Quản \nChậu Đúc 1 Hố Âm Bàn không chỉ nổi bật với thiết kế tinh tế mà còn rất dễ dàng vệ sinh. Với bề mặt inox mịn màng và không có các khe hở, việc lau chùi, rửa chén bát hay làm sạch sau khi nấu nướng trở nên đơn giản hơn bao giờ hết. Không chỉ giúp tiết kiệm thời gian, chậu còn giúp không gian bếp của bạn luôn sạch sẽ và gọn gàng. \n6. Tính Năng Tiện Dụng Và Hiện Đại \nChậu Đúc 1 Hố Âm Bàn mang lại sự tiện nghi tối đa cho người sử dụng. Bạn có thể dễ dàng rửa thực phẩm, chén bát hoặc các vật dụng nhà bếp khác mà không lo bị tràn ra ngoài. Bề mặt chậu phẳng, tạo sự thuận tiện khi đặt đồ vật lên, tránh việc nước tràn hoặc bẩn ra ngoài. Đặc biệt, thiết kế âm bàn còn giúp tiết kiệm diện tích, làm cho không gian bếp của bạn trở nên rộng rãi và gọn gàng hơn. \n7. Đặc Điểm Kỹ Thuật Sản Phẩm \nChất liệu : Inox 304 \nĐộ dày viền : 3.0mm \nĐộ dày thùng : 1.0mm \nKích thước khoét đá : BA6845 : 64 x 41 cm \nBA7545 : 71 x 41 cm \nBA7845 : 74 x 41 cm \n8. Lý Do Nên Chọn Chậu Đúc 1 Hố Âm Bàn \nChất lượng vượt trội : Sản phẩm được làm từ inox 304, bền bỉ và không bị ăn mòn, giúp chậu duy trì vẻ sáng bóng lâu dài. \nThiết kế sang trọng : Với kiểu dáng khoét âm bàn, chậu giúp không gian bếp trở nên hiện đại và gọn gàng hơn. \nDễ dàng vệ sinh : Bề mặt inox mịn màng và không có các khe hở giúp việc vệ sinh trở nên dễ dàng. \nChống va đập tốt : Độ dày viền và thùng inox giúp chậu chống chịu lực tốt và có độ bền lâu dài. \nPhù hợp với mọi không gian : Các kích thước khác nhau giúp bạn dễ dàng lựa chọn sản phẩm phù hợp với không gian bếp của mình. \nChậu Đúc 1 Hố Âm Bàn là sự kết hợp hoàn hảo giữa tính năng, chất lượng và thẩm mỹ. Sản phẩm này không chỉ đáp ứng nhu cầu sử dụng của bạn trong bếp mà còn tạo điểm nhấn cho không gian bếp hiện đại, sang trọng. Với chất liệu inox 304, thiết kế thông minh và dễ dàng vệ sinh, đây là lựa chọn lý tưởng cho mọi gia đình. \nHãy lựa chọn Chậu Đúc 1 Hố Âm Bàn để mang đến sự tiện lợi và vẻ đẹp cho không gian bếp của bạn","specs":{"BA7545":"Kích thước khoét đá 71 x 41 cm, là lựa chọn lý tưởng cho những căn bếp rộng rãi, mang đến sự thoải mái trong việc sử dụng.","BA7845":"Kích thước khoét đá 74 x 41 cm, với không gian rộng rãi hơn, mang đến sự tiện lợi cho việc nấu nướng và vệ sinh.","Chất liệu":"Inox 304","Độ dày viền":"3.0mm","Độ dày thùng":"1.0mm","BA6845":"64 x 41 cm"},"features":["1. Chất Liệu Inox 304 Cao Cấp","2. Thiết Kế Đúc Âm Bàn Tinh Tế","3. Các Kích Thước Phù Hợp Với Mọi Không Gian","Chậu đúc 1 hố âm bàn","4. Độ Dày Vượt Trội","5. Dễ Dàng Vệ Sinh Và Bảo Quản","6. Tính Năng Tiện Dụng Và Hiện Đại","7. Đặc Điểm Kỹ Thuật Sản Phẩm","Chất liệu : Inox 304","Độ dày viền : 3.0mm"],"images":["https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-duc-1-ho-am-ban.jpg"],"image":"https://bossvn.vn/wp-content/uploads/2024/10/boss-chau-duc-1-ho-am-ban.jpg","_addedBy":"vai-add-product","brand":"Boss","salePn":5720000,"listPn":0,"priceMode":"both","category":"Chậu rửa chén","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"ba7545-chau-duc-1-ho-am-ban-ba7545-boss-viet-nam","model":"BA7545"},"__verify__":{"deleted":true},"__final_check__":{"deleted":true},"TL869IMAX":{"name":"Bếp Từ Canzy CZTL869IMAX","description":"BẾP TỪ ĐÔI CANZY CZ TL869I MAX Canzy CZ TL869I MAX là dòng bếp từ đôi cao cấp hội tụ những tính năng hiện đại nhất, mang lại trải nghiệm nấu nướng an toàn, nhanh chóng và cực kỳ tiết kiệm điện năng cho gia đình bạn. ĐẶC ĐIỂM NỔI BẬT VỀ THIẾT KẾ Mặt kính Kanger vát cạnh tinh tế: Được bo viền nhôm 4 cạnh chắc chắn, vừa t","priceNum":6200000,"listPn":14980000,"salePn":6200000,"priceMode":"both","image":"https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","images":["https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742205457-be482ddf736ace36ea7308fe3a2b6806.jpg","https://bizweb.dktcdn.net/100/344/152/products/gen-n-z7829742322070-a36944508c279d6b99c2ae58d77621bd.jpg","https://bizweb.dktcdn.net/100/344/152/products/1-4dfb6f78-f7ff-4322-b4fb-70815e12b95f.png","https://bizweb.dktcdn.net/100/344/152/products/2-59f34d91-4f3f-4477-a43b-2cac5dae561a.png"],"specs":{},"features":[],"model":"TL869IMAX","brand":"Canzy","category":"Bếp Từ Canzy CZ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"tl869imax-bep-tu-canzy-cztl869imax","_addedBy":"vai-add-product"},"GW0630G":{"name":"Thùng rác đôi GW0630G","description":"Thùng rác đôi GW06.30G Ray bi giảm chấn toàn phần, khung bắt đáy, Khung bằng thép sơn tĩnh điện, dày dặn, chắc chắn bằng thép!","priceNum":4248720,"listPn":0,"salePn":4248720,"priceMode":"both","image":"https://garis.vn/uploaded/GS06_30G%20N%204.jpg","images":["https://garis.vn/uploaded/GS06_30G%20N%204.jpg"],"specs":{},"features":[],"model":"GW0630G","brand":"Garis","category":"Thùng rác","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gw0630g-thung-rac-doi-gw0630g","_addedBy":"vai-add-product"},"GP0270E":{"name":"Giá xoong nồi, rổ nan dẹt, cánh kéo Garis GP0270E","description":"Giá xoong nồi GP02E được thiết kế thông minh với kiểu dáng hiện đại, giúp tổ chức không gian bếp một cách gọn gàng và tiện lợi","priceNum":3716280,"listPn":0,"salePn":3716280,"priceMode":"both","image":"https://garis.vn/uploaded/Gia%CC%81%20xoong%20no%CC%82%CC%80i%20GP02E1-1.jpg","images":["https://garis.vn/uploaded/Gia%CC%81%20xoong%20no%CC%82%CC%80i%20GP02E1-1.jpg"],"specs":{},"features":[],"model":"GP0270E","brand":"Garis","category":"Giá xoong nồi","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gp0270e-gia-xoong-noi-ro-nan-det-canh-keo-garis-gp0270e","_addedBy":"vai-add-product"},"MM0235V":{"name":"Kệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V GM- Garis V","description":"Nan quả trám, inox 304, bề mặt điện hóa bóng gương, dùng cho cánh mở và kéo (duy nhất tại Việt Nam)\nGợi ý kết hợp phụ kiện khi thiết kế căn bếp : Căn bếp sẽ đẹp hơn khi kết hợp giá dao thớt, gia vị, chai lọ MM02V với các sản phẩm khác trong MV Series.\nKèm theo: Ray âm giảm chấn MEGKEL (bắt vách tủ), 1 bộ bắt mặt tùy chọn dùng cho cánh kéo, 1 khay hứng nước, phiếu bảo hành, giấy chứng nhận inox 304\nKệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V Quý Khách có thể tham khảo Hướng dẫn lắp đặt phía dưới:","priceNum":7128000,"listPn":0,"salePn":7128000,"priceMode":"both","image":"https://garis-vn.com/wp-content/uploads/2024/03/1-MM02V-2.png","images":["https://garis-vn.com/wp-content/uploads/2024/03/1-MM02V-2.png"],"specs":{"Chất liệu":"Inox 304, tiêu chuẩn Nhật Bản JIS G4305","Bề mặt":"Bề mặt rổ bóng sáng với công nghệ điện hóa bóng gương Mirror BA","Tải trọng":"25kg","Bảo hành":"25 năm (bảo hành rỉ rổ)"},"features":["Nan quả trám, inox 304, bề mặt điện hóa bóng gương, dùng cho cánh mở và kéo (duy nhất tại Việt Nam)","Kệ dao thớt, gia vị, chai lọ, cánh mở/kéo MM02.35V"],"model":"MM0235V","brand":"Garis","category":"Kệ đựng gia vị dao thớt","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"mm0235v-ke-dao-thot-gia-vi-chai-lo-canh-mo-keo-mm02-35v-gm-garis-v","_addedBy":"vai-add-product"},"SMS6ZCI16E":{"name":"Máy rửa bát độc lập Bosch SMS6ZCI16E serie 6","description":"Máy rửa bát Bosch SMS6ZCI16E có xuất xứ từ Châu Âu được trang bị nhiều công nghệ hiện đại như Sấy Zeolith – khô nhanh hơn với mức tiêu thụ năng lượng ít hơn, Ngăn kéo Vario cung cấp không gian cho các dụng cụ dao kéo lớn,… và nhiều tính năng hiện đại khác giúp chén bát của bạn sạch và khô hoàn hảo…, mang đến cho người dùng những trải nghiệm hoàn toàn mới.\nĐặc điểm nổi bật của máy rửa bát Bosch SMS6ZCI16E \nThiết kế độc lập linh hoạt vị trí lắp đặt (có thể đặt âm). Máy được làm từ chất liệu thép không gỉ, bề mặt màu inox có lớp phủ chống bám vân tay. Tổng thể của chiếc máy giúp nhà bếp của bạn trở nên sang trọng và tinh tế hơn.\nBảng điều khiển đặt ở phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng.\nHệ thống phân phối viên rửa dosing assistant thông minh\nTự vệ sinh: tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo.\nẢnh thực tế của máy rửa bát độc lập Bosch SMS6ZCI16E serie 6 \nHệ thống khay rửa  \nHệ thống giàn rửa gồm có 1 ngăn kéo và 2 giàn rửa (gọi là giàn trên và giàn dưới). Ngăn kéo trên cùng để chứa dụng cụ nhỏ như dao, kéo, đũa, ly nhỏ. Giàn trên để chứa chén bát, đĩa, ly loại cỡ vừa. Giàn dưới để chứa các dụng cụ lớn như nồi chảo, thớt, rổ, bát tô, đĩa cỡ lớn.\nNgăn kéo VarioDrawer để đựng các đồ dùng nhỏ như đũa, thìa, dĩa…  Đồng thời giúp giải phóng và tăng diện tích chứa cho ngăn dưới cùng.\nHệ thống Rackmatic điều chỉnh chiều cao giàn rửa theo nhu cầu. Bạn có thể dễ dàng thay đổi vị trí độ cao giàn rửa thông qua khớp nâng hạ, ngay cả khi giàn chứa đang đầy.\nHệ thống vòi phun Extra Clean Zone: giúp tăng áp suất nước và rửa sạch bát đĩa ở giàn giữa. Nhờ Extra Clean Zone mà bát đĩa được làm sạch tối ưu hơn với lượng nước nhiều hơn mà không tốn thêm chất tẩy rửa.\nChương trình rửa  \n8 chương trình rửa: \nRửa Eco 50°C\nRửa tự động 45-65°C\nRửa thông minh (Intelligent)\nRửa chuyên sâu 70°C\nRửa nhanh 60°C (Express)\nRửa ly 40°C (Glass)\nRửa yên tĩnh 50°C\nRửa tráng (Favorite)\nBảng điều khiển của máy rửa bát độc lập Bosch SMS6ZCI16E  \nChương trình rửa đặc biệt \nTăng tốc độ rửa (SpeedPerfect Plus)\nRửa chuyên sâu (IntensiveZone)\nSấy tăng cường (Extra Dry)\nCông nghệ và cảm biến  \nExtra Dry (sấy tăng cường ): tăng nhiệt độ nước ở lần tráng cuối cùng và kéo dài thời gian sấy khô hơn. Đồng thời, các hạt nước đọng trên bát đĩa sẽ bốc hơi, ngưng tụ và rơi xuống đáy máy\nIntensiveZone (vùng rửa chuyên sâu) : được kích hoạt để tăng áp suất phun kết hợp nhiệt độ cao để rửa sạch hoàn toàn các vết bẩn cứng đầu, bám lâu ngày trên những vật dụng ở giàn dưới cùng.\nZeolith (công nghệ sấy Zeolith) : hút hơi ẩm trong quá trình rửa và thải ra ngoài dưới dạng không khí khô ấm giúp  bát đĩa khô hoàn hảo hơn, tiết kiệm điện năng hơn\nCông nghệ rửa thông minh , tối ưu quá trình rửa: máy sẽ tự động điều chỉnh các cài đặt và cung cấp một số lựa chọn thay thế cho người dùng\nHome Connect : giúp bạn dễ dàng điều khiển máy rửa bát mà không cần lại gần máy: lượng tiêu thụ điện nước và chất tẩy rửa, hoạt động của máy rửa bát\nCảm biến nước và cảm biến tải giúp tiết kiệm điện năng mà vẫn đảm bảo rửa sạch sẽ bát đũa\nĐộng cơ không chổi than hoạt động bền bỉ, tiếng ồn nhỏ không làm ảnh hưởng đến sinh hoạt của các thành viên khác trong gia đình\nHệ thống làm sạch sâu của máy rửa bát độc lập Bosch SMS6ZCI16E  \nHoạt động và tiêu thụ năng lượng  \nNhãn năng lượng: B\nĐiện / nước: 65 kWh / 9 liters\nThời gian Eco: 3h35′\nĐộ ồn: 40 dB\nNhãn độ ồn: B\nĐộ ồn yên lượng: 39 dB\nTính năng an toàn  \nKhóa trẻ em (ChildLock) : là tính năng khóa các chương trình máy đang hoạt động nhằm ngăn chặn sự thay đổi khi chẳng may trẻ chạm vào bảng điều khiển.\nHệ thống AquaStop : là hệ thống chống tràn 24/24 tự động ngắt hoạt động máy khi rò rỉ hoặc tràn nước ra bên ngoài.\nHệ thống chống sét lan truyền : là hệ thống dây nối đất nhằm hạn chế giật điện khi chạm vào khoang máy. Đồng thời bảo vệ người dùng khi gặp thời tiết cực đoan.\nThông số kỹ kỹ thuật","priceNum":19200000,"listPn":28790000,"salePn":19200000,"priceMode":"both","image":"https://b1.congngheviet.com.vn/file/s3-vn01/bosch-house-com-vn/wp-content/uploads/2024/01/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6.jpg","images":["https://b1.congngheviet.com.vn/file/s3-vn01/bosch-house-com-vn/wp-content/uploads/2024/01/may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6.jpg"],"specs":{"Rất phù hợp với các loại món ăn":"Bình sữa trẻ em, Chảo nướng, Bát đĩa nửa tải, Nồi và chảo lớn, Hộp nhựa, Ly uống rượu (23cm)","Chiếu sáng nội thất":"Có","Chương trình giặt":"Chu kỳ tự động, tiết kiệm, chuyên sâu, ngắn, im lặng","Chức năng nửa tải":"–","Cảm biến tải":"–","Chức năng chu kỳ rút ngắn":"Có","Chiếu sàn":"KHÔNG","Giá đỡ dưới có chức năng nâng":"–","Phát hiện chất tẩy rửa":"Co","Nạp chất tẩy rửa máy rửa chén tự động":"–","Chỉ báo nạp muối":"Có","Chỉ báo nạp nước trợ xả":"Có","Tín hiệu kết thúc chu kỳ":"Có","Loại tín hiệu kết thúc chu kỳ":"Quang học","Khóa an toàn trẻ em":"Có","Chất lượng giặt":"Cao cấp","Số nhiệt độ làm sạch":"6","Nhiệt độ làm sạch tối đa":"70°C","Phương pháp sấy":"Zeolit ​​(bát khô thêm)","Vùng chuyên sâu":"Nhanh","Điều khiển qua ứng dụng":"Có","Điều khiển máy sấy qua ứng dụng":"Vận hành từ xa, Đọc thông tin qua ứng dụng","Bắt đầu trì hoãn":"Có","Bắt đầu phân chia độ trễ":"1 – 24 giờ","Tùy chọn tắt tự động":"Có","Ngôn ngữ bảng điều khiển":"Tiếng Anh, Ký hiệu","Nhãn năng lượng":"B","Chi phí năng lượng hàng năm":"72,8 euro","Tiêu thụ năng lượng hàng năm":"182 kWh","Tiêu thụ năng lượng trên mỗi chu kỳ":"0,65 kWh","Chức năng tiết kiệm năng lượng":"Tự động tắt, Chu trình tiết kiệm năng lượng, Cấp nước nóng, Lượng nước sử dụng được xác định theo mức độ bẩn","Thời lượng chu kỳ sinh thái":"215 phút","Chi phí nước hàng năm":"3,43 euro","Lượng nước sử dụng hàng năm":"2520 lít","Lượng nước sử dụng mỗi chu kỳ":"9 lít","Thân thiện với môi trường":"Đúng","Xây dựng chất lượng":"Cao cấp","Số lượng vòi phun tay phun":"2","Loại động cơ":"Biến tần","Chất liệu nội thất":"Thép không gỉ","Đầu nối nước":"Nước lạnh và nước ấm","Bảo vệ rò rỉ":"Có","Loại bảo vệ rò rỉ":"Cảm biến rò rỉ đáy, Bảo vệ chống tràn, Ống an toàn","Ống đầu vào có thể tháo rời":"–","Ống thoát nước có thể tháo rời":"–","Chiều dài ống đầu vào":"1,65 m","Loại nguồn điện":"Mạng lưới điện","Nguồn điện tối thiểu":"2400W"},"features":["Bảng điều khiển đặt ở phía trước thân máy với các phím cảm ứng cùng màn hình LED hiển thị thời gian, thông báo giúp bạn vận hành và theo dõi chu trình rửa dễ dàng.","Hệ thống phân phối viên rửa dosing assistant thông minh","Tự vệ sinh: tính năng sẽ thực hiện xả lượng nước như quá trình rửa full tải với nhiệt độ cao giúp làm sạch khoang máy để sẵn sàng cho những lần rửa tiếp theo.","Ngăn kéo VarioDrawer để đựng các đồ dùng nhỏ như đũa, thìa, dĩa… Đồng thời giúp giải phóng và tăng diện tích chứa cho ngăn dưới cùng.","Hệ thống Rackmatic điều chỉnh chiều cao giàn rửa theo nhu cầu. Bạn có thể dễ dàng thay đổi vị trí độ cao giàn rửa thông qua khớp nâng hạ, ngay cả khi giàn chứa đang đầy."],"model":"SMS6ZCI16E","brand":"Bosch","category":"Máy rửa chén","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"sms6zci16e-may-rua-bat-doc-lap-bosch-sms6zci16e-serie-6","_addedBy":"vai-add-product"},"ZZTEST-SKIP":{"name":"ZZTEST SKIP","description":"ZZTEST SKIP","priceNum":1000,"listPn":0,"salePn":1000,"priceMode":"sale","image":"","images":[],"specs":{},"features":[],"model":"ZZTEST-SKIP","brand":"","category":"","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"zztest-skip","_addedBy":"vai-add-product"},"ZZTEST-NEW2":{"name":"ZZTEST NEW PRODUCT","description":"ZZTEST NEW PRODUCT","priceNum":1000,"listPn":0,"salePn":1000,"priceMode":"sale","image":"","images":[],"specs":{},"features":[],"model":"ZZTEST-NEW2","brand":"","category":"","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"zztest-new2","_addedBy":"vai-add-product"},"ZZVERIFY-A1":{"name":"ZZ Verify San Pham Moi A1 (re-sync lan 3)","description":"ZZ Verify San Pham Moi A1 (re-sync lan 3)","priceNum":2000,"listPn":0,"salePn":2000,"priceMode":"sale","image":"","images":[],"specs":{},"features":[],"model":"ZZVERIFY-A1","brand":"","category":"","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"zzverify-a1-url-scraper-v3","_addedBy":"vai-add-product"},"MPV0260":{"name":"Giá xoong nồi vách hộp, rổ nan oval, cánh kéo MPV0260","description":"Với thiết kế vách hộp thông minh, giúp phân chia không gian lưu trữ hiệu quả, MP02V giúp tiết kiệm diện tích bếp, đồng thời giữ cho các dụng cụ bếp luôn trong tầm tay khi cần sử dụng","priceNum":6145200,"listPn":0,"salePn":6145200,"priceMode":"both","image":"https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%20v%C3%A1ch%20h%E1%BB%99p%20MP02V%20(1).jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%20v%C3%A1ch%20h%E1%BB%99p%20MP02V%20(1).jpg"],"specs":{},"features":[],"model":"MPV0260","brand":"Garis","category":"Giá xoong nồi vách hộp MPV2 cánh kéo màu Titan MV Series","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"mpv0260-gia-xoong-noi-vach-hop-ro-nan-oval-canh-keo-mpv0260","_addedBy":"vai-add-product"},"MDV0260":{"name":"Giá bát đĩa, thìa đũa vách hộp, rổ nan oval, cánh kéo MDV0260","description":"Thiết kế vách hộp tiện lợi, giúp phân chia không gian lưu trữ hiệu quả, phù hợp với mọi không gian bếp. MD02V mang đến sự tiện nghi và tính thẩm mỹ cao cho căn bếp của bạn.","priceNum":6685200,"listPn":0,"salePn":6685200,"priceMode":"both","image":"https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%2C%20th%C3%ACa%20%C4%91%C5%A9a%20v%C3%A1ch%20h%E1%BB%99p%20MD02V%20(3).jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%2C%20th%C3%ACa%20%C4%91%C5%A9a%20v%C3%A1ch%20h%E1%BB%99p%20MD02V%20(3).jpg"],"specs":{},"features":[],"model":"MDV0260","brand":"Garis","category":"Giá bát đĩa, thìa đũa vách hộp MDV2 màu Titan chính hãng","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"mdv0260-gia-bat-dia-thia-dua-vach-hop-ro-nan-oval-canh-keo-mdv0260","_addedBy":"vai-add-product"},"GD0470N":{"name":"Giá xoong nồi + bát đĩa, rổ nan oval, cánh mở hoặc kéo GD0470N","description":"Thiết kế thông minh với nhiều ngăn chứa rộng rãi, phù hợp với nhiều loại xoong nồi, bát đĩa khác nhau. MD04N không chỉ mang đến sự tiện lợi tối ưu mà còn góp phần tăng tính thẩm mỹ cho căn bếp hiện đại.","priceNum":3985200,"listPn":0,"salePn":3985200,"priceMode":"both","image":"https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%2C%20b%C3%A1t%20%C4%91%C4%A9a%20MD04N%20(1).jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20xoong%20n%E1%BB%93i%2C%20b%C3%A1t%20%C4%91%C4%A9a%20MD04N%20(1).jpg"],"specs":{},"features":[],"model":"GD0470N","brand":"Garis","category":"Giá xoong nồi + bát đĩa, rổ nan oval, cánh mở hoặc kéo GDN4","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gd0470n-gia-xoong-noi-bat-dia-ro-nan-oval-canh-mo-hoac-keo-gd0470n","_addedBy":"vai-add-product"},"GT0370AG":{"name":"Hệ khay chia thìa đũa độc lập GT0370AG","description":"Thanh chia có thể tháo rời, chỉnh khoảng cách linh hoạt Khung bằng nhôm hàng không AA (Aviation Aluminium) Đáy có tấm chống trơn trượt Tải trọng 25kg Bảo hành 24 tháng, bảo hành gì 20 năm","priceNum":4201200,"listPn":0,"salePn":4201200,"priceMode":"both","image":"https://garis.vn/uploaded/GT03_6AG%20(1).jpg","images":["https://garis.vn/uploaded/GT03_6AG%20(1).jpg"],"specs":{},"features":[],"model":"GT0370AG","brand":"Garis","category":"Hệ khay chia thìa đũa độc lập GTAG3","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gt0370ag-he-khay-chia-thia-dua-doc-lap-gt0370ag","_addedBy":"vai-add-product"},"GM0230E":{"name":"Giá dao thớt, gia vị, chai lọ, rổ nan dẹt cánh kéo GME230","description":"Giá dao thớt, chai lọ GM02.30E Nan dẹt, inox 304, bề mặt điện hóa xước mờ, dùng cho cánh kéo, ray giảm chấn hiệu quả, bền bỉ và sang trọng. Mua hàng chính hãng tại Garis Việt Nam!","priceNum":3996000,"listPn":0,"salePn":3996000,"priceMode":"both","image":"https://garis.vn/uploaded/Gi%C3%A1%20dao%20th%E1%BB%9Bt%2C%20chai%20l%E1%BB%8D%20GM02%2030E%20(3).jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20dao%20th%E1%BB%9Bt%2C%20chai%20l%E1%BB%8D%20GM02%2030E%20(3).jpg"],"specs":{},"features":["Giá dao thớt, chai lọ có hệ thống bắt mặt cánh tủ dạng 3D duy nhất trên thị trường. Điều này mang lại sự ổn định và độ chắc chắn cho giá dao thớt, chai lọ khi sử dụng.","Giá dao thớt, chai lọ đi kèm với rổ phụ gia vị có thể nhấc ra dễ dàng. Điều này giúp tiện lợi trong việc lấy và sắp xếp các chai lọ và phụ gia vị."],"model":"GM0230E","brand":"Garis","category":"Giá dao thớt, gia vị, chai lọ, rổ nan dẹt, cánh kéo","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gm0230e-gia-dao-thot-gia-vi-chai-lo-ro-nan-det-canh-keo-gme230","_addedBy":"vai-add-product"},"GKE225001":{"name":"Giá gia vị, chai lọ, rổ nan dẹt, cánh kéo GKE225","description":"Giá gia vị, chai lọ GK02.30E (new) thiết kế thông minh, tiện ích, chất liệu cao cấp, giúp sắp xếp gọn gàng, tối ưu không gian bếp hiện đại.","priceNum":3942000,"listPn":0,"salePn":3942000,"priceMode":"both","image":"https://garis.vn/uploaded/GK02_25E%201.jpg","images":["https://garis.vn/uploaded/GK02_25E%201.jpg"],"specs":{},"features":[],"model":"GKE225001","brand":"Garis","category":"Giá gia vị, chai lọ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gke225001-gia-gia-vi-chai-lo-ro-nan-det-canh-keo-gke225","_addedBy":"vai-add-product"},"EV80":{"name":"Giá Bát Đĩa Đa Năng Euplus Inox 304, Nan Vuông EV80","description":"Nội dung chính\nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở Đặc điểm nổi bật : \nGiá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở\nGiá bát đĩa đa năng Euplus EV Inox 304 xước mờ cánh mở nan vuông  là  Phụ kiện tủ bế p  được nhập khẩu chính hãng từ thương hiệu nổi tiếng Euplus. Thiết kế của sản phẩm tuy đơn giản nhưng rất sang trọng và hiện đại, nổi bật với các thanh inox sáng bóng không tì vết.\nĐặc điểm nổi bật :\nChất liệu làm bằng inox nan theo tiêu chuẩn Nhật Bản JIS G4303 cao cấp chống gỉ bền bỉ theo thời gian.\nSàn để úp bát đĩa tiện dụng, có thể dùng đề đồ khô và các vật dụng khác trong không gian bếp\nCó khay hứng nước để khi úp trực tiếp xoong nồi ướt nước không bị rây ra ngoài, khay hứng nước được tháo lắp dễ dàng.\nTích hợp bộ ray giảm chấn có tác dụng đóng mở nhẹ nhàng, không gây tiếng ồn.","priceNum":2937000,"listPn":0,"salePn":2937000,"priceMode":"both","image":"https://euplus.com.vn/wp-content/uploads/2021/03/BAT-DA-NANG-1.jpg","images":["https://euplus.com.vn/wp-content/uploads/2021/03/BAT-DA-NANG-1.jpg"],"specs":{"Bảo hành":"20 năm rỉ rổ và bảo hành khác 2 năm","Thương hiệu":"EUPLUS","Xuất xứ":"Việt Nam","Kích thước":"800mm"},"features":["Thông số kỹ thuật","Đánh giá (0)","Giá bát đĩa đa năng Euplus EV Inox 304 điện hóa xước mờ, nan vuông, dùng cho cánh mở Đặc điểm nổi bật :","Chất liệu làm bằng inox nan theo tiêu chuẩn Nhật Bản JIS G4303 cao cấp chống gỉ bền bỉ theo thời gian.","Sàn để úp bát đĩa tiện dụng, có thể dùng đề đồ khô và các vật dụng khác trong không gian bếp","Có khay hứng nước để khi úp trực tiếp xoong nồi ướt nước không bị rây ra ngoài, khay hứng nước được tháo lắp dễ dàng.","Tích hợp bộ ray giảm chấn có tác dụng đóng mở nhẹ nhàng, không gây tiếng ồn."],"model":"EV80","brand":"EUPLUS","category":"Giá Để Xoong Nồi Chén Dĩa","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"ev80-gia-bat-dia-da-nang-euplus-inox-304-nan-vuong-ev80","_addedBy":"vai-add-product"},"EV180":{"name":"Giá bát nâng hạ 800mm Euplus EV180","description":"Giá bát nâng hạ 800mm Euplus EV.180 \nMÔ TẢ SẢN PHẨM \n+ Chất liệu : Inox SUS304, tiêu chuẩn Nhật Bản JIS G4305\n+ Kích thước : 765*300*650\n+  Màu sắc : Inox\n+ Tải trọng: 12kg (6kg/tầng)\n+ Bảo hành sản phẩm 24 tháng, bảo hành hoen gỉ 15 năm\nXem thêm: Phụ kiện bếp Euplus – Hotline: 0988 078 900 \nGiá bát đĩa nâng hạ Euplus nan vuông – Chất lượng đảm bảo – Không lo về giá!\nGiá bát đĩa nâng hạ Euplus  là dòng sản phẩm được đại đa số người tiêu dùng lựa chọn với thương hiệu đã được khẳng định trên thị trường, chi phí vô cùng hợp lý và dịch vụ bảo hành nhanh chóng, chuyên nghiệp.\nPhụ kiện bếp hiện đại  không chỉ mang lại cho bạn sự tiện lợi mà còn giúp “nâng tầm đẳng cấp” cho căn bếp nhà bạn.  Giá bát đĩa nâng hạ  là một trong Top 11 những phụ kiện tủ bếp thông minh được người tiêu dùng lựa chọn nhiều nhất cho tủ bếp gia đình.\nGiá bát đĩa nâng hạ Euplus nan vuông sẽ mang lại cho bạn những trải nghiệm tuyệt vời nhất trong chính căn bếp nhà mình bởi tính năng tiện dụng, thiết kế chắc chắn nhưng cũng không kém phần đẹp mắt; kèm theo đó còn có những chính sách khuyến mại và bảo hành hấp dẫn.\nThiết kế giá bát đĩa nâng hạ 2 tầng thông thoáng \nSản phẩm được thiết kế với 2 sàn đựng chuyên biệt. Sàn dưới thiết kế nan chữ V ngược úp đĩa gọn gàng, tiện lợi. Sàn trên thiết kế nan thông thoáng giúp việc úp bát dễ dàng hơn, không bị đọng nước hay ẩm ướt.\nChất liệu Inox 304 bền đẹp, trường tồn với thời gian \nGiá bát đĩa nâng hạ  Euplus nan vuông được làm từ chất liệu inox 304 theo tiêu chuẩn Nhật Bản JISG4303, khẳng định chất lượng bền bỉ, trường tồn với thời gian.\nCơ cấu giảm chấn thông minh \nBạn sẽ không còn lo lắng bát đĩa bị va chạm mỗi khi nâng lên hay hạ xuống. Cơ cấu giảm chấn luôn hoạt động một cách hiệu quả giúp bát đĩa luôn ổn định khi nâng hạ, sắp xếp.\n2 nút trợ lực thiết kế linh hoạt \nSản phẩm có tải trọng 12kg rất vững chãi và chắc chắn, bạn có thể điều chỉnh 2 nút ở hai bên của bộ cơ cấu để tăng mức trợ lực từ 5 – 12kg.\nKhay nhựa đựng nước và ngăn để đĩa tiện dụng \nSản phẩm được thiết kế bởi 2 khay đựng nước cho 2 tầng trên và dưới, giúp bát đĩa nhà bạn luôn khô ráo, sạch sẽ. Ngăn để bát đĩa được thiết kế bởi chất liệu Inox cao cấp cực bền bỉ, nỗi lo rỉ sét sẽ không còn tồn tại với các bà nội trợ.\nPhụ kiện nhập khẩu chính hãng \nEuplus  là nhãn hàng phụ kiện bếp nổi tiếng và lâu đời chuyên cung cấp các sản phẩm chất lượng với mức giá hợp lý.\nMột vài lưu ý khi sử dụng giá bát đĩa nâng hạ \nNên vệ sinh định kỳ để giữ được sản phẩm inox luôn trắng sáng và kéo dài thời gian sử dụng cho sản phẩm.\nNên vệ sinh lau chùi bề mặt inox bằng những sản phẩm tẩy rửa chuyên dụng để tránh sự ăn mòn gây tổn hại đến bề mặt inox.\nKhông nên để nhiều bát đĩa bị quá so với trọng lượng tối đa của giá bát.","priceNum":8013000,"listPn":0,"salePn":8013000,"priceMode":"both","image":"https://grob-vn.com/wp-content/uploads/2025/10/Gia-bat-nang-ha-Euplus.jpg","images":["https://grob-vn.com/wp-content/uploads/2025/10/Gia-bat-nang-ha-Euplus.jpg"],"specs":{"Chất liệu":"Inox SUS304, tiêu chuẩn Nhật Bản JIS G4305","Kích thước":"765*300*650","Màu sắc":"Inox","Tải trọng":"12kg (6kg/tầng)"},"features":["Giá bát đĩa nâng hạ Euplus nan vuông được làm từ chất liệu inox 304 theo tiêu chuẩn Nhật Bản JISG4303, khẳng định chất lượng bền bỉ, trường tồn với thời gian.","Sản phẩm có tải trọng 12kg rất vững chãi và chắc chắn, bạn có thể điều chỉnh 2 nút ở hai bên của bộ cơ cấu để tăng mức trợ lực từ 5 – 12kg."],"model":"EV180","brand":"Euplus","category":"Giá bát nâng hạ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"ev180-gia-bat-nang-ha-800mm-euplus-ev180","_addedBy":"vai-add-product"},"GD0260E":{"name":"Giá bát đĩa, rổ nan dẹt, cánh kéo GD0260E","description":"Giá bát đĩa đa năng GD02E tích hợp thiết kế đa năng, GD02E không chỉ giúp sắp xếp bát đĩa gọn gàng mà còn phù hợp để lưu trữ các vật dụng bếp khác như ly, chén, hoặc nồi nhỏ","priceNum":3326400,"listPn":0,"salePn":3326400,"priceMode":"both","image":"https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%20%C4%91a%20n%C4%83ng%20GD02E%20(4).jpg","images":["https://garis.vn/uploaded/Gi%C3%A1%20b%C3%A1t%20%C4%91%C4%A9a%20%C4%91a%20n%C4%83ng%20GD02E%20(4).jpg"],"specs":{},"features":[],"model":"GD0260E","brand":"Giá bát đĩa, rổ nan dẹt, cánh kéo GD0260E","category":"Giá bát đĩa đa năng","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gd0260e-gia-bat-dia-ro-nan-det-canh-keo-gd0260e","_addedBy":"vai-add-product"},"GTP0370":{"name":"Khay chia ngăn kéo nhựa cao cấp GTP0370","description":"Khay chia nhựa cao cấp GT03 màu xám Dùng đặt trong ngăn kéo tủ bếp, để dao, thìa, dĩa và dụng cụ nhà bếp. Hàng Garis chính hãng, giá tốt nhất!","priceNum":972000,"listPn":0,"salePn":972000,"priceMode":"both","image":"https://garis.vn/uploaded/Khay%20chia%20nh%E1%BB%B1a%20cao%20c%E1%BA%A5p%20GT03%20(3).jpg","images":["https://garis.vn/uploaded/Khay%20chia%20nh%E1%BB%B1a%20cao%20c%E1%BA%A5p%20GT03%20(3).jpg"],"specs":{},"features":[],"model":"GTP0370","brand":"Garis","category":"Khay chia nhựa ABS cao cấp ","category_slug":"san-pham-them-moi","category_icon":"fa-box","slug":"gtp0370-khay-chia-ngan-keo-nhua-cao-cap-gtp0370","_addedBy":"vai-add-product"},"C112170":{"name":"C112170 | Grob | Giá Bát Nâng Hạ Nan Dẹt, Inox Xước Mờ Sus304 - cánh/phủ bì 112mm, lọt lòng 565mm","priceNum":10643000,"description":"GIÁ BÁT NÂNG HẠ NAN DẸT, INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"665*300*650 mm","Kích thước cánh/phủ bì":"112 mm","Khoang tủ/chiều rộng tủ":"112 mm","Kích thước lọt lòng/thực tế phụ kiện":"112 mm","Quy cách (Rộng x Sâu x Cao)":"R665 * S300 * C650 mm","kich_thuoc":"665 x 300 x 650mm","khoang_tu":"700mm"},"features":[],"images":["https://hsn.vn/images/stories/virtuemart/product/resized/gia-bat-dia-nang-ha-grob-gv304-170_300x0.jpg"],"image":"https://hsn.vn/images/stories/virtuemart/product/resized/gia-bat-dia-nang-ha-grob-gv304-170_300x0.jpg"},"GV304170":{"name":"GV304170 | Grob | Giá Bát Nâng Hạ Nan Dẹt, Inox Xước Mờ Sus304 - cánh/phủ bì 700mm, lọt lòng 665mm","priceNum":10643000,"description":"GIÁ BÁT NÂNG HẠ NAN DẸT, INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"665*300*650 mm","Khoang tủ":"700 mm","Kích thước cánh/phủ bì":"700 mm","Khoang tủ/chiều rộng tủ":"700 mm","Kích thước lọt lòng/thực tế phụ kiện":"700 mm","Quy cách (Rộng x Sâu x Cao)":"R665 * S300 * C650 mm","kich_thuoc":"665 x 300 x 650mm","khoang_tu":"700mm"},"features":[],"images":["https://hsn.vn/images/stories/virtuemart/product/resized/gia-bat-dia-nang-ha-grob-gv304-170_300x0.jpg"],"image":"https://hsn.vn/images/stories/virtuemart/product/resized/gia-bat-dia-nang-ha-grob-gv304-170_300x0.jpg"},"CS30471":{"name":"CS30471 | Grob | Kệ Đựng Xoong Nồi Nan Vuông Inox Xước Mờ Sus304 - cánh/phủ bì 700mm, lọt lòng 664mm","priceNum":2930000,"description":"KỆ ĐỰNG XOONG NỒI NAN VUÔNG INOX XƯỚC MỜ SUS304","specs":{"Xuất xứ":"Trung Quốc","Bảo hành":"Bảo hành sản phẩm 24 tháng, rổ inox SUS304 bảo hành hoen gỉ vĩnh viễn, xuất xứ: Trung Quốc","Kích thước":"664*500*250 mm","Khoang tủ":"700 mm","Kích thước cánh/phủ bì":"700 mm","Khoang tủ/chiều rộng tủ":"700 mm","Kích thước lọt lòng/thực tế phụ kiện":"700 mm","Quy cách (Rộng x Sâu x Cao)":"R664 * S500 * C250 mm","kich_thuoc":"664 x 500 x 250mm","khoang_tu":"700mm"},"features":[],"images":["https://www.grobhcm.com/wp-content/uploads/2024/09/KE-CHEN-DIA-INOX-304-NAN-VUONG-GROB-800x533.jpg"],"image":"https://www.grobhcm.com/wp-content/uploads/2024/09/KE-CHEN-DIA-INOX-304-NAN-VUONG-GROB-800x533.jpg"}},"bigsale":[{"code":"TL869IMAX","name":"Bếp Từ Canzy CZTL869IMAX","category":"Bếp Từ Canzy CZ","price":"14.980.000","bigsale":"6.200.000","discount":"59%","status":"TỰ ĐỘNG","qty":1,"image":"https://bizweb.dktcdn.net/100/344/152/products/untitled-27fd9035-294f-4172-b3d3-5022f861d51b.png"},{"code":"SMI6ZCS16E","name":"MÁY RỬA CHÉN ÂM TỦ BOSCH SMI6ZCS16E","category":"Máy rửa chén","price":"46.750.000","bigsale":"24.500.000","discount":"48%","status":"TỰ ĐỘNG","qty":1,"image":"https://boschs.com.vn/wp-content/uploads/2025/02/fef-Sao-chep.jpg"},{"code":"BD-1054HVOW","name":"Máy giặt Hitachi Inverter 10.5 kg BD-1054HVOW","category":"Máy giặt / sấy","price":"10.990.000","bigsale":"5.990.000","discount":"45%","status":"TỰ ĐỘNG","qty":1,"image":"https://cdnv2.tgdd.vn/mwg-static/dmx/Products/Images/1944/357869/may-giat-hitachi-inverter-105-kg-bd-1054hvow-1-638962219289827806.jpg"}],"combo":[{"name":"CZ D7OOB | Canzy | Máy hú + CZ IIQAM Serial 8.0 | Can","price":"9990000","items":[{"name":"CZ D7OOB | Canzy | Máy hút mùi âm tủ","sku":"CZD7OOB","price":5350000,"image":"https://huggingface.co/spaces/bep40/V.AISTUDIO/resolve/main/canzy_products_img/canzy_product_CZD7OOB.jpg"},{"name":"CZ IIQAM Serial 8.0 | Canzy | Máy rửa bát","sku":"CZIIQAMSerial80","price":18980000,"image":"https://huggingface.co/spaces/bep40/V.AISTUDIO/resolve/main/canzy_products_img/canzy_product_CZIIQAMSerial80.jpg"}]}]} \ No newline at end of file diff --git a/public/share/og-image.png b/public/share/og-image.png deleted file mode 100644 index 90bf082850d448ca9b84673e05feb76cb6ba7249..0000000000000000000000000000000000000000 --- a/public/share/og-image.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19cdbc5d1db636f590f7e22a480e88a3d81a0d81d91139b59ba40dde9048315c -size 984948 diff --git a/repo/rebuild.py b/repo/rebuild.py deleted file mode 100644 index 3601634be03871ddad80434fb181b56124648953..0000000000000000000000000000000000000000 --- a/repo/rebuild.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 -import subprocess, os, re -from pathlib import Path - -HF_TOKEN = os.environ.get("HF_TOKEN", "") -REPO = "bep40/VSEARCH" -CLONE = "/repo" -SPACE_URL = "https://huggingface.co/spaces/" -HEADERS = {"Authorization": f"Bearer {HF_TOKEN}"} - -def run(cmd, **kw): - return subprocess.run(cmd, shell=True, cwd=CLONE, check=True, - capture_output=True, text=True, env={**os.environ, "HF_TOKEN": HF_TOKEN}) - -Path(CLONE).mkdir(parents=True, exist_ok=True) -if not Path(CLONE).exists() or not Path(CLONE, ".git").exists(): - run("git clone -q --filter=blob:none --depth 1 " + SPACE_URL + REPO + " " + CLONE) -os.chdir(CLONE) -print("install:", run("npm install --silent --no-audit --no-fund").stdout[-200:]) -build = run("npm run build") -print("build:", build.stdout[-400:]) -import re as re2 -html = Path(CLONE, "index.html").read_text() -assets = {} -for key in ("src", "href"): - for m in re2.finditer(rf"(?:{key})=\"([^\"]+)\"", html): - url = m.group(1).split("?")[0] - assets[url] = None -print("index.html references:", assets) - -# Upload via REST upload_file to avoid git auth prompts -import urllib.request -import urllib.parse -import json - -def hf_upload(path_in_repo, path_or_fileobj): - url = f"https://huggingface.co/api/spaces/{REPO}/upload_file" - q = urllib.parse.urlencode({"create_pr": False, "revision": "main", "commit_message": "Upload rebuilt static asset"}) - body = b"" - if isinstance(path_or_fileobj, str): - body = open(path_or_fileobj, "rb").read() - else: - body = path_or_fileobj.read() - data = urllib.parse.urlencode({"path_in_repo": path_in_repo}).encode() - data = data + b"&content=" + urllib.parse.quote(body) - req = urllib.request.Request(url + "?" + q, data=data, headers={"Authorization": HEADERS["Authorization"], "Content-Type": "application/x-www-form-urlencoded"}) - with urllib.request.urlopen(req) as resp: - return json.loads(resp.read()) - -for url in sorted(assets): - local = Path(CLONE, url) - if not local.exists(): - raise SystemExit("missing asset: " + url) - hf_upload(url, str(local)) - print("uploaded:", url, local.stat().st_size) -print("ALL_OK") diff --git a/scripts/gen-thumbnail.py b/scripts/gen-thumbnail.py deleted file mode 100644 index f97f0c0923de036223ea6da880b24db05b69b2ac..0000000000000000000000000000000000000000 --- a/scripts/gen-thumbnail.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python3 -""" -Generate the social-share thumbnail for the semantic-image-field Space. - -Always the CURRENT 12 newest photographs: 8 newest interiors (by created_at) -from bep40/vai-avatar2-interior + 4 newest added products (by _added_at) -from bep40/grob-products-updated. Composed as a 4x3 grid at 1200x675 (2:1 -social-card crop). Written to BOTH public/ and dist/ so whichever path the -static Space serves, the resolved URL exists. - -Intended to run from a scheduled HF job (or locally) BEFORE the catalogue -sync commits, so the committed thumbnail is refreshed at least as often as -the mirror itself. -""" -import io, json, os, sys, urllib.request - -INTERIOR_INDEX = "https://huggingface.co/datasets/bep40/vai-avatar2-interior/resolve/main/index.json" -INTERIOR_API = "https://bep40-vai-avatar2-interior-api.hf.space" -PRODUCTS_URL = "https://huggingface.co/datasets/bep40/grob-products-updated/resolve/main/products_url_added.json" -N_INTERIORS = 8 -N_PRODUCTS = 4 -W, H = 1200, 675 -GAP = 6 -COLS, ROWS = 4, 3 -BG = (17, 20, 28) - -UA = {"User-Agent": "V.AI-STUDIO-thumbnail/1.0"} - -def fetch_json(url, timeout=25): - req = urllib.request.Request(url, headers=UA) - with urllib.request.urlopen(req, timeout=timeout) as r: - return json.loads(r.read().decode("utf-8")) - -def fetch_bytes(url, timeout=25): - req = urllib.request.Request(url, headers=UA) - with urllib.request.urlopen(req, timeout=timeout) as r: - return r.read() - -def main(): - from PIL import Image - interiors = fetch_json(INTERIOR_INDEX) - products = fetch_json(PRODUCTS_URL) - - dated = [r for r in interiors - if isinstance(r, dict) and isinstance(r.get("created_at"), str) - and r.get("created_at") and r.get("image_id")] - dated.sort(key=lambda r: r["created_at"], reverse=True) - top_i = dated[:N_INTERIORS] - - prods = [p for p in products - if isinstance(p, dict) and isinstance(p.get("_added_at"), str) - and p.get("_added_at") and (p.get("imgs") or p.get("i"))] - prods.sort(key=lambda p: str(p["_added_at"]), reverse=True) - top_p = prods[:N_PRODUCTS] - - urls = [f"{INTERIOR_API}/image/{r['image_id']}.jpg" for r in top_i] - urls += [(p.get("imgs") or [p.get("i")])[0] for p in top_p] - - cell_w = (W - GAP * (COLS - 1)) // COLS - cell_h = (H - GAP * (ROWS - 1)) // ROWS - - canvas = Image.new("RGB", (W, H), BG) - cells = [] - for u in urls: - try: - data = fetch_bytes(u) - im = Image.open(io.BytesIO(data)) - if im.mode not in ("RGB", "RGBA"): - im = im.convert("RGB") - if im.mode == "RGBA": - im = im.convert("RGB") - cells.append(im) - except Exception as e: - print(f"skip {u[:80]}: {e}", file=sys.stderr) - - if not cells: - print("FATAL: no images could be fetched", file=sys.stderr) - sys.exit(1) - - idx = 0 - for row in range(ROWS): - for col in range(COLS): - if idx >= len(cells): - break - im = cells[idx] - idx += 1 - iw, ih = im.size - scale = max(cell_w / iw, cell_h / ih) - sw, sh = max(1, round(iw * scale)), max(1, round(ih * scale)) - im2 = im.resize((sw, sh), Image.LANCZOS) - left = (sw - cell_w) // 2 - top = (sh - cell_h) // 2 - im2 = im2.crop((left, top, left + cell_w, top + cell_h)) - canvas.paste(im2, (col * (cell_w + GAP), row * (cell_h + GAP))) - - out = io.BytesIO() - canvas.save(out, format="PNG", optimize=True) - png = out.getvalue() - - os.makedirs("public/share", exist_ok=True) - os.makedirs("dist/share", exist_ok=True) - for path in ("public/share/og-image.png", "dist/share/og-image.png"): - with open(path, "wb") as f: - f.write(png) - print(f"OK wrote {len(png)} bytes {W}x{H} from {len(cells)} images") - -if __name__ == "__main__": - main() diff --git a/scripts/refresh-catalogue.mjs b/scripts/refresh-catalogue.mjs deleted file mode 100644 index 21e96c7688179ae6c8c2dba8473e13654db0785b..0000000000000000000000000000000000000000 --- a/scripts/refresh-catalogue.mjs +++ /dev/null @@ -1,415 +0,0 @@ -#!/usr/bin/env node -/** - * Refresh the vai-avatar product mirror inside the Space repo, build, and commit. - * - * The Space is `sdk: static`: there is no server that builds at request time, - * so the ONLY way a vai-avatar change reaches the browser is if the bytes under - * dist/ are regenerated and committed. That is this script's reason to exist. - * - * Intended to run from an HF scheduled job: - * - * npm run refresh:catalogue - * - * It is deliberately idempotent: if vai-avatar has not changed, nothing is - * committed or pushed, so the Space is not rebuilt pointlessly. - * - * Failure policy: every step is checked, and a failure aborts BEFORE pushing. - * The previously committed mirror therefore keeps serving. A half-written or - * empty catalogue is far worse than a slightly stale one. - */ - -import { execFileSync } from 'node:child_process'; -import { closeSync, existsSync, openSync, readFileSync, readSync, rmSync, statSync, writeFileSync } from 'node:fs'; - -const REPO = process.env.SPACE_REPO || 'bep40/semantic-image-field'; -const CLONE = process.env.CLONE_DIR || '/tmp/space'; - -/** - * The bundle names vite.config.js is configured to emit. - * - * Kept in step with `build.rollupOptions.output`, where entryFileNames and - * assetFileNames both produce "index". The build is what makes them exist, which - * is why the swap below happens only after it has run. - */ -const STABLE_BUNDLE = 'assets/index.js'; -const STABLE_STYLE = 'assets/app.css'; - -/** The two mirrored files, in both the source and the served location. */ -const MIRROR = ['products.json', 'promos.json']; - -/** - * Everything this script is allowed to commit. - * - * An explicit path list rather than `git add -A`, and that is the single most - * important safety property of this file. `.gitattributes` routes - * products-index.json, products-gallery.json and dist/products-gallery.json - * through git-lfs. The clone is a shallow `--depth 1` fetch; if the environment - * has no git-lfs binary the smudge filter never runs and those files check out - * as ~130-byte pointer text. `git add -A` would then stage the pointers and the - * push would replace committed LFS objects with text — permanent, silent data - * loss on the Hub, committed by a script that reported success. - * - * None of the paths below can be an LFS pointer, so a missing git-lfs no longer - * has to be fatal: it only means the build output is unverifiable, not that the - * mirror is unsafe to publish. - * - * `dist/catalogue` is here and not merely `public/catalogue` because of WHAT THE - * BROWSER ACTUALLY FETCHES. Vite copies public/ into outDir/, so the bytes are - * served from dist/catalogue/products.json — and that is the only place they - * exist: there is no /catalogue/ at the Space root, because the Space serves - * its root index.html rather than app.html, so nothing lands outside dist/. - * - * catalogue.js candidateURLs() resolves against the bundle at dist/assets/, and - * the `../catalogue/…` candidate lands exactly on dist/catalogue/. (The - * `../../…` candidate that precedes it lands on /catalogue/, which does not - * exist, so it 404s first — a wasted request, then the dist/ form answers. The - * ordering is worth knowing but not worth depending on.) - * - * Committing only the source copy would stage the new mirror, commit the new - * bundle, print REFRESH_OK — and still 404 at runtime, because the copy that is - * served was never pushed. That is a silent failure with no error anywhere, and - * it is exactly the "sửa sp không đồng bộ" symptom. - */ -const COMMITTABLE = ['index.html', 'public/catalogue', 'dist/catalogue', 'dist/assets', 'dist/share', 'public/share']; - -const ok = message => console.log(`[refresh] ${message}`); -const warn = message => console.warn(`[refresh] WARNING: ${message}`); - -/** Run a command in the clone. Throws with the captured stderr attached. */ -function run(command, args, { cwd = CLONE } = {}) { - return execFileSync(command, args, { - cwd, - encoding: 'utf8', - stdio: ['ignore', 'pipe', 'pipe'], - maxBuffer: 64 * 1024 * 1024, - }); -} - -const shell = (script, cwd = CLONE) => run('bash', ['-lc', script], { cwd }); - -/** - * The token goes into an Authorization header rather than the remote URL. - * Embedding it in https://user:TOKEN@huggingface.co persists it in - * .git/config and can leak it into reflogs and trace output. - */ -function git(...args) { - return run( - 'git', - ['-c', `http.extraheader=Authorization: Bearer ${process.env.HF_TOKEN}`, ...args], - ); -} - -/** - * Is git-lfs installed at all? (The smudge filter can only exist after - * `git lfs install`, so availability is checked on the binary first, then - * the clone-local filter is (re)wired with `git lfs install --local`.) - */ -function hasGitLfsBinary() { - try { - return Boolean(shell('git lfs version 2>/dev/null || true').trim()); - } catch { - return false; - } -} - -/** Is git-lfs BOTH installed AND wired as a smudge filter for this clone? */ -function hasGitLfs() { - try { - if (!hasGitLfsBinary()) return false; - return Boolean(shell('git config --get filter.lfs.smudge || true').trim()); - } catch { - return false; - } -} - -/** Is this a git-lfs pointer rather than real content? */ -function isLfsPointer(path) { - let handle; - try { - handle = openSync(path, 'r'); - const buffer = Buffer.alloc(256); - const read = readSync(handle, buffer, 0, 256, 0); - return buffer.subarray(0, read).toString('utf8') - .startsWith('version https://git-lfs.github.com/spec/v1'); - } catch { - return false; - } finally { - if (handle !== undefined) { try { closeSync(handle); } catch { /* already gone */ } } - } -} - -/** Size of `relative`, or null if it is missing, tiny, or an LFS pointer. */ -function realSize(relative) { - const path = `${CLONE}/${relative}`; - if (!existsSync(path)) return null; - const size = statSync(path).size; - if (size < 256 || isLfsPointer(path)) return null; - return size; -} - -/** - * Fail unless `relative` (resolved against the clone root) holds real content. - * - * `relative` must be a path from CLONE, not from dist/ — passing a bare filename - * here silently checks the wrong location, which is how a missing committed data - * file can pass as present. - */ -function requireRealFile(relative, { why }) { - const path = `${CLONE}/${relative}`; - if (!existsSync(path)) throw new Error(`${relative} is missing — ${why}`); - if (realSize(relative) === null) { - throw new Error( - `${relative} is a git-lfs pointer or a truncated file, not real content. ${why}`, - ); - } -} - -/** Parse a mirror file and report how many records it holds. */ -function recordCount(relative) { - const parsed = JSON.parse(readFileSync(`${CLONE}/${relative}`, 'utf8')); - if (Array.isArray(parsed)) return parsed.length; - return Object.keys(parsed?.productEdits ?? {}).length; -} - -/** True when index.html already names both stable assets. */ -function indexReferencesStable(html) { - return /\.\/dist\/assets\/index\.js\b/.test(html) - && /\.\/dist\/assets\/app\.css\b/.test(html); -} - -/** - * Point index.html at the freshly built bundle. - * - * This is load-bearing, not housekeeping. index.html is NOT a Vite input (the - * input is app.html), so `vite build` never rewrites it — yet the build emits - * the STABLE names while index.html still names a hashed bundle from an earlier - * build. Those hashed files survive, because emptyOutDir is false precisely so - * the build cannot delete committed data. - * - * The result was a refresh that could not fail loudly: the new bundle was - * committed, the mirror was committed, the stale-but-present asset reference - * passed verification, and the script reported REFRESH_OK — while the Space - * kept serving the pre-fix JavaScript. The catalogue would update and the code - * reading it would not, which looks exactly like "sửa sp không đồng bộ" and - * survives every rebuild. - * - * So the swap is part of the refresh. It is idempotent: once index.html names - * the stable files, the regex matches them, the write is a no-op, and git sees - * no change. - */ -function repointIndexHtml() { - const path = `${CLONE}/index.html`; - const html = readFileSync(path, 'utf8'); - - // Already correct: leave the file untouched so git sees no change. - if (indexReferencesStable(html)) return false; - - // Only the asset reference is touched. Matching on the full "./dist/assets/" - // prefix means a hand-added link to something else in that directory (a - // vendored worker, say) is left alone rather than silently renamed. - let next = html.replace( - /(\.\/dist\/assets\/)index-[A-Za-z0-9_-]+\.js\b/g, - `$1${STABLE_BUNDLE.slice('assets/'.length)}`, - ); - next = next.replace( - /(\.\/dist\/assets\/)index-[A-Za-z0-9_-]+\.css\b/g, - `$1${STABLE_STYLE.slice('assets/'.length)}`, - ); - - // The rewrite matched nothing AND index.html is not already correct. That is - // the case this guard exists for: index.html names its bundle by some other - // scheme (a query string, a different directory, a hand-written